A simple BELBIC algorithm library for Java language .
The artifact is in the Maven repository so all you need to do is add it as a dependency in your project.
<dependency>
<groupId>com.github.gustavo053</groupId>
<artifactId>belbic4j</artifactId>
<version>1.0.0</version>
</dependency>
- Instance belbic controller:
Belbic belbic = new Belbic();
- Set the initial parameters for the algorithm:
belbic.initParams(Double alpha, Double beta, Double amygdalaValue, Double orbitofrontalCortexValue, Double weightAmygdala, Double weightOrbitofrontal);
These parameters must be adjusted for each issue (especially alpha and beta).
Generally, the initial values ​​of the amygdala and orbitofrontal cortex are set to zero so as not to influence learning algorithm.
- Incremental alpha and beta update:
belbic.setAlpha(Double alpha);
belbic.setBeta(Double beta);
- Set values for SI block and reward algorithm:
belbic.setSensoryInputValue(Double sensoryInputValue);
belbic.setRewValue(Double rewValue);
- Run the algorithm and get the control signal:
double u = belbic.run();
import core.Belbic;
import java.util.Arrays;
public class BelbicTestRun {
//amplifier
private static double ka = 10;
private static double taua = 0.1;
//exciter
private static double ke = 1;
private static double taue = 1;
//generator
private static double kg = 1;
private static double taug = 1;
//sensor
private static double kr = 1;
private static double taur = 0.06;
private static double tMax = 60;
private static double h = 0.01;
private static long nPoints = Math.round(tMax / h);
private static double uMax = 3.3;
private static double[] vRef = new double[Integer.parseInt(String.valueOf(nPoints))];
private static double[] vr = new double[Integer.parseInt(String.valueOf(nPoints))];
private static double[] vf = new double[Integer.parseInt(String.valueOf(nPoints))];
private static double[] vt = new double[Integer.parseInt(String.valueOf(nPoints))];
private static double[] vs = new double[Integer.parseInt(String.valueOf(nPoints))];
private static double[] ve = new double[Integer.parseInt(String.valueOf(nPoints))];
private static double[] uPlot = new double[Integer.parseInt(String.valueOf(nPoints))];
private static double[] ePlot = new double[Integer.parseInt(String.valueOf(nPoints))];
//private double[] tPlot;
static void amplifier(Integer i, Double u) {
vr[i] = vr[i - 1] + (h/taua) * (-vr[i - 1]) + ka * u;
}
static void exciter(Integer i) {
vf[i] = vf[i - 1] + (h/taue) * (-vf[i - 1] + ke * vr[i]);
}
static void generator(Integer i) {
vt[i] = vt[i - 1] + (h/taug) * (-vt[i - 1] + kg * vf[i]);
}
static Double sensor(Integer i) {
return vs[i] = vs[i - 1] + (h/taur) * (-vs[i - 1] + kr * vt[i]);
}
private static double eant = 0;
private static double iant = 0;
static Double pid(Double e) {
double kp = 3.38;
double ki = 0.58;
double kd = 0.63;
double iMax = 3.3;
double P = e * kp;
double I = iant + (ki * h) * (e + eant);
double D = (kd/h) * (e - eant);
if (I > iMax) {
I = iMax;
} else if (I <= 0) {
I = 0;
}
eant = e;
iant = I;
return P + I + D;
}
public static void main(String[] args) {
Arrays.fill(vRef, 2);
//belbic here
Belbic belbic = new Belbic();
belbic.initParams(0.45, 0.01, 0.0, 0.0, 0.81, 1.0);
for (int i = 1; i < nPoints; i++) {
ve[i] = vRef[i - 1] - vs[i - 1];
belbic.setAlpha(belbic.getAlpha() * h);
belbic.setBeta(belbic.getBeta() * h);
belbic.setSensoryInputValue(pid(ve[i]));
belbic.setRewValue(Math.abs(ve[i]));
double u = belbic.run();
if (u > uMax) {
u = uMax;
} else if (u < 0){
u = 0;
}
amplifier(i, u);
exciter(i);
generator(i);
double sensorValue = sensor(i);
System.out.println(sensorValue);
}
}
}