Implement several CLI params for PSO

Refactor PSO implementation
This commit is contained in:
Fabian Becker 2014-01-24 18:03:17 +01:00
parent d51fdc560e
commit b363e46ad1
5 changed files with 123 additions and 85 deletions

View File

@ -4,6 +4,7 @@ import com.google.gson.*;
import eva2.OptimizerFactory; import eva2.OptimizerFactory;
import eva2.optimization.OptimizationStateListener; import eva2.optimization.OptimizationStateListener;
import eva2.optimization.enums.DETypeEnum; import eva2.optimization.enums.DETypeEnum;
import eva2.optimization.enums.PSOTopologyEnum;
import eva2.optimization.go.InterfacePopulationChangedEventListener; import eva2.optimization.go.InterfacePopulationChangedEventListener;
import eva2.optimization.modules.OptimizationParameters; import eva2.optimization.modules.OptimizationParameters;
import eva2.optimization.operator.crossover.CrossoverESDefault; import eva2.optimization.operator.crossover.CrossoverESDefault;
@ -15,8 +16,6 @@ import eva2.optimization.operator.selection.SelectXProbRouletteWheel;
import eva2.optimization.operator.terminators.CombinedTerminator; import eva2.optimization.operator.terminators.CombinedTerminator;
import eva2.optimization.operator.terminators.FitnessValueTerminator; import eva2.optimization.operator.terminators.FitnessValueTerminator;
import eva2.optimization.population.Population; import eva2.optimization.population.Population;
import eva2.optimization.problems.AbstractOptimizationProblem;
import eva2.optimization.problems.AbstractProblemDouble;
import eva2.optimization.problems.AbstractProblemDoubleOffset; import eva2.optimization.problems.AbstractProblemDoubleOffset;
import eva2.optimization.strategies.DifferentialEvolution; import eva2.optimization.strategies.DifferentialEvolution;
import eva2.optimization.strategies.InterfaceOptimizer; import eva2.optimization.strategies.InterfaceOptimizer;
@ -493,15 +492,42 @@ public class Main implements OptimizationStateListener, InterfacePopulationChang
break; break;
} }
case "ParticleSwarmOptimization": { case "ParticleSwarmOptimization": {
opt.addOption("initialVelocity", true, "Initial Velocity"); double phi1 = 2.05, phi2 = 2.05, speedLimit = 0.1;
int topoRange = 2;
PSOTopologyEnum selectedTopology = PSOTopologyEnum.star;
opt.addOption("speedLimit", true, "Speed Limit"); opt.addOption("speedLimit", true, "Speed Limit");
opt.addOption("topology", true, "Particle Swarm Topology (0-7)"); opt.addOption("topology", true, "Particle Swarm Topology (0-7)");
opt.addOption("swarmRadius", true, "Radius of the Swarm");
opt.addOption("phi1", true, "Phi 1"); opt.addOption("phi1", true, "Phi 1");
opt.addOption("phi2", true, "Phi 2"); opt.addOption("phi2", true, "Phi 2");
opt.addOption("inertnessOrChi", true, "Inertness or Chi");
opt.addOption("algType", true, "Type of PSO");
/**
* Parse default options.
*/
try {
commandLine = cliParser.parse(opt, optimizerParams);
} catch (ParseException e) {
showHelp(opt);
System.exit(-1);
}
if (commandLine.hasOption("phi1")) {
phi1 = Double.parseDouble(commandLine.getOptionValue("phi1"));
}
if (commandLine.hasOption("phi2")) {
phi2 = Double.parseDouble(commandLine.getOptionValue("phi2"));
}
if (commandLine.hasOption("topology")) {
selectedTopology = PSOTopologyEnum.getFromId(Integer.parseInt(commandLine.getOptionValue("topology")));
}
if (commandLine.hasOption("speedLimit")) {
speedLimit = Double.parseDouble(commandLine.getOptionValue("speedLimit"));
}
this.optimizer = OptimizerFactory.createParticleSwarmOptimization(problem, this.populationSize, phi1, phi2, speedLimit, selectedTopology, topoRange, this);
break; break;
} }
case "EvolutionStrategies": { case "EvolutionStrategies": {
@ -537,6 +563,18 @@ public class Main implements OptimizationStateListener, InterfacePopulationChang
pc = 0.9; pc = 0.9;
} }
if (commandLine.hasOption("mu")) {
mu = Integer.parseInt(commandLine.getOptionValue("mu"));
}
if (commandLine.hasOption("lambda")) {
lambda = Integer.parseInt(commandLine.getOptionValue("lambda"));
}
if (commandLine.hasOption("plusStrategy")) {
plusStrategy = Boolean.parseBoolean(commandLine.getOptionValue("plusStrategy"));
}
this.optimizer = OptimizerFactory.createEvolutionStrategy(mu, lambda, plusStrategy, this.mutator, pm, this.crossover, pc, this.selection, problem, this); this.optimizer = OptimizerFactory.createEvolutionStrategy(mu, lambda, plusStrategy, this.mutator, pm, this.crossover, pc, this.selection, problem, this);
break; break;
} }

View File

@ -37,7 +37,7 @@ public enum PSOTopologyEnum {
* @param oldID * @param oldID
* @return * @return
*/ */
public static PSOTopologyEnum translateOldID(int oldID) { public static PSOTopologyEnum getFromId(int oldID) {
switch (oldID) { switch (oldID) {
case 0: case 0:
return linear; return linear;
@ -56,7 +56,7 @@ public enum PSOTopologyEnum {
case 7: case 7:
return dms; return dms;
default: default:
System.err.println("Error: invalid old topology ID in PSOTopologyEnum translateOldID! Returning grid."); System.err.println("Error: invalid old topology ID in PSOTopologyEnum getFromId! Returning grid.");
return grid; return grid;
} }
} }

View File

@ -151,7 +151,7 @@ public class DynamicParticleSwarmOptimization extends ParticleSwarmOptimization
//double[] rand = getUniformRandVect(position.length, range); //double[] rand = getUniformRandVect(position.length, range);
Mathematics.vvAdd(newPos, rand, newPos); Mathematics.vvAdd(newPos, rand, newPos);
if (m_CheckRange) { if (checkRange) {
Mathematics.projectToRange(newPos, range); Mathematics.projectToRange(newPos, range);
} }
@ -256,9 +256,9 @@ public class DynamicParticleSwarmOptimization extends ParticleSwarmOptimization
/* old ways /* old ways
curVelocity[i] = this.m_Inertness * velocity[i]; curVelocity[i] = this.m_Inertness * velocity[i];
curVelocity[i] += (this.m_Phi1 * getSpeedLimit(index) * (range[i][1] - range[i][0]) * RNG.randomDouble(-1., 1.)); curVelocity[i] += (this.phi1 * getSpeedLimit(index) * (range[i][1] - range[i][0]) * RNG.randomDouble(-1., 1.));
// the component from the social model // the component from the social model
curVelocity[i] += this.m_Phi2*RNG.randomDouble(0,1)*(localBestPos[i]-curPosition[i]); curVelocity[i] += this.phi2*RNG.randomDouble(0,1)*(localBestPos[i]-curPosition[i]);
*/ */
for (int i = 0; i < lastVelocity.length; i++) { for (int i = 0; i < lastVelocity.length; i++) {
@ -301,9 +301,9 @@ public class DynamicParticleSwarmOptimization extends ParticleSwarmOptimization
* @return a double value * @return a double value
*/ */
protected double getIndySocialModifier(int index, double chiVal) { protected double getIndySocialModifier(int index, double chiVal) {
return (this.m_Phi2 * chiVal * RNG.randomDouble(0, 1)); return (this.phi2 * chiVal * RNG.randomDouble(0, 1));
// if (index < 50) return (this.m_Phi2 * chi * RNG.randomDouble(0,1)); // if (index < 50) return (this.phi2 * chi * RNG.randomDouble(0,1));
// else return (this.m_Phi2 * chi * (-1.) * RNG.randomDouble(0,1)); // else return (this.phi2 * chi * (-1.) * RNG.randomDouble(0,1));
} }
/** /**
@ -315,12 +315,12 @@ public class DynamicParticleSwarmOptimization extends ParticleSwarmOptimization
@Override @Override
protected double getSpeedLimit(int index) { protected double getSpeedLimit(int index) {
if (index >= ((double) (m_Population.size() * highEnergyRatio))) { if (index >= ((double) (m_Population.size() * highEnergyRatio))) {
return m_SpeedLimit; return speedLimit;
} else { } else {
if (highEnergyRaise == 0.) { if (highEnergyRaise == 0.) {
return maxSpeedLimit; return maxSpeedLimit;
} else { } else {
return m_SpeedLimit * highEnergyRaise; return speedLimit * highEnergyRaise;
} }
} }
} }

View File

@ -1017,7 +1017,7 @@ public class NichePSO implements InterfaceAdditionalPopulationInformer, Interfac
// } // }
public void SetMainSwarmTopologyTag(int mainSwarmTopologyTag) { public void SetMainSwarmTopologyTag(int mainSwarmTopologyTag) {
// Possible topologies are: "Linear", "Grid", "Star", "Multi-Swarm", "Tree", "HPSO", "Random" in that order starting by 0. // Possible topologies are: "Linear", "Grid", "Star", "Multi-Swarm", "Tree", "HPSO", "Random" in that order starting by 0.
this.mainSwarmTopology = PSOTopologyEnum.translateOldID(mainSwarmTopologyTag); this.mainSwarmTopology = PSOTopologyEnum.getFromId(mainSwarmTopologyTag);
} }
public PSOTopologyEnum getMainSwarmTopology() { public PSOTopologyEnum getMainSwarmTopology() {

View File

@ -50,7 +50,7 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se
Object[] sortedPop = null; Object[] sortedPop = null;
protected AbstractEAIndividual m_BestIndividual = null; protected AbstractEAIndividual m_BestIndividual = null;
protected InterfaceOptimizationProblem m_Problem = new F1Problem(); protected InterfaceOptimizationProblem m_Problem = new F1Problem();
protected boolean m_CheckRange = true; protected boolean checkRange = true;
protected boolean checkSpeedLimit = false; protected boolean checkSpeedLimit = false;
protected boolean useAlternative = false; protected boolean useAlternative = false;
protected PSOTopologyEnum topology = PSOTopologyEnum.grid; protected PSOTopologyEnum topology = PSOTopologyEnum.grid;
@ -59,13 +59,13 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se
* constriction (using chi) * constriction (using chi)
*/ */
protected SelectedTag algType; protected SelectedTag algType;
protected int m_TopologyRange = 2; protected int topologyRange = 2;
protected double m_InitialVelocity = 0.2; protected double initialVelocity = 0.2;
protected double m_SpeedLimit = 0.1; protected double speedLimit = 0.1;
protected double m_Phi1 = 2.05; protected double phi1 = 2.05;
protected double m_Phi2 = 2.05; protected double phi2 = 2.05;
// for multi-swarm topology: radius of the swarm relative to the range // for multi-swarm topology: radius of the swarm relative to the range
protected double m_swarmRadius = 0.2; protected double swarmRadius = 0.2;
// for multi-swarm: maximum sub swarm size. zero means unlimited // for multi-swarm: maximum sub swarm size. zero means unlimited
protected int maxSubSwarmSize = 0; protected int maxSubSwarmSize = 0;
protected int minSubSwarmSize = 2; protected int minSubSwarmSize = 2;
@ -131,12 +131,12 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se
this.m_Population = (Population) a.m_Population.clone(); this.m_Population = (Population) a.m_Population.clone();
this.m_Problem = a.m_Problem; this.m_Problem = a.m_Problem;
this.m_Identifier = a.m_Identifier; this.m_Identifier = a.m_Identifier;
this.m_InitialVelocity = a.m_InitialVelocity; this.initialVelocity = a.initialVelocity;
this.m_SpeedLimit = a.m_SpeedLimit; this.speedLimit = a.speedLimit;
this.m_Phi1 = a.m_Phi1; this.phi1 = a.phi1;
this.m_Phi2 = a.m_Phi2; this.phi2 = a.phi2;
this.inertnessOrChi = a.inertnessOrChi; this.inertnessOrChi = a.inertnessOrChi;
this.m_TopologyRange = a.m_TopologyRange; this.topologyRange = a.topologyRange;
this.paramControl = (ParameterControlManager) a.paramControl.clone(); this.paramControl = (ParameterControlManager) a.paramControl.clone();
//this.setCheckSpeedLimit(a.isCheckSpeedLimit()); //this.setCheckSpeedLimit(a.isCheckSpeedLimit());
} }
@ -155,7 +155,7 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se
algType.setSelectedTag(1); // set to constriction algType.setSelectedTag(1); // set to constriction
m_Population = new Population(popSize); m_Population = new Population(popSize);
setPhiValues(p1, p2); setPhiValues(p1, p2);
m_TopologyRange = topoRange; topologyRange = topoRange;
topology = topo; topology = topo;
} }
@ -481,14 +481,14 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se
treeLevels = 0; treeLevels = 0;
// the HPSO tree will contain layers 0...HPSOLevels, the last one is "incomplete" with only HPSOOrphans number of nodes // the HPSO tree will contain layers 0...HPSOLevels, the last one is "incomplete" with only HPSOOrphans number of nodes
if (getTopology() == PSOTopologyEnum.hpso || getTopology() == PSOTopologyEnum.tree) { if (getTopology() == PSOTopologyEnum.hpso || getTopology() == PSOTopologyEnum.tree) {
if (m_TopologyRange < 2) { if (topologyRange < 2) {
System.err.println("Error, tree/hpso requires topology range of at least 2!"); System.err.println("Error, tree/hpso requires topology range of at least 2!");
} else { } else {
while (getMaxNodes(m_TopologyRange, treeLevels) < m_Population.size()) { while (getMaxNodes(topologyRange, treeLevels) < m_Population.size()) {
treeLevels++; treeLevels++;
} }
treeOrphans = m_Population.size() - getMaxNodes(m_TopologyRange, treeLevels - 1); treeOrphans = m_Population.size() - getMaxNodes(topologyRange, treeLevels - 1);
treeLastFullLevelNodeCnt = (int) Math.pow(m_TopologyRange, treeLevels - 1); treeLastFullLevelNodeCnt = (int) Math.pow(topologyRange, treeLevels - 1);
} }
} }
if (getTopology() == PSOTopologyEnum.dms) { if (getTopology() == PSOTopologyEnum.dms) {
@ -511,7 +511,7 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se
indy = (AbstractEAIndividual) pop.get(i); indy = (AbstractEAIndividual) pop.get(i);
if (indy instanceof InterfaceDataTypeDouble) { if (indy instanceof InterfaceDataTypeDouble) {
if (!externalInitialPop || (!defaultsDone(indy))) { if (!externalInitialPop || (!defaultsDone(indy))) {
initIndividualDefaults(indy, m_InitialVelocity); initIndividualDefaults(indy, initialVelocity);
} }
} }
indy.putData(indexKey, i); indy.putData(indexKey, i);
@ -602,7 +602,7 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se
} }
protected void resetIndividual(AbstractEAIndividual indy) { protected void resetIndividual(AbstractEAIndividual indy) {
resetIndividual(indy, m_InitialVelocity); resetIndividual(indy, initialVelocity);
plotIndy(((InterfaceDataTypeDouble) indy).getDoubleData(), null, (Integer) indy.getData(indexKey)); plotIndy(((InterfaceDataTypeDouble) indy).getDoubleData(), null, (Integer) indy.getData(indexKey));
} }
@ -666,7 +666,7 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se
} }
// enforce range constraints if necessary // enforce range constraints if necessary
if (m_CheckRange) { if (checkRange) {
ensureConstraints(curPosition, curVelocity, range); ensureConstraints(curPosition, curVelocity, range);
} }
@ -792,8 +792,8 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se
// if (algType.getSelectedTag().getID()==1) chi=inertnessOrChi; // if (algType.getSelectedTag().getID()==1) chi=inertnessOrChi;
// else chi = 1.; // else chi = 1.;
// //
// double scaleCog = this.m_Phi1*chi*RNG.randomDouble(0,1); // double scaleCog = this.phi1*chi*RNG.randomDouble(0,1);
// double scaleNei = this.m_Phi2*chi*RNG.randomDouble(0,1); // double scaleNei = this.phi2*chi*RNG.randomDouble(0,1);
// //
// //
// for (int i=0; i<lastVelocity.length; i++) { // for (int i=0; i<lastVelocity.length; i++) {
@ -808,16 +808,16 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se
// if (algType.getSelectedTag().getID()==1) chi=inertnessOrChi; // if (algType.getSelectedTag().getID()==1) chi=inertnessOrChi;
// else chi = 1.; // else chi = 1.;
// // the component from the cognition model // // the component from the cognition model
// //curVelocity[i] += this.m_Phi1*chi*RNG.randomDouble(0,1)*(personalBestPos[i]-curPosition[i]); // //curVelocity[i] += this.phi1*chi*RNG.randomDouble(0,1)*(personalBestPos[i]-curPosition[i]);
// double dir,diff; // double dir,diff;
// dir = (personalBestPos[i] < curPosition[i]) ? -1 : 1; // dir = (personalBestPos[i] < curPosition[i]) ? -1 : 1;
// diff = Math.abs((personalBestPos[i]-curPosition[i])); // diff = Math.abs((personalBestPos[i]-curPosition[i]));
// curVelocity[i] += this.m_Phi1*chi*.5*dir*Math.max(diff, .1); // curVelocity[i] += this.phi1*chi*.5*dir*Math.max(diff, .1);
// // the component from the social model // // the component from the social model
// //curVelocity[i] += this.m_Phi2*chi*RNG.randomDouble(0,1)*(neighbourBestPos[i]-curPosition[i]); // //curVelocity[i] += this.phi2*chi*RNG.randomDouble(0,1)*(neighbourBestPos[i]-curPosition[i]);
// dir = (neighbourBestPos[i]< curPosition[i]) ? -1 : 1; // dir = (neighbourBestPos[i]< curPosition[i]) ? -1 : 1;
// diff = Math.abs((neighbourBestPos[i]-curPosition[i])); // diff = Math.abs((neighbourBestPos[i]-curPosition[i]));
// curVelocity[i] += this.m_Phi2*chi*.5*dir*Math.max(diff, .1); // curVelocity[i] += this.phi2*chi*.5*dir*Math.max(diff, .1);
// } // }
double[] accel, curVelocity = new double[lastVelocity.length]; double[] accel, curVelocity = new double[lastVelocity.length];
@ -851,9 +851,9 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se
chi = 1.; chi = 1.;
} }
// the component from the cognition model // the component from the cognition model
accel[i] = this.m_Phi1 * chi * RNG.randomDouble(0, 1) * (personalBestPos[i] - curPosition[i]); accel[i] = this.phi1 * chi * RNG.randomDouble(0, 1) * (personalBestPos[i] - curPosition[i]);
// the component from the social model // the component from the social model
accel[i] += this.m_Phi2 * chi * RNG.randomDouble(0, 1) * (neighbourBestPos[i] - curPosition[i]); accel[i] += this.phi2 * chi * RNG.randomDouble(0, 1) * (neighbourBestPos[i] - curPosition[i]);
} }
return accel; return accel;
} }
@ -909,11 +909,11 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se
// //
// for (int i = 0; i < curPosition.length; i++) { // for (int i = 0; i < curPosition.length; i++) {
// // the component from the cognition model // // the component from the cognition model
// // accel[i] = this.m_Phi1*chi*/*RNG.randomDouble(0,1)**/cogRand.getElement(i); // // accel[i] = this.phi1*chi*/*RNG.randomDouble(0,1)**/cogRand.getElement(i);
// accel[i] = this.m_Phi1*chi*/*RNG.randomDouble(0,1)**/cogRandB.get(i,0); // accel[i] = this.phi1*chi*/*RNG.randomDouble(0,1)**/cogRandB.get(i,0);
// // the component from the social model // // the component from the social model
// // accel[i] += this.m_Phi2*chi*/*RNG.randomDouble(0,1)**/socRand.getElement(i); // // accel[i] += this.phi2*chi*/*RNG.randomDouble(0,1)**/socRand.getElement(i);
// accel[i] += this.m_Phi2*chi*/*RNG.randomDouble(0,1)**/socRandB.get(i,0); // accel[i] += this.phi2*chi*/*RNG.randomDouble(0,1)**/socRandB.get(i,0);
// } // }
// return accel; // return accel;
// } else { // } else {
@ -1045,7 +1045,7 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se
switch (topology) { switch (topology) {
case linear: case linear:
// linear // linear
for (int x = -this.m_TopologyRange; x <= this.m_TopologyRange; x++) { for (int x = -this.topologyRange; x <= this.topologyRange; x++) {
if (wrapTopology) { if (wrapTopology) {
tmpIndex = (index + x + pop.size()) % pop.size(); tmpIndex = (index + x + pop.size()) % pop.size();
} else { } else {
@ -1060,8 +1060,8 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se
case grid: case grid:
// grid // grid
int corner = 1 + (int) Math.sqrt(pop.size()); int corner = 1 + (int) Math.sqrt(pop.size());
for (int x = -this.m_TopologyRange; x <= this.m_TopologyRange; x++) { for (int x = -this.topologyRange; x <= this.topologyRange; x++) {
for (int y = -this.m_TopologyRange; y <= this.m_TopologyRange; y++) { for (int y = -this.topologyRange; y <= this.topologyRange; y++) {
tmpIndex = index + x + (y * corner); tmpIndex = index + x + (y * corner);
if (wrapTopology) { if (wrapTopology) {
tmpIndex = (tmpIndex + pop.size()) % pop.size(); // wrap the grid toroidal tmpIndex = (tmpIndex + pop.size()) % pop.size(); // wrap the grid toroidal
@ -1099,13 +1099,13 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se
sortedIndex = (Integer) ((AbstractEAIndividual) sortedPop[index]).getData(sortedIndexKey); sortedIndex = (Integer) ((AbstractEAIndividual) sortedPop[index]).getData(sortedIndexKey);
if (sortedIndex > 0) { // its found and its not the root. root has no parent to check for if (sortedIndex > 0) { // its found and its not the root. root has no parent to check for
k = getParentIndex(m_TopologyRange, sortedIndex, pop.size()); k = getParentIndex(topologyRange, sortedIndex, pop.size());
compareAndSetAttractor(localBestFitness, localBestPosition, (AbstractEAIndividual) sortedPop[k], useHistoric); compareAndSetAttractor(localBestFitness, localBestPosition, (AbstractEAIndividual) sortedPop[k], useHistoric);
} }
if (treeStruct == 1) { // loop all children if (treeStruct == 1) { // loop all children
if (isComplete(sortedIndex, pop.size())) { // the node has full degree if (isComplete(sortedIndex, pop.size())) { // the node has full degree
k = m_TopologyRange * sortedIndex + 1; // this is the offset of the nodes children k = topologyRange * sortedIndex + 1; // this is the offset of the nodes children
for (int i = 0; i < m_TopologyRange; i++) { for (int i = 0; i < topologyRange; i++) {
compareAndSetAttractor(localBestFitness, localBestPosition, (AbstractEAIndividual) sortedPop[k + i], useHistoric); compareAndSetAttractor(localBestFitness, localBestPosition, (AbstractEAIndividual) sortedPop[k + i], useHistoric);
} }
} else if (isIncomplete(sortedIndex, pop.size())) { // the node does not have full degree but might have orphans } else if (isIncomplete(sortedIndex, pop.size())) { // the node does not have full degree but might have orphans
@ -1129,7 +1129,7 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se
break; break;
case hpso: // Hierarchical PSO case hpso: // Hierarchical PSO
if (index >= 0) { if (index >= 0) {
k = getParentIndex(m_TopologyRange, index, pop.size()); k = getParentIndex(topologyRange, index, pop.size());
// compareAndSet(localBestFitness, localBestPosition, (AbstractEAIndividual)pop.get(k), useHistoric); // compareAndSet(localBestFitness, localBestPosition, (AbstractEAIndividual)pop.get(k), useHistoric);
indy = (AbstractEAIndividual) pop.get(k); indy = (AbstractEAIndividual) pop.get(k);
System.arraycopy((double[]) indy.getData(partBestFitKey), 0, localBestFitness, 0, localBestFitness.length); System.arraycopy((double[]) indy.getData(partBestFitKey), 0, localBestFitness, 0, localBestFitness.length);
@ -1137,8 +1137,8 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se
} }
break; break;
case random: // m_TopologyRange random informants, may be the same several times case random: // topologyRange random informants, may be the same several times
for (int i = 0; i < m_TopologyRange; i++) { for (int i = 0; i < topologyRange; i++) {
// select random informant // select random informant
indy = (AbstractEAIndividual) pop.get(RNG.randomInt(0, pop.size() - 1)); indy = (AbstractEAIndividual) pop.get(RNG.randomInt(0, pop.size() - 1));
// set local values // set local values
@ -1245,7 +1245,7 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se
for (int i = 0; i < curPosition.length; i++) { for (int i = 0; i < curPosition.length; i++) {
newPosition[i] = curPosition[i] + curVelocity[i]; newPosition[i] = curPosition[i] + curVelocity[i];
} }
if (m_CheckRange && isOutOfRange(newPosition, range)) { if (checkRange && isOutOfRange(newPosition, range)) {
System.err.println("error, individual violates constraints!"); System.err.println("error, individual violates constraints!");
} }
@ -1254,7 +1254,7 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se
((InterfaceDataTypeDouble) indy).setDoubleGenotype(newPosition); ((InterfaceDataTypeDouble) indy).setDoubleGenotype(newPosition);
} else { } else {
((InterfaceDataTypeDouble) indy).setDoubleGenotype(newPosition); // WARNING, this does a checkBounds in any case! ((InterfaceDataTypeDouble) indy).setDoubleGenotype(newPosition); // WARNING, this does a checkBounds in any case!
if (!m_CheckRange) { if (!checkRange) {
System.err.println("warning, checkbounds will be forced by InterfaceESIndividual!"); System.err.println("warning, checkbounds will be forced by InterfaceESIndividual!");
} }
} }
@ -1516,7 +1516,7 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se
for (int i = 0; i < leaders.size(); i++) { for (int i = 0; i < leaders.size(); i++) {
dist = metric.distance((AbstractEAIndividual) sortedPop[cur], leaders.get(i)); dist = metric.distance((AbstractEAIndividual) sortedPop[cur], leaders.get(i));
//System.out.println("dist is "+dist); //System.out.println("dist is "+dist);
if ((m_swarmRadius * 2.) > dist) { // a formal leader is found if ((swarmRadius * 2.) > dist) { // a formal leader is found
int sSize = (Integer) (leaders.get(i)).getData(multiSwSizeKey); int sSize = (Integer) (leaders.get(i)).getData(multiSwSizeKey);
if ((maxSubSwarmSize > 0) && (sSize >= maxSubSwarmSize)) { if ((maxSubSwarmSize > 0) && (sSize >= maxSubSwarmSize)) {
// swarm is too big already // swarm is too big already
@ -1546,7 +1546,7 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se
cur++; cur++;
} }
// for (int i=0; i<pop.size(); i++) { // this causes quadratic complexity. however, popsizes are usually small for pso, so its acceptable for testing // for (int i=0; i<pop.size(); i++) { // this causes quadratic complexity. however, popsizes are usually small for pso, so its acceptable for testing
// if ((i!=index) && ((m_swarmRadius*2.)>metric.distance((AbstractEAIndividual)pop.get(i), (AbstractEAIndividual)pop.get(index)))) { // if ((i!=index) && ((swarmRadius*2.)>metric.distance((AbstractEAIndividual)pop.get(i), (AbstractEAIndividual)pop.get(index)))) {
// this.compareAndSet(localBestFitness, localBestPosition, (AbstractEAIndividual)pop.get(i)); // this.compareAndSet(localBestFitness, localBestPosition, (AbstractEAIndividual)pop.get(i));
// } // }
// } // }
@ -1563,7 +1563,7 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se
AbstractEAIndividualComparator comp = new AbstractEAIndividualComparator(partBestFitKey); AbstractEAIndividualComparator comp = new AbstractEAIndividualComparator(partBestFitKey);
for (int i = 0; i < pop.size(); i++) { for (int i = 0; i < pop.size(); i++) {
// loop over the part of the tree which is complete (full degree in each level) // loop over the part of the tree which is complete (full degree in each level)
parentIndex = getParentIndex(m_TopologyRange, i, pop.size()); parentIndex = getParentIndex(topologyRange, i, pop.size());
if (comp.compare(pop.get(i), pop.get(parentIndex)) < 0) { // sibling is dominant! if (comp.compare(pop.get(i), pop.get(parentIndex)) < 0) { // sibling is dominant!
// so switch them // so switch them
indy = (AbstractEAIndividual) pop.get(i); indy = (AbstractEAIndividual) pop.get(i);
@ -1755,7 +1755,7 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se
if (indy == null) { if (indy == null) {
System.err.println("Error in PSO.setPopulation!"); System.err.println("Error in PSO.setPopulation!");
} else if (!indy.hasData(partTypeKey)) { } else if (!indy.hasData(partTypeKey)) {
initIndividualDefaults(indy, m_InitialVelocity); initIndividualDefaults(indy, initialVelocity);
initIndividualMemory(indy); initIndividualMemory(indy);
indy.putData(indexKey, i); indy.putData(indexKey, i);
indy.setIndividualIndex(i); indy.setIndividualIndex(i);
@ -1787,11 +1787,11 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se
* @param f * @param f
*/ */
public void setInitialVelocity(double f) { public void setInitialVelocity(double f) {
this.m_InitialVelocity = f; this.initialVelocity = f;
} }
public double getInitialVelocity() { public double getInitialVelocity() {
return this.m_InitialVelocity; return this.initialVelocity;
} }
public String initialVelocityTipText() { public String initialVelocityTipText() {
@ -1810,11 +1810,11 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se
if (k > 1) { if (k > 1) {
k = 1; k = 1;
} }
this.m_SpeedLimit = k; this.speedLimit = k;
} }
public double getSpeedLimit() { public double getSpeedLimit() {
return this.m_SpeedLimit; return this.speedLimit;
} }
/** /**
@ -1824,7 +1824,7 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se
* @return * @return
*/ */
protected double getSpeedLimit(int index) { protected double getSpeedLimit(int index) {
return this.m_SpeedLimit; return this.speedLimit;
} }
public String speedLimitTipText() { public String speedLimitTipText() {
@ -1853,8 +1853,8 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se
if (!getAlgoType().isSelectedString("Constriction")) { if (!getAlgoType().isSelectedString("Constriction")) {
System.err.println("Warning, PSO algorithm variant constriction expected!"); System.err.println("Warning, PSO algorithm variant constriction expected!");
} }
m_Phi1 = tau1; phi1 = tau1;
m_Phi2 = tau2; phi2 = tau2;
setInertnessOrChi(2. / (Math.abs(2 - pSum - Math.sqrt((pSum * pSum) - (4 * pSum))))); setInertnessOrChi(2. / (Math.abs(2 - pSum - Math.sqrt((pSum * pSum) - (4 * pSum)))));
} }
} }
@ -1882,14 +1882,14 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se
* @param l * @param l
*/ */
public void setPhi1(double l) { public void setPhi1(double l) {
this.m_Phi1 = l; this.phi1 = l;
if (algType.getSelectedTag().getID() == 1) { if (algType.getSelectedTag().getID() == 1) {
setConstriction(getPhi1(), getPhi2()); setConstriction(getPhi1(), getPhi2());
} }
} }
public double getPhi1() { public double getPhi1() {
return this.m_Phi1; return this.phi1;
} }
public String phi1TipText() { public String phi1TipText() {
@ -1902,14 +1902,14 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se
* @param l * @param l
*/ */
public void setPhi2(double l) { public void setPhi2(double l) {
this.m_Phi2 = l; this.phi2 = l;
if (algType.getSelectedTag().getID() == 1) { if (algType.getSelectedTag().getID() == 1) {
setConstriction(getPhi1(), getPhi2()); setConstriction(getPhi1(), getPhi2());
} }
} }
public double getPhi2() { public double getPhi2() {
return this.m_Phi2; return this.phi2;
} }
public String phi2TipText() { public String phi2TipText() {
@ -1924,8 +1924,8 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se
* @param phi2 * @param phi2
*/ */
public void setPhiValues(double phi1, double phi2) { public void setPhiValues(double phi1, double phi2) {
m_Phi1 = phi1; this.phi1 = phi1;
m_Phi2 = phi2; this.phi2 = phi2;
if (algType.isSelectedString("Constriction")) { if (algType.isSelectedString("Constriction")) {
setConstriction(phi1, phi2); setConstriction(phi1, phi2);
} }
@ -1940,8 +1940,8 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se
* @param inertness * @param inertness
*/ */
public void setParameterValues(double phi1, double phi2, double inertness) { public void setParameterValues(double phi1, double phi2, double inertness) {
m_Phi1 = phi1; this.phi1 = phi1;
m_Phi2 = phi2; this.phi2 = phi2;
setInertnessOrChi(inertness); setInertnessOrChi(inertness);
} }
@ -2008,11 +2008,11 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se
* @param s The range. * @param s The range.
*/ */
public void setTopologyRange(int s) { public void setTopologyRange(int s) {
this.m_TopologyRange = s; this.topologyRange = s;
} }
public int getTopologyRange() { public int getTopologyRange() {
return this.m_TopologyRange; return this.topologyRange;
} }
public String topologyRangeTipText() { public String topologyRangeTipText() {
@ -2025,11 +2025,11 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se
* @param s Check Constraints. * @param s Check Constraints.
*/ */
public void setCheckRange(boolean s) { public void setCheckRange(boolean s) {
this.m_CheckRange = s; this.checkRange = s;
} }
public boolean isCheckRange() { public boolean isCheckRange() {
return this.m_CheckRange; return this.checkRange;
} }
public String checkRangeTipText() { public String checkRangeTipText() {
@ -2102,11 +2102,11 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se
} }
public double getSubSwarmRadius() { public double getSubSwarmRadius() {
return m_swarmRadius; return swarmRadius;
} }
public void setSubSwarmRadius(double radius) { public void setSubSwarmRadius(double radius) {
m_swarmRadius = radius; swarmRadius = radius;
} }
public String subSwarmRadiusTipText() { public String subSwarmRadiusTipText() {