Implement several CLI params for PSO
Refactor PSO implementation
This commit is contained in:
parent
d51fdc560e
commit
b363e46ad1
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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() {
|
||||||
|
@ -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() {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user