📄 particle.java
字号:
/* PARTICLE */
/* Part of the PSO project */
/* Dr Mark C. Sinclair, NPIC, Cambodia, v1.0, November 2006, mcs@ieee.org */
/* You may make use of this code for any purpose, but if you use it, */
/* you must cite the use: Sinclair, M.C., PSO Java Applet v1.0, */
/* http://uk.geocities.com/markcsinclair/pso.html, November, 2006 */
import java.util.*;
class Particle {
public Particle(Eval eval, double maxV, double c1, double c2, Random rnd) {
Contract.require("maxV > 0.0", maxV > 0.0);
Contract.require("0.0 < c1 <= 2.0", (c1 > 0.0) && (c1 <= 2.0));
Contract.require("0.0 < c2 <= 2.0", (c2 > 0.0) && (c2 <= 2.0));
this.eval = eval;
this.maxV = maxV;
this.c1 = c1;
this.c2 = c2;
this.rnd = rnd;
//initial position
x = new double[eval.getDim()];
for (int i=0; i<eval.getDim(); i++)
x[i] = eval.getXMin(i) +
(eval.getXMax(i) - eval.getXMin(i)) * rnd.nextDouble();
// best position
p = new double[eval.getDim()];
for (int i=0; i<eval.getDim(); i++)
p[i] = x[i];
// last position
q = new double[eval.getDim()];
for (int i=0; i<eval.getDim(); i++)
q[i] = x[i];
// initial velocity
v = new double[eval.getDim()];
for (int i=0; i<eval.getDim(); i++)
v[i] = 0.0;
// initial fitness
fit = eval.eval(x);
// best fitness
bestFit = fit;
}
public synchronized double getX(int idx) {
return(x[idx]);
}
public synchronized double getP(int idx) {
return(p[idx]);
}
public synchronized double getQ(int idx) {
return(q[idx]);
}
public synchronized double getV(int idx) {
return(v[idx]);
}
public synchronized double getFit() {
Contract.ensure("bestFit <= fit", bestFit <= fit);
return(fit);
}
public synchronized void update(double[] g) {
synchronized(g) {
Contract.require("g not null", g != null);
Contract.require("g.length valid", g.length == eval.getDim());
for (int i=0; i<eval.getDim(); i++) {
// update last position
q[i] = x[i];
// update velocity
double dv;
dv = c1 * rnd.nextDouble() * (p[i] - x[i]) +
c2 * rnd.nextDouble() * (g[i] - x[i]);
v[i] += dv;
v[i] = (v[i] < -maxV) ? -maxV : v[i];
v[i] = (v[i] > maxV) ? maxV : v[i];
// update current position
x[i] += v[i];
x[i] = (x[i] < eval.getXMin(i)) ? eval.getXMin(i) : x[i];
x[i] = (x[i] > eval.getXMax(i)) ? eval.getXMax(i) : x[i];
}
}
//update fitness
fit = eval.eval(x);
// update best position/fitness ?
if (fit < bestFit) {
for (int i=0; i<eval.getDim(); i++)
p[i] = x[i];
bestFit = fit;
}
}
public synchronized String toString() {
StringBuffer buf = new StringBuffer();
buf.append("Particle(").append(fit);
buf.append(",").append(bestFit);
buf.append(",x[").append(x[0]);
for (int i=1; i<eval.getDim(); i++)
buf.append(",").append(x[i]);
buf.append("],p[").append(p[0]);
for (int i=1; i<eval.getDim(); i++)
buf.append(",").append(p[i]);
buf.append("],v[").append(v[0]);
for (int i=1; i<eval.getDim(); i++)
buf.append(",").append(v[i]);
buf.append("])");
return(buf.toString());
}
private double[] x; // current position
private double[] p; // best position
private double[] q; // last position
private double[] v; // velocity
private double fit; // fitness
private double bestFit; // best fitness
private Eval eval;
private double maxV;
private double c1;
private double c2;
private Random rnd;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -