Some repairs (GradientDescentAlgorithm, F1 and F2 are now derivable); renamed Population.m_Size to m_TargetSize to avoid misunderstandings; Exceptions are now caught and their messages tried to display in a JOptionPane in addition to printing to System.err.
This commit is contained in:
parent
c84b1486b1
commit
88879683a4
@ -143,7 +143,7 @@ public class OptimizerFactory {
|
||||
|
||||
DifferentialEvolution de = new DifferentialEvolution();
|
||||
de.SetProblem(problem);
|
||||
de.getPopulation().setPopulationSize(popsize);
|
||||
de.getPopulation().setTargetSize(popsize);
|
||||
de.setDEType(DETypeEnum.DE2_CurrentToBest);
|
||||
de.setF(f);
|
||||
de.setK(CR);
|
||||
@ -260,7 +260,7 @@ public class OptimizerFactory {
|
||||
|
||||
GeneticAlgorithm ga = new GeneticAlgorithm();
|
||||
ga.SetProblem(problem);
|
||||
ga.getPopulation().setPopulationSize(popsize);
|
||||
ga.getPopulation().setTargetSize(popsize);
|
||||
ga.setParentSelection(select);
|
||||
ga.setPartnerSelection(select);
|
||||
ga.addPopulationChangedEventListener(listener);
|
||||
@ -374,7 +374,7 @@ public class OptimizerFactory {
|
||||
tmpIndi.setCrossoverProbability(0);
|
||||
|
||||
HillClimbing hc = new HillClimbing();
|
||||
hc.getPopulation().setPopulationSize(pop);
|
||||
hc.getPopulation().setTargetSize(pop);
|
||||
hc.addPopulationChangedEventListener(listener);
|
||||
hc.SetProblem(problem);
|
||||
hc.init();
|
||||
@ -405,7 +405,7 @@ public class OptimizerFactory {
|
||||
tmpIndi.setCrossoverProbability(0);
|
||||
|
||||
MonteCarloSearch mc = new MonteCarloSearch();
|
||||
mc.getPopulation().setPopulationSize(popsize);
|
||||
mc.getPopulation().setTargetSize(popsize);
|
||||
mc.addPopulationChangedEventListener(listener);
|
||||
mc.SetProblem(problem);
|
||||
mc.init();
|
||||
@ -447,7 +447,7 @@ public class OptimizerFactory {
|
||||
|
||||
ParticleSwarmOptimization pso = new ParticleSwarmOptimization();
|
||||
pso.SetProblem(problem);
|
||||
pso.getPopulation().setPopulationSize(popsize);
|
||||
pso.getPopulation().setTargetSize(popsize);
|
||||
pso.setPhi1(phi1);
|
||||
pso.setPhi2(phi2);
|
||||
pso.setSpeedLimit(k);
|
||||
@ -493,7 +493,7 @@ public class OptimizerFactory {
|
||||
sa.setAlpha(alpha);
|
||||
sa.setInitialTemperature(temperature);
|
||||
sa.SetProblem(problem);
|
||||
sa.getPopulation().setPopulationSize(popsize);
|
||||
sa.getPopulation().setTargetSize(popsize);
|
||||
sa.addPopulationChangedEventListener(listener);
|
||||
sa.init();
|
||||
|
||||
@ -732,7 +732,7 @@ public class OptimizerFactory {
|
||||
* @return
|
||||
*/
|
||||
public static GOParameters makeParams(InterfaceOptimizer opt, AbstractOptimizationProblem problem, InterfaceTerminator term) {
|
||||
return makeParams(opt, opt.getPopulation().getPopulationSize(), problem, randSeed, term);
|
||||
return makeParams(opt, opt.getPopulation().getTargetSize(), problem, randSeed, term);
|
||||
}
|
||||
/**
|
||||
* Set the population size, initialize the population and return a parameter structure containing all
|
||||
|
@ -317,7 +317,7 @@ public class GOStandaloneVersion implements InterfaceGOStandalone, InterfacePopu
|
||||
ga.setParentSelection(tour);
|
||||
ga.setPartnerSelection(tour);
|
||||
this.m_GO.setOptimizer(ga);
|
||||
this.m_GO.getOptimizer().getPopulation().setPopulationSize(100);
|
||||
this.m_GO.getOptimizer().getPopulation().setTargetSize(100);
|
||||
F1Problem problem = new F1Problem();
|
||||
tmpIndy = new GAIndividualDoubleData();
|
||||
((GAIndividualDoubleData)tmpIndy).setCrossoverOperator(new CrossoverGANPoint());
|
||||
@ -335,7 +335,7 @@ public class GOStandaloneVersion implements InterfaceGOStandalone, InterfacePopu
|
||||
this.m_OutputFileName = "X360_StandardES";
|
||||
EvolutionStrategies es = new EvolutionStrategies();
|
||||
this.m_GO.setOptimizer(es);
|
||||
this.m_GO.getOptimizer().getPopulation().setPopulationSize(50);
|
||||
this.m_GO.getOptimizer().getPopulation().setTargetSize(50);
|
||||
F1Problem problem = new F1Problem();
|
||||
tmpIndy = new ESIndividualDoubleData();
|
||||
((AbstractEAIndividual)tmpIndy).setMutationOperator(new MutateESLocal());
|
||||
|
@ -128,7 +128,7 @@ public class MOCCOStandalone implements InterfaceGOStandalone, InterfacePopulati
|
||||
while (!tmpP.isFinished()) { try { Thread.sleep(1000); } catch (java.lang.InterruptedException e) { }}
|
||||
this.m_State.m_InitialPopulationSize = Math.max(1, this.m_State.m_InitialPopulationSize);
|
||||
Population pop = new Population();
|
||||
pop.setPopulationSize(this.m_State.m_InitialPopulationSize);
|
||||
pop.setTargetSize(this.m_State.m_InitialPopulationSize);
|
||||
this.m_State.m_CurrentProblem = (InterfaceOptimizationProblem) this.m_State.m_OriginalProblem.clone();
|
||||
this.m_State.m_CurrentProblem.initPopulation(pop);
|
||||
this.m_State.m_CurrentProblem.evaluate(pop);
|
||||
|
@ -46,7 +46,7 @@ public class ArchivingAllDominating extends AbstractArchiving implements java.io
|
||||
if ((pop.getArchive().size() == 0) && (pop.size() > 0)) {
|
||||
SelectBestIndividuals select = new SelectBestIndividuals();
|
||||
select.setObeyDebsConstViolationPrinciple(true);
|
||||
pop.getArchive().addPopulation(select.selectFrom(pop, pop.getArchive().getPopulationSize()));
|
||||
pop.getArchive().addPopulation(select.selectFrom(pop, pop.getArchive().getTargetSize()));
|
||||
}
|
||||
} else {
|
||||
// test for each element in population if it
|
||||
|
@ -59,8 +59,8 @@ public class ArchivingMaxiMin implements InterfaceArchiving, java.io.Serializabl
|
||||
this.m_MaxiMin.convertMultiObjective2SingleObjective(tmpPop);
|
||||
this.m_Selection.setObeyDebsConstViolationPrinciple(this.m_ObeyDebsConstViolationPrinciple);
|
||||
this.m_Selection.prepareSelection(tmpPop);
|
||||
archive = this.m_Selection.selectFrom(tmpPop, pop.getArchive().getPopulationSize());
|
||||
archive.setPopulationSize(pop.getArchive().getPopulationSize());
|
||||
archive = this.m_Selection.selectFrom(tmpPop, pop.getArchive().getTargetSize());
|
||||
archive.setTargetSize(pop.getArchive().getTargetSize());
|
||||
|
||||
// now unconvert from SO to MO
|
||||
for (int i = 0; i < archive.size(); i++) {
|
||||
|
@ -74,21 +74,21 @@ public class ArchivingNSGAII extends ArchivingNSGA implements java.io.Serializab
|
||||
|
||||
// Now init the new archive
|
||||
Population archive = new Population();
|
||||
archive.setPopulationSize(pop.getArchive().getPopulationSize());
|
||||
archive.setTargetSize(pop.getArchive().getTargetSize());
|
||||
|
||||
// Now add the fronts to the archive
|
||||
int index = 0;
|
||||
while ((index < fronts.length) && ((archive.size() + fronts[index].size()) < archive.getPopulationSize())) {
|
||||
while ((index < fronts.length) && ((archive.size() + fronts[index].size()) < archive.getTargetSize())) {
|
||||
archive.addPopulation(fronts[index]);
|
||||
index++;
|
||||
}
|
||||
|
||||
if ((index < fronts.length) && (archive.size() < archive.getPopulationSize())) {
|
||||
if ((index < fronts.length) && (!archive.targetSizeReached())) {
|
||||
// In this case there are still elements left in the front which could be added to the archive!
|
||||
// and there is still some place left in the archive
|
||||
// therefore we could add some individuals from front[index]
|
||||
// to the archive using the crowding distance sorting
|
||||
fronts[index].setPopulationSize(archive.getPopulationSize() - archive.size());
|
||||
fronts[index].setTargetSize(archive.getTargetSize() - archive.size());
|
||||
this.m_Cleaner.removeSurplusIndividuals(fronts[index]);
|
||||
archive.addPopulation(fronts[index]);
|
||||
}
|
||||
|
@ -136,7 +136,7 @@ public class ArchivingPESAII extends AbstractArchiving implements java.io.Serial
|
||||
// Now check whether there are individuals to remove
|
||||
int bigSqueeze, index;
|
||||
int[] squeezeFactor;
|
||||
while(archive.size() > archive.getPopulationSize()) {
|
||||
while(archive.targetSizeExceeded()) {
|
||||
squeezeFactor = this.calculateSqueezeFactor(archive);
|
||||
bigSqueeze = 0;
|
||||
index = -1;
|
||||
|
@ -98,7 +98,7 @@ public class ArchivingSPEAII extends AbstractArchiving implements java.io.Serial
|
||||
|
||||
// Now init the new archive
|
||||
Population archive = new Population();
|
||||
archive.setPopulationSize(pop.getArchive().getPopulationSize());
|
||||
archive.setTargetSize(pop.getArchive().getTargetSize());
|
||||
|
||||
// archive = this.m_Selection.selectFrom(tmpPop, archive.getPopulationSize());
|
||||
|
||||
@ -160,7 +160,7 @@ public class ArchivingSPEAII extends AbstractArchiving implements java.io.Serial
|
||||
|
||||
// if there is some place left let's add some more
|
||||
int currentLevel = 0;
|
||||
while (archive.size() < archive.getPopulationSize()) {
|
||||
while (!archive.targetSizeReached()) {
|
||||
currentLevel++;
|
||||
for (int i = 0; i < RawFitness.length; i++) {
|
||||
if ((RawFitness[i] >= currentLevel) && (RawFitness[i] < currentLevel +1)) {
|
||||
@ -194,7 +194,7 @@ public class ArchivingSPEAII extends AbstractArchiving implements java.io.Serial
|
||||
// RawFitness for the lowest kthDistance()!!!
|
||||
int ICurSma;
|
||||
double curSmall, highestLevel;
|
||||
while (archive.size() > archive.getPopulationSize()) {
|
||||
while (archive.targetSizeExceeded()) {
|
||||
highestLevel = 0;
|
||||
RawFitness = this.calculateRawFitness(archive);
|
||||
for (int i = 0; i < RawFitness.length; i++) {
|
||||
|
@ -31,9 +31,9 @@ public class InformationRetrievalInserting implements InterfaceInformationRetrie
|
||||
Population archive = pop.getArchive();
|
||||
|
||||
if (archive == null) return;
|
||||
if (archive.size() < pop.getPopulationSize()) {
|
||||
if (archive.size() < pop.getTargetSize()) {
|
||||
// remove archive size individuals from pop
|
||||
pop.removeNIndividuals(archive.size()-(pop.getPopulationSize()-pop.size()));
|
||||
pop.removeNIndividuals(archive.size()-(pop.getTargetSize()-pop.size()));
|
||||
} else {
|
||||
pop.clear();
|
||||
}
|
||||
|
@ -33,7 +33,7 @@ public class InformationRetrievalReplacing implements InterfaceInformationRetrie
|
||||
Population tmp = new Population();
|
||||
|
||||
tmp.addPopulation(archive);
|
||||
while (tmp.size() < archive.getPopulationSize()) {
|
||||
while (tmp.size() < archive.getTargetSize()) {
|
||||
tmp.add(pop.get(RNG.randomInt(0,pop.size()-1)));
|
||||
}
|
||||
|
||||
|
@ -35,7 +35,7 @@ public class RemoveSurplusIndividualsDynamicHyperCube implements InterfaceRemove
|
||||
double[][] fitness;
|
||||
double[] space;
|
||||
int indexSmallHyperCube;
|
||||
while(archive.size() > archive.getPopulationSize()) {
|
||||
while(archive.targetSizeExceeded()) {
|
||||
// select the individual with the least space around him
|
||||
// to do this i got to find the next smaller and the next bigger one
|
||||
fitness = new double[archive.size()][];
|
||||
|
@ -47,7 +47,7 @@ public class RemoveSurplusIndividualsStaticHyperCube extends RemoveSurplusIndivi
|
||||
((AbstractEAIndividual)archive.get(i)).putData("HyperCube", new Double(space[i]));
|
||||
}
|
||||
|
||||
while(archive.size() > archive.getPopulationSize()) {
|
||||
while(archive.targetSizeExceeded()) {
|
||||
// select the individual with the least space around him
|
||||
// to do this i got to find the next smaller and the next bigger one
|
||||
smallestHyperCube = ((Double)((AbstractEAIndividual)archive.get(0)).getData("HyperCube")).doubleValue();
|
||||
|
@ -273,7 +273,7 @@ public class ClusteringXMeans implements InterfaceClustering, java.io.Serializab
|
||||
ckm.setUseSearchSpace(true);
|
||||
ckm.m_Debug = true;
|
||||
Population pop = new Population();
|
||||
pop.setPopulationSize(100);
|
||||
pop.setTargetSize(100);
|
||||
F1Problem f1 = new F1Problem();
|
||||
f1.setProblemDimension(2);
|
||||
f1.setEAIndividual(new ESIndividualDoubleData());
|
||||
|
@ -96,7 +96,7 @@ public class TestESCrossover implements java.io.Serializable {
|
||||
ActionListener initListener = new ActionListener() {
|
||||
public void actionPerformed(ActionEvent event) {
|
||||
m_Partners = new Population();
|
||||
m_Partners.setPopulationSize(m_NumberOfPartners);
|
||||
m_Partners.setTargetSize(m_NumberOfPartners);
|
||||
m_Partners.clear();
|
||||
|
||||
InterfaceDataTypeDouble tmpIndyD = new ESIndividualDoubleData();
|
||||
@ -108,7 +108,7 @@ public class TestESCrossover implements java.io.Serializable {
|
||||
}
|
||||
tmpIndyD.setDoubleDataLength(m_Dimension);
|
||||
tmpIndyD.SetDoubleRange(newRange);
|
||||
for (int i = 0; i < m_Partners.getPopulationSize(); i++) {
|
||||
for (int i = 0; i < m_Partners.getTargetSize(); i++) {
|
||||
tmpIndyEA = (AbstractEAIndividual)((AbstractEAIndividual)tmpIndyD).clone();
|
||||
tmpIndyEA.init(m_Problem);
|
||||
m_Partners.add(tmpIndyEA);
|
||||
@ -134,7 +134,7 @@ public class TestESCrossover implements java.io.Serializable {
|
||||
ActionListener init2Listener = new ActionListener() {
|
||||
public void actionPerformed(ActionEvent event) {
|
||||
m_Partners = new Population();
|
||||
m_Partners.setPopulationSize(2);
|
||||
m_Partners.setTargetSize(2);
|
||||
m_Partners.clear();
|
||||
|
||||
InterfaceDataTypeDouble tmpIndyD = new ESIndividualDoubleData();
|
||||
@ -177,7 +177,7 @@ public class TestESCrossover implements java.io.Serializable {
|
||||
ActionListener init3Listener = new ActionListener() {
|
||||
public void actionPerformed(ActionEvent event) {
|
||||
m_Partners = new Population();
|
||||
m_Partners.setPopulationSize(3);
|
||||
m_Partners.setTargetSize(3);
|
||||
m_Partners.clear();
|
||||
|
||||
InterfaceDataTypeDouble tmpIndyD = new ESIndividualDoubleData();
|
||||
|
@ -0,0 +1,75 @@
|
||||
package eva2.server.go.operators.distancemetric;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
import eva2.server.go.individuals.AbstractEAIndividual;
|
||||
import eva2.server.go.individuals.InterfaceDataTypeDouble;
|
||||
import eva2.server.go.strategies.ParticleSwarmOptimization;
|
||||
|
||||
/**
|
||||
* Define a metric on data stored within individuals, such as the personal best position
|
||||
* in PSO.
|
||||
* @author mkron
|
||||
*
|
||||
*/
|
||||
public class IndividualDataMetric implements InterfaceDistanceMetric, Serializable {
|
||||
private String dataKey = ParticleSwarmOptimization.partBestPosKey;
|
||||
private boolean normedDistance = true; // flag whether to use normed distances (for InterfaceDataTypeDouble)
|
||||
|
||||
public IndividualDataMetric() {}
|
||||
|
||||
public IndividualDataMetric(String key) {
|
||||
dataKey = key;
|
||||
}
|
||||
|
||||
public IndividualDataMetric(IndividualDataMetric pBestMetric) {
|
||||
// TODO Auto-generated constructor stub
|
||||
}
|
||||
|
||||
/** This method allows you to make a deep clone of
|
||||
* the object
|
||||
* @return the deep clone
|
||||
*/
|
||||
public Object clone() {
|
||||
return new IndividualDataMetric(this);
|
||||
}
|
||||
|
||||
public double distance(AbstractEAIndividual indy1, AbstractEAIndividual indy2) {
|
||||
if (dataKey==null) throw new RuntimeException("Error, no data key defined in " + this.getClass().getName() + "::distance()");
|
||||
else {
|
||||
Object data1 = indy1.getData(dataKey);
|
||||
Object data2 = indy2.getData(dataKey);
|
||||
if (data1 instanceof double[] && (data2 instanceof double[])) {
|
||||
if (normedDistance) {
|
||||
double[][] range1 = ((InterfaceDataTypeDouble)indy1).getDoubleRange();
|
||||
double[][] range2 = ((InterfaceDataTypeDouble)indy2).getDoubleRange();
|
||||
return EuclideanMetric.normedEuclideanDistance((double[])data1, range1, (double[])data2, range2);
|
||||
} else return EuclideanMetric.euclideanDistance((double[])data1, (double[])data2);
|
||||
} else throw new RuntimeException("Error, invalid key data, double array required by " + this.getClass().getName());
|
||||
}
|
||||
}
|
||||
|
||||
public String dataKeyTipText() {
|
||||
return "Name of the data key to use to retrieve individual data (double[] for now).";
|
||||
}
|
||||
public String getDataKey() {
|
||||
return dataKey;
|
||||
}
|
||||
public void setDataKey(String dataKey) {
|
||||
this.dataKey = dataKey;
|
||||
}
|
||||
|
||||
public String normedDistanceTipText() {
|
||||
return "Flag whether to use euclidean distance directly or normed by the double range.";
|
||||
}
|
||||
public boolean isNormedDistance() {
|
||||
return normedDistance;
|
||||
}
|
||||
public void setNormedDistance(boolean normedDistance) {
|
||||
this.normedDistance = normedDistance;
|
||||
}
|
||||
|
||||
public String globalInfo() {
|
||||
return "Uses individual object data (so far only double[]) to calculate the distance.";
|
||||
}
|
||||
}
|
@ -217,8 +217,8 @@ public class MOClusteringSeparation implements InterfaceMigration, java.io.Seria
|
||||
oldIPOP[i].clear();
|
||||
oldIPOP[i].addPopulation(newIPOP[i]);
|
||||
// todo remove this for nice pictures
|
||||
if (oldIPOP[i].size() < oldIPOP[i].getPopulationSize()) {
|
||||
oldIPOP[i].addPopulation(this.m_Selection.selectFrom(memory, oldIPOP[i].getPopulationSize()-oldIPOP[i].size()));
|
||||
if (!oldIPOP[i].targetSizeReached()) {
|
||||
oldIPOP[i].addPopulation(this.m_Selection.selectFrom(memory, oldIPOP[i].getTargetSize()-oldIPOP[i].size()));
|
||||
}
|
||||
if (this.m_Debug) System.out.println("Setting "+i+" to population size " + oldIPOP[i].size());
|
||||
islands[i].setPopulation(oldIPOP[i]);
|
||||
|
@ -111,8 +111,8 @@ public class MOConeSeparation implements InterfaceMigration, java.io.Serializabl
|
||||
oldIPOP[i].clear();
|
||||
oldIPOP[i].addPopulation(newIPOP[i]);
|
||||
// todo remove this for nice pictures
|
||||
if (oldIPOP[i].size() < oldIPOP[i].getPopulationSize()) {
|
||||
oldIPOP[i].addPopulation(this.m_Selection.selectFrom(memory, oldIPOP[i].getPopulationSize()-oldIPOP[i].size()));
|
||||
if (!oldIPOP[i].targetSizeReached()) {
|
||||
oldIPOP[i].addPopulation(this.m_Selection.selectFrom(memory, oldIPOP[i].getTargetSize()-oldIPOP[i].size()));
|
||||
}
|
||||
if (this.m_Debug) System.out.println("Setting island "+i+" to population size " + oldIPOP[i].size());
|
||||
allDom.addElementsToArchive(oldIPOP[i]);
|
||||
|
@ -137,7 +137,7 @@ public class MOXMeansSeparation implements InterfaceMigration, java.io.Serializa
|
||||
newIPOP = this.m_XMeans.cluster(collector, c);
|
||||
for (int i = 0; i < islands.length; i++) {
|
||||
islands[i].getPopulation().clear();
|
||||
islands[i].getPopulation().setPopulationSize(0);
|
||||
islands[i].getPopulation().setTargetSize(0);
|
||||
}
|
||||
if (this.m_Debug) {
|
||||
Plot plot;
|
||||
@ -218,12 +218,12 @@ public class MOXMeansSeparation implements InterfaceMigration, java.io.Serializa
|
||||
oldIPOP[i].clear();
|
||||
oldIPOP[i].addPopulation(newIPOP[i]);
|
||||
// todo remove this for nice pictures
|
||||
if (oldIPOP[i].size() < oldIPOP[i].getPopulationSize()) {
|
||||
oldIPOP[i].addPopulation(this.m_Selection.selectFrom(memory, oldIPOP[i].getPopulationSize()-oldIPOP[i].size()));
|
||||
if (!oldIPOP[i].targetSizeReached()) {
|
||||
oldIPOP[i].addPopulation(this.m_Selection.selectFrom(memory, oldIPOP[i].getFreeSlots()));
|
||||
}
|
||||
if (this.m_Debug) System.out.println("Setting "+i+" to population size " + oldIPOP[i].size());
|
||||
islands[i].setPopulation(oldIPOP[i]);
|
||||
islands[i].getPopulation().setPopulationSize(oldIPOP[i].size());
|
||||
islands[i].getPopulation().setTargetSize(oldIPOP[i].size());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -413,6 +413,7 @@ public class MutateESRankMuCMA implements InterfaceMutationGenerational, Seriali
|
||||
}
|
||||
|
||||
if (TRACE_1) {
|
||||
System.out.println("sigma=" + params.sigma);
|
||||
System.out.print("psLen=" + (psNorm) + " ");
|
||||
outputParams(params, mu);
|
||||
}
|
||||
|
@ -105,7 +105,7 @@ public class MetricSWithReference implements InterfaceParetoFrontMetric, java.io
|
||||
if (this.m_ReferenceSMetric < 0) {
|
||||
Population tmpPop = new Population();
|
||||
AbstractEAIndividual tmpIndy;
|
||||
tmpPop.setPopulationSize(this.m_Reference.length);
|
||||
tmpPop.setTargetSize(this.m_Reference.length);
|
||||
tmpPop.clear();
|
||||
for (int i = 0; i < this.m_Reference.length; i++) {
|
||||
tmpIndy = new ESIndividualDoubleData();
|
||||
|
@ -134,7 +134,7 @@ public class PostProcess {
|
||||
for (int i=0; i<optsFound.length; i++) {
|
||||
if (optsFound[i] != null) result.add(optsFound[i]);
|
||||
}
|
||||
result.setPopulationSize(result.size());
|
||||
result.synchSize();
|
||||
return result;
|
||||
}
|
||||
|
||||
@ -212,7 +212,7 @@ public class PostProcess {
|
||||
}
|
||||
}
|
||||
}
|
||||
result.setPopulationSize(result.size());
|
||||
result.synchSize();
|
||||
return result;
|
||||
}
|
||||
|
||||
@ -387,8 +387,8 @@ public class PostProcess {
|
||||
hc.SetProblem(problem);
|
||||
mute.init(problem.getIndividualTemplate(), problem);
|
||||
hc.SetMutationOperator(mute);
|
||||
if (pop.size() != pop.getPopulationSize()) {
|
||||
System.err.println(pop.size() + " vs. "+ pop.getPopulationSize());
|
||||
if (pop.size() != pop.getTargetSize()) {
|
||||
System.err.println(pop.size() + " vs. "+ pop.getTargetSize());
|
||||
System.err.println("warning: population size and vector size dont match! (PostProcess::processWithHC)");
|
||||
}
|
||||
hc.setPopulation(pop);
|
||||
|
@ -47,7 +47,7 @@ public class SelectAll implements InterfaceSelection, java.io.Serializable {
|
||||
*/
|
||||
public Population selectFrom(Population population, int size) {
|
||||
Population result = new Population();
|
||||
result.setPopulationSize(size);
|
||||
result.setTargetSize(size);
|
||||
if (this.m_ObeyDebsConstViolationPrinciple) {
|
||||
int index = 0;
|
||||
while (result.size() < size) {
|
||||
|
@ -52,7 +52,7 @@ public class SelectBestSingle implements InterfaceSelection, java.io.Serializabl
|
||||
double currentBestValue;
|
||||
|
||||
critSize = ((AbstractEAIndividual)population.get(0)).getFitness().length;
|
||||
result.setPopulationSize(size);
|
||||
result.setTargetSize(size);
|
||||
if (this.m_ObeyDebsConstViolationPrinciple) {
|
||||
for (int i = 0; i < size; i++) {
|
||||
currentCriteria = RNG.randomInt(0, critSize-1);
|
||||
|
@ -54,7 +54,7 @@ public class SelectMONSGAIICrowedTournament implements InterfaceSelection, java.
|
||||
*/
|
||||
public Population selectFrom(Population population, int size) {
|
||||
Population result = new Population();
|
||||
result.setPopulationSize(size);
|
||||
result.setTargetSize(size);
|
||||
for (int i = 0; i < size; i++) {
|
||||
result.add(this.select(population));
|
||||
}
|
||||
|
@ -52,7 +52,7 @@ public class SelectMOPESA implements InterfaceSelection, java.io.Serializable {
|
||||
*/
|
||||
public Population selectFrom(Population population, int size) {
|
||||
Population result = new Population();
|
||||
result.setPopulationSize(size);
|
||||
result.setTargetSize(size);
|
||||
for (int i = 0; i < size; i++) {
|
||||
result.add(this.select(population));
|
||||
}
|
||||
|
@ -86,7 +86,7 @@ public class SelectMOPESAII implements InterfaceSelection, java.io.Serializable
|
||||
*/
|
||||
public Population selectFrom(Population population, int size) {
|
||||
Population result = new Population();
|
||||
result.setPopulationSize(size);
|
||||
result.setTargetSize(size);
|
||||
for (int i = 0; i < size; i++) {
|
||||
result.add(this.select(population));
|
||||
}
|
||||
|
@ -63,7 +63,7 @@ public class SelectParticleWheel implements InterfaceSelection, java.io.Serializ
|
||||
*/
|
||||
public Population selectFrom(Population population, int size) {
|
||||
Population result = new Population();
|
||||
result.setPopulationSize(size);
|
||||
result.setTargetSize(size);
|
||||
|
||||
if (selectFixedSteps ) selectFixed(population, size, result);
|
||||
else selectDrawIndependent(population, size, result);
|
||||
|
@ -55,7 +55,7 @@ public class SelectRandom implements InterfaceSelection, java.io.Serializable {
|
||||
*/
|
||||
public Population selectFrom(Population population, int size) {
|
||||
Population result = new Population();
|
||||
result.setPopulationSize(size);
|
||||
result.setTargetSize(size);
|
||||
if (this.m_ObeyDebsConstViolationPrinciple) {
|
||||
int index = 0, rand;
|
||||
while (result.size() < size) {
|
||||
|
@ -50,7 +50,7 @@ public class SelectTournament implements InterfaceSelection, java.io.Serializabl
|
||||
*/
|
||||
public Population selectFrom(Population population, int size) {
|
||||
Population result = new Population();
|
||||
result.setPopulationSize(size);
|
||||
result.setTargetSize(size);
|
||||
for (int i = 0; i < size; i++) {
|
||||
result.add(this.select(population));
|
||||
}
|
||||
|
@ -95,7 +95,7 @@ public class SelectXProbRouletteWheel implements InterfaceSelection, java.io.Ser
|
||||
*/
|
||||
public Population selectFrom(Population population, int size) {
|
||||
Population result = new Population();
|
||||
result.setPopulationSize(size);
|
||||
result.setTargetSize(size);
|
||||
|
||||
if (true) {
|
||||
//this.m_TreeRoot = this.buildSelectionTree(population);
|
||||
|
@ -29,12 +29,8 @@ public class PBILPopulation extends Population implements Cloneable, java.io.Ser
|
||||
}
|
||||
|
||||
public PBILPopulation(PBILPopulation population) {
|
||||
this.m_Generation = population.m_Generation;
|
||||
this.m_FunctionCalls = population.m_FunctionCalls;
|
||||
this.m_Size = population.m_Size;
|
||||
for (int i = 0; i < population.size(); i++) {
|
||||
this.add((((AbstractEAIndividual)population.get(i))).clone());
|
||||
}
|
||||
super(population);
|
||||
|
||||
this.m_ProbabilityVector = new double[population.m_ProbabilityVector.length];
|
||||
for (int i = 0; i < this.m_ProbabilityVector.length; i++) {
|
||||
this.m_ProbabilityVector[i] = population.m_ProbabilityVector[i];
|
||||
@ -86,7 +82,7 @@ public class PBILPopulation extends Population implements Cloneable, java.io.Ser
|
||||
BitSet tmpBitSet;
|
||||
|
||||
this.clear();
|
||||
for (int i = 0; i < this.m_Size; i++) {
|
||||
for (int i = 0; i < this.getTargetSize(); i++) {
|
||||
tmpIndy = (InterfaceGAIndividual)((AbstractEAIndividual)template).clone();
|
||||
tmpBitSet = tmpIndy.getBGenotype();
|
||||
for (int j = 0; j < this.m_ProbabilityVector.length; j++) {
|
||||
|
@ -47,7 +47,7 @@ public class Population extends ArrayList implements PopulationInterface, Clonea
|
||||
|
||||
protected int m_Generation = 0;
|
||||
protected int m_FunctionCalls = 0;
|
||||
protected int m_Size = 50;
|
||||
protected int m_TargetSize = 50;
|
||||
protected Population m_Archive = null;
|
||||
PopulationInitMethod initMethod = PopulationInitMethod.individualDefault;
|
||||
transient private ArrayList<InterfacePopulationChangedEventListener> listeners = null;
|
||||
@ -86,7 +86,7 @@ public class Population extends ArrayList implements PopulationInterface, Clonea
|
||||
*/
|
||||
public Population(int initialCapacity) {
|
||||
super(initialCapacity);
|
||||
setPopulationSize(initialCapacity);
|
||||
setTargetSize(initialCapacity);
|
||||
}
|
||||
|
||||
public Population(Population population) {
|
||||
@ -110,7 +110,7 @@ public class Population extends ArrayList implements PopulationInterface, Clonea
|
||||
public void setSameParams(Population population) {
|
||||
this.m_Generation = population.m_Generation;
|
||||
this.m_FunctionCalls = population.m_FunctionCalls;
|
||||
this.m_Size = population.m_Size;
|
||||
this.m_TargetSize = population.m_TargetSize;
|
||||
this.useHistory = population.useHistory;
|
||||
this.notifyEvalInterval = population.notifyEvalInterval;
|
||||
// this.m_Listener = population.m_Listener;
|
||||
@ -196,15 +196,13 @@ public class Population extends ArrayList implements PopulationInterface, Clonea
|
||||
* are reset and m_Size default Individuals are created and initialized by
|
||||
* the GAIndividual default init() method.
|
||||
*/
|
||||
public void defaultInitPopulation() {
|
||||
GAIndividualBinaryData tmpIndy;
|
||||
|
||||
public void defaultInit(AbstractEAIndividual template) {
|
||||
this.m_Generation = 0;
|
||||
this.m_FunctionCalls = 0;
|
||||
this.m_Archive = null;
|
||||
this.clear();
|
||||
for (int i = 0; i < this.m_Size; i++) {
|
||||
tmpIndy = new GAIndividualBinaryData();
|
||||
for (int i = 0; i < this.m_TargetSize; i++) {
|
||||
AbstractEAIndividual tmpIndy = (AbstractEAIndividual)template.clone();
|
||||
tmpIndy.defaultInit();
|
||||
super.add(tmpIndy);
|
||||
}
|
||||
@ -239,8 +237,8 @@ public class Population extends ArrayList implements PopulationInterface, Clonea
|
||||
return;
|
||||
}
|
||||
AbstractEAIndividual template = pop.getEAIndividual(0);
|
||||
if (fillPop && (pop.size()<pop.getPopulationSize())) {
|
||||
for (int i=pop.size(); i<pop.getPopulationSize(); i++) pop.add((AbstractEAIndividual)template.clone());
|
||||
if (fillPop && (pop.size()<pop.getTargetSize())) {
|
||||
for (int i=pop.size(); i<pop.getTargetSize(); i++) pop.add((AbstractEAIndividual)template.clone());
|
||||
}
|
||||
if (template instanceof InterfaceDataTypeDouble) {
|
||||
double[][] range = ((InterfaceDataTypeDouble)template).getDoubleRange();
|
||||
@ -695,7 +693,7 @@ public class Population extends ArrayList implements PopulationInterface, Clonea
|
||||
public Population getSortedBestFirst() {
|
||||
Population result = this.cloneWithoutInds();
|
||||
getSortedNIndividuals(size(), true, result);
|
||||
result.setPopulationSize(result.size());
|
||||
result.synchSize();
|
||||
return result;
|
||||
}
|
||||
|
||||
@ -741,7 +739,7 @@ public class Population extends ArrayList implements PopulationInterface, Clonea
|
||||
for (int i = skip; i < skip+n; i++) {
|
||||
res.add(sorted.get(i));
|
||||
}
|
||||
res.setPopulationSize(res.size());
|
||||
res.synchSize();
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1041,7 +1039,7 @@ public class Population extends ArrayList implements PopulationInterface, Clonea
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return "Population-"+getPopulationSize();
|
||||
return "Population-"+getTargetSize();
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1094,8 +1092,8 @@ public class Population extends ArrayList implements PopulationInterface, Clonea
|
||||
*
|
||||
* @param size
|
||||
*/
|
||||
public void setPopulationSize(int size) {
|
||||
this.m_Size = size;
|
||||
public void setTargetSize(int size) {
|
||||
this.m_TargetSize = size;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1104,16 +1102,16 @@ public class Population extends ArrayList implements PopulationInterface, Clonea
|
||||
* @param size
|
||||
* @return
|
||||
*/
|
||||
public Population setPopSize(int size) {
|
||||
this.m_Size = size;
|
||||
public Population setTargetPopSize(int size) {
|
||||
setTargetSize(size);
|
||||
return this;
|
||||
}
|
||||
|
||||
public int getPopulationSize() {
|
||||
return this.m_Size;
|
||||
public int getTargetSize() {
|
||||
return this.m_TargetSize;
|
||||
}
|
||||
public String populationSizeTipText() {
|
||||
return "The population size.";
|
||||
public String targetSizeTipText() {
|
||||
return "The initial population size.";
|
||||
}
|
||||
public AbstractEAIndividual getEAIndividual(int i) {
|
||||
return (AbstractEAIndividual)this.get(i);
|
||||
@ -1255,7 +1253,7 @@ public class Population extends ArrayList implements PopulationInterface, Clonea
|
||||
double d;
|
||||
double[] res = new double[3];
|
||||
|
||||
double meanDist = 0.;
|
||||
double distSum = 0.;
|
||||
double maxDist = Double.MIN_VALUE;
|
||||
double minDist = Double.MAX_VALUE;
|
||||
|
||||
@ -1264,14 +1262,14 @@ public class Population extends ArrayList implements PopulationInterface, Clonea
|
||||
if (metric == null) d = EuclideanMetric.euclideanDistance(AbstractEAIndividual.getDoublePositionShallow(getEAIndividual(i)),
|
||||
AbstractEAIndividual.getDoublePositionShallow(getEAIndividual(j)));
|
||||
else d = metric.distance((AbstractEAIndividual)this.get(i), (AbstractEAIndividual)this.get(j));
|
||||
meanDist += d;
|
||||
distSum += d;
|
||||
if (d < minDist) minDist = d;
|
||||
if (d > maxDist) maxDist = d;
|
||||
}
|
||||
}
|
||||
res[1] = minDist;
|
||||
res[2] = maxDist;
|
||||
if (this.size() > 1) res[0] = meanDist / (this.size() * (this.size()-1) / 2);
|
||||
if (this.size() > 1) res[0] = distSum / (this.size() * (this.size()-1) / 2);
|
||||
else { // only one indy?
|
||||
res[1]=0;
|
||||
res[2]=0;
|
||||
@ -1496,14 +1494,14 @@ public class Population extends ArrayList implements PopulationInterface, Clonea
|
||||
* this method cannot grow, of course.
|
||||
*/
|
||||
public void fitToSize() {
|
||||
if (size() != getPopulationSize()) {
|
||||
while (size() > getPopulationSize()) remove(size()-1);
|
||||
if (size() < getPopulationSize()) {
|
||||
if (size() != getTargetSize()) {
|
||||
while (size() > getTargetSize()) remove(size()-1);
|
||||
if (size() < getTargetSize()) {
|
||||
if (size() == 0) System.err.println("Cannot grow empty population!");
|
||||
else {
|
||||
int origSize=size();
|
||||
int k=0;
|
||||
while (size()< getPopulationSize()) {
|
||||
while (size()< getTargetSize()) {
|
||||
addIndividual((AbstractEAIndividual)getEAIndividual(k%origSize).clone());
|
||||
}
|
||||
}
|
||||
@ -1530,7 +1528,7 @@ public class Population extends ArrayList implements PopulationInterface, Clonea
|
||||
*
|
||||
*/
|
||||
public void synchSize() {
|
||||
setPopulationSize(size());
|
||||
setTargetSize(size());
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1577,6 +1575,30 @@ public class Population extends ArrayList implements PopulationInterface, Clonea
|
||||
// else return ((hashes.head().equals(evaluationTimeHashes.head())) && (hashes.tail().equals(evaluationTimeHashes.tail())) && (evaluationTimeModCount == modCount));
|
||||
// }
|
||||
|
||||
/**
|
||||
* Return true if the targeted size of the population has been reached.
|
||||
*/
|
||||
public boolean targetSizeReached() {
|
||||
return this.size()>=this.getTargetSize();
|
||||
}
|
||||
|
||||
/**
|
||||
* Return true if the targeted size of the population has been exceeded.
|
||||
*/
|
||||
public boolean targetSizeExceeded() {
|
||||
return this.size()>this.getTargetSize();
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the number of free individual slots until the target size is reached.
|
||||
* Returns zero if the target size is already reached or exceeded.
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
public int getFreeSlots() {
|
||||
return Math.max(0, this.getTargetSize() - this.size());
|
||||
}
|
||||
|
||||
// /**
|
||||
// * Mark the population at the current state as evaluated. Changes to the modCount or hashes of individuals
|
||||
// * will invalidate the mark.
|
||||
|
@ -158,7 +158,7 @@ public abstract class AbstractDynTransProblem extends AbstractSynchronousOptimiz
|
||||
this.prob = prob;
|
||||
/* to get the right values for problemDimension and Range */
|
||||
Population pop = new Population();
|
||||
pop.setPopulationSize(1);
|
||||
pop.setTargetSize(1);
|
||||
prob.initPopulation(pop);
|
||||
AbstractEAIndividual indy = (AbstractEAIndividual)pop.get(0);
|
||||
if (indy instanceof InterfaceDataTypeDouble) {
|
||||
|
@ -79,7 +79,7 @@ public abstract class AbstractMultiModalProblemKnown extends AbstractProblemDoub
|
||||
// this.m_ProblemDimension = 2;
|
||||
((InterfaceDataTypeDouble)this.m_Template).setDoubleDataLength(this.m_ProblemDimension);
|
||||
((InterfaceDataTypeDouble)this.m_Template).SetDoubleRange(makeRange());
|
||||
for (int i = 0; i < population.getPopulationSize(); i++) {
|
||||
for (int i = 0; i < population.getTargetSize(); i++) {
|
||||
tmpIndy = (AbstractEAIndividual)((AbstractEAIndividual)this.m_Template).clone();
|
||||
tmpIndy.init(this);
|
||||
population.add(tmpIndy);
|
||||
|
@ -181,68 +181,22 @@ public abstract class AbstractMultiObjectiveOptimizationProblem extends Abstract
|
||||
public void resetParetoFront() {
|
||||
this.m_ParetoFront = new Population();
|
||||
}
|
||||
|
||||
/** This method evaluates a given population and set the fitness values
|
||||
* accordingly
|
||||
* @param population The population that is to be evaluated.
|
||||
*/
|
||||
public void evaluate(Population population) {
|
||||
AbstractEAIndividual tmpIndy;
|
||||
double[] fitness;
|
||||
|
||||
evaluatePopulationStart(population);
|
||||
|
||||
|
||||
if (this.parallelthreads > 1) {
|
||||
Vector<AbstractEAIndividual> queue = new Vector<AbstractEAIndividual>();
|
||||
Vector<AbstractEAIndividual> finished = new Vector<AbstractEAIndividual>();
|
||||
queue.addAll(population);
|
||||
/* Semaphore available=new Semaphore(parallelthreads);
|
||||
while (finished.size() < population.size()) {
|
||||
try {
|
||||
available.acquire();
|
||||
} catch (InterruptedException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
}
|
||||
if ((population.size()-(queue.size() + finished.size())) < parallelthreads) {
|
||||
if (queue.size() > 0) {
|
||||
AbstractEAIndividual tmpindy = queue.get(0);
|
||||
queue.remove(0);
|
||||
tmpindy.resetConstraintViolation();
|
||||
MultiObjectiveEvalThread evalthread = new MultiObjectiveEvalThread(this,tmpindy,finished,population,available);
|
||||
evalthread.start();
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
*/
|
||||
Semaphore sema=new Semaphore(0);
|
||||
ExecutorService pool = Executors.newFixedThreadPool(parallelthreads);
|
||||
for (int i = 0; i < population.size(); i++){
|
||||
AbstractEAIndividual tmpindy = (AbstractEAIndividual)population.get(i);
|
||||
tmpindy.resetConstraintViolation();
|
||||
EvalThread evalthread = new EvalThread(this,tmpindy,finished,population,sema);
|
||||
pool.execute(evalthread);
|
||||
|
||||
}
|
||||
try {
|
||||
sema.acquire(population.size());
|
||||
} catch (InterruptedException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
}
|
||||
pool.shutdownNow();
|
||||
}else {
|
||||
// first evaluate the population
|
||||
for (int i = 0; i < population.size(); i++) {
|
||||
tmpIndy = (AbstractEAIndividual) population.get(i);
|
||||
tmpIndy.resetConstraintViolation();
|
||||
this.evaluate(tmpIndy);
|
||||
|
||||
public void evaluatePopulationStart(Population population) {
|
||||
super.evaluatePopulationStart(population);
|
||||
if (this.m_Show && (this.m_Plot==null)) this.initProblemFrame();
|
||||
}
|
||||
|
||||
public void evaluatePopulationEnd(Population population) {
|
||||
super.evaluatePopulationEnd(population);
|
||||
double[] fitness;
|
||||
|
||||
for (int i = 0; i < population.size(); i++) {
|
||||
// check and update border if necessary
|
||||
AbstractEAIndividual tmpIndy = (AbstractEAIndividual) population.get(i);
|
||||
fitness = tmpIndy.getFitness();
|
||||
// check and update border if necessary
|
||||
if (m_Border == null)
|
||||
this.m_Border = new double[fitness.length][2];
|
||||
if (m_Border == null) this.m_Border = new double[fitness.length][2];
|
||||
else if (fitness.length != this.m_Border.length) {
|
||||
//System.out.println("AbstractMOOptimizationProblem: Warning fitness.length("+fitness.length+") doesn't fit border.length("+this.m_Border.length+")");
|
||||
//System.out.println("Resetting the border!");
|
||||
@ -257,17 +211,8 @@ public abstract class AbstractMultiObjectiveOptimizationProblem extends Abstract
|
||||
this.m_Border[j][0] = Math.min(this.m_Border[j][0], fitness[j]);
|
||||
this.m_Border[j][1] = Math.max(this.m_Border[j][1], fitness[j]);
|
||||
}
|
||||
population.incrFunctionCalls();
|
||||
}
|
||||
}
|
||||
evaluatePopulationEnd(population); // refactored by MK
|
||||
}
|
||||
|
||||
public void evaluatePopulationStart(Population population) {
|
||||
if (this.m_Show && (this.m_Plot==null)) this.initProblemFrame();
|
||||
}
|
||||
|
||||
public void evaluatePopulationEnd(Population population) {
|
||||
|
||||
// So what is the problem:
|
||||
// on the one hand i want to log the pareto-front in the
|
||||
// multiobjective case
|
||||
|
@ -1,12 +1,11 @@
|
||||
package eva2.server.go.problems;
|
||||
|
||||
import java.awt.BorderLayout;
|
||||
import java.util.Vector;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.Semaphore;
|
||||
import java.io.Serializable;
|
||||
|
||||
import java.util.Vector;
|
||||
|
||||
import javax.swing.JComponent;
|
||||
import javax.swing.JPanel;
|
||||
@ -42,14 +41,14 @@ public abstract class AbstractOptimizationProblem implements InterfaceOptimizati
|
||||
class EvalThread extends Thread {
|
||||
AbstractOptimizationProblem prob;
|
||||
AbstractEAIndividual ind;
|
||||
Vector<AbstractEAIndividual> resultrep;
|
||||
// Vector<AbstractEAIndividual> resultrep;
|
||||
Population pop;
|
||||
Semaphore m_Semaphore;
|
||||
|
||||
public EvalThread(AbstractOptimizationProblem prob, AbstractEAIndividual ind, Vector<AbstractEAIndividual> resultrep, Population pop,Semaphore sema) {
|
||||
public EvalThread(AbstractOptimizationProblem prob, AbstractEAIndividual ind, Population pop,Semaphore sema) {
|
||||
this.ind = ind;
|
||||
this.prob = prob;
|
||||
this.resultrep = resultrep;
|
||||
// this.resultrep = resultrep;
|
||||
this.pop = pop;
|
||||
this.m_Semaphore=sema;
|
||||
}
|
||||
@ -58,7 +57,7 @@ public abstract class AbstractOptimizationProblem implements InterfaceOptimizati
|
||||
// System.out.println("Running ET " + this);
|
||||
// long time=System.nanoTime();
|
||||
prob.evaluate(ind);
|
||||
resultrep.add(ind);
|
||||
// resultrep.add(ind);
|
||||
pop.incrFunctionCalls();
|
||||
m_Semaphore.release();
|
||||
// long duration=System.nanoTime()-time;
|
||||
@ -110,7 +109,7 @@ public abstract class AbstractOptimizationProblem implements InterfaceOptimizati
|
||||
|
||||
if (this.parallelthreads > 1) {
|
||||
Vector<AbstractEAIndividual> queue = new Vector<AbstractEAIndividual>(population.size());
|
||||
Vector<AbstractEAIndividual> finished = new Vector<AbstractEAIndividual>(population.size());
|
||||
// Vector<AbstractEAIndividual> finished = new Vector<AbstractEAIndividual>(population.size());
|
||||
/* queue.addAll(population);
|
||||
Semaphore sema=new Semaphore(parallelthreads);
|
||||
while (finished.size() < population.size()) {
|
||||
@ -132,19 +131,19 @@ public abstract class AbstractOptimizationProblem implements InterfaceOptimizati
|
||||
}
|
||||
}*/
|
||||
Semaphore sema=new Semaphore(0);
|
||||
ExecutorService pool = Executors.newFixedThreadPool(parallelthreads);
|
||||
for (int i = 0; i < population.size(); i++){
|
||||
AbstractEAIndividual tmpindy = (AbstractEAIndividual)population.get(i);
|
||||
ExecutorService pool = Executors.newFixedThreadPool(parallelthreads);
|
||||
int cntIndies=0;
|
||||
for (; cntIndies < population.size(); cntIndies++){
|
||||
AbstractEAIndividual tmpindy = (AbstractEAIndividual)population.get(cntIndies);
|
||||
tmpindy.resetConstraintViolation();
|
||||
EvalThread evalthread = new EvalThread(this,tmpindy,finished,population,sema);
|
||||
EvalThread evalthread = new EvalThread(this,tmpindy,population,sema);
|
||||
pool.execute(evalthread);
|
||||
|
||||
}
|
||||
try {
|
||||
sema.acquire(population.size());
|
||||
sema.acquire(cntIndies);
|
||||
} catch (InterruptedException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
throw new RuntimeException("Threading error in AbstractOptimizationProblem: " + e.getMessage());
|
||||
}
|
||||
pool.shutdownNow();
|
||||
} else {
|
||||
@ -185,6 +184,21 @@ public abstract class AbstractOptimizationProblem implements InterfaceOptimizati
|
||||
*/
|
||||
public abstract void evaluate(AbstractEAIndividual individual);
|
||||
|
||||
|
||||
public static void defaultInitPopulation(Population population, AbstractEAIndividual template, InterfaceOptimizationProblem prob) {
|
||||
AbstractEAIndividual tmpIndy;
|
||||
population.clear();
|
||||
|
||||
for (int i = 0; i < population.getTargetSize(); i++) {
|
||||
tmpIndy = (AbstractEAIndividual)((AbstractEAIndividual)template).clone();
|
||||
tmpIndy.init(prob);
|
||||
population.add(tmpIndy);
|
||||
}
|
||||
// population init must be last
|
||||
// it set's fitcalls and generation to zero
|
||||
population.init();
|
||||
}
|
||||
|
||||
/******************** Some output methods *******************************************/
|
||||
|
||||
/** This method allows you to output a string that describes a found solution
|
||||
|
@ -55,31 +55,20 @@ public abstract class AbstractProblemBinary extends AbstractOptimizationProblem
|
||||
*/
|
||||
public abstract int getProblemDimension();
|
||||
|
||||
/**
|
||||
* Initialize a single individual with index k in the
|
||||
* initPopulation cycle.
|
||||
* @param k
|
||||
* @param indy
|
||||
*/
|
||||
protected void initIndy(int k, AbstractEAIndividual indy) {
|
||||
indy.init(this);
|
||||
}
|
||||
// /**
|
||||
// * Initialize a single individual with index k in the
|
||||
// * initPopulation cycle.
|
||||
// * @param k
|
||||
// * @param indy
|
||||
// */
|
||||
// protected void initIndy(int k, AbstractEAIndividual indy) {
|
||||
// indy.init(this);
|
||||
// }
|
||||
|
||||
@Override
|
||||
public void initPopulation(Population population) {
|
||||
AbstractEAIndividual tmpIndy;
|
||||
population.clear();
|
||||
|
||||
((InterfaceDataTypeBinary)this.m_Template).setBinaryDataLength(this.getProblemDimension());
|
||||
|
||||
for (int i = 0; i < population.getPopulationSize(); i++) {
|
||||
tmpIndy = (AbstractEAIndividual)((AbstractEAIndividual)this.m_Template).clone();
|
||||
initIndy(i, tmpIndy);
|
||||
population.add(tmpIndy);
|
||||
}
|
||||
// population init must be last
|
||||
// it set's fitcalls and generation to zero
|
||||
population.init();
|
||||
AbstractOptimizationProblem.defaultInitPopulation(population, m_Template, this);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -155,18 +155,8 @@ public abstract class AbstractProblemDouble extends AbstractOptimizationProblem
|
||||
|
||||
@Override
|
||||
public void initPopulation(Population population) {
|
||||
AbstractEAIndividual tmpIndy;
|
||||
population.clear();
|
||||
initTemplate();
|
||||
|
||||
for (int i = 0; i < population.getPopulationSize(); i++) {
|
||||
tmpIndy = (AbstractEAIndividual)((AbstractEAIndividual)this.m_Template).clone();
|
||||
tmpIndy.init(this);
|
||||
population.add(tmpIndy);
|
||||
}
|
||||
// population init must be last
|
||||
// it set's fitcalls and generation to zero
|
||||
population.init();
|
||||
AbstractOptimizationProblem.defaultInitPopulation(population, m_Template, this);
|
||||
}
|
||||
|
||||
/**
|
||||
|
99
src/eva2/server/go/problems/AbstractProblemDoubleOffset.java
Normal file
99
src/eva2/server/go/problems/AbstractProblemDoubleOffset.java
Normal file
@ -0,0 +1,99 @@
|
||||
package eva2.server.go.problems;
|
||||
|
||||
/**
|
||||
* Created by IntelliJ IDEA.
|
||||
* User: streiche
|
||||
* Date: 24.03.2003
|
||||
* Time: 17:58:55
|
||||
* To change this template use Options | File Templates.
|
||||
*/
|
||||
public abstract class AbstractProblemDoubleOffset extends AbstractProblemDouble implements Interface2DBorderProblem {
|
||||
|
||||
// protected AbstractEAIndividual m_OverallBest = null;
|
||||
protected int m_ProblemDimension = 10;
|
||||
protected double m_XOffSet = 0.0;
|
||||
protected double m_YOffSet = 0.0;
|
||||
// protected boolean m_UseTestConstraint = false;
|
||||
|
||||
public AbstractProblemDoubleOffset() {
|
||||
super();
|
||||
setDefaultRange(10);
|
||||
}
|
||||
|
||||
public AbstractProblemDoubleOffset(AbstractProblemDoubleOffset b) {
|
||||
super();
|
||||
super.cloneObjects(b);
|
||||
this.m_ProblemDimension = b.m_ProblemDimension;
|
||||
this.m_XOffSet = b.m_XOffSet;
|
||||
this.m_YOffSet = b.m_YOffSet;
|
||||
// this.m_UseTestConstraint = b.m_UseTestConstraint;
|
||||
}
|
||||
|
||||
public AbstractProblemDoubleOffset(int dim) {
|
||||
this();
|
||||
setProblemDimension(dim);
|
||||
}
|
||||
|
||||
public AbstractProblemDoubleOffset(int dim, double defRange) {
|
||||
this(dim);
|
||||
setDefaultRange(defRange);
|
||||
}
|
||||
|
||||
/** This method inits the Problem to log multiruns
|
||||
*/
|
||||
public void initProblem() {
|
||||
// this.m_OverallBest = null;
|
||||
initTemplate();
|
||||
}
|
||||
|
||||
/**********************************************************************************************************************
|
||||
* These are for GUI
|
||||
*/
|
||||
/** This method allows the CommonJavaObjectEditorPanel to read the
|
||||
* name to the current object.
|
||||
* @return The name.
|
||||
*/
|
||||
public String getName() {
|
||||
return "Double-valued-Problem+Offsets";
|
||||
}
|
||||
|
||||
/** This method allows you to set/get an offset for decision variables.
|
||||
* @param XOffSet The offset for the decision variables.
|
||||
*/
|
||||
public void setXOffSet(double XOffSet) {
|
||||
this.m_XOffSet = XOffSet;
|
||||
}
|
||||
public double getXOffSet() {
|
||||
return this.m_XOffSet;
|
||||
}
|
||||
public String xOffSetTipText() {
|
||||
return "Choose an offset for the decision variable.";
|
||||
}
|
||||
|
||||
/** This method allows you to set/get the offset for the
|
||||
* objective value.
|
||||
* @param YOffSet The offset for the objective value.
|
||||
*/
|
||||
public void setYOffSet(double YOffSet) {
|
||||
this.m_YOffSet = YOffSet;
|
||||
}
|
||||
public double getYOffSet() {
|
||||
return this.m_YOffSet;
|
||||
}
|
||||
public String yOffSetTipText() {
|
||||
return "Choose an offset for the objective value.";
|
||||
}
|
||||
/** Length of the x vector at is to be optimized
|
||||
* @param t Length of the x vector at is to be optimized
|
||||
*/
|
||||
public void setProblemDimension(int t) {
|
||||
this.m_ProblemDimension = t;
|
||||
}
|
||||
public int getProblemDimension() {
|
||||
return this.m_ProblemDimension;
|
||||
}
|
||||
public String problemDimensionTipText() {
|
||||
return "Length of the x vector to be optimized.";
|
||||
}
|
||||
}
|
||||
|
@ -105,23 +105,12 @@ public class ExternalRuntimeProblem extends AbstractOptimizationProblem implemen
|
||||
* @param population The populations that is to be inited
|
||||
*/
|
||||
public void initPopulation(Population population) {
|
||||
AbstractEAIndividual tmpIndy;
|
||||
|
||||
this.m_OverallBest = null;
|
||||
|
||||
population.clear();
|
||||
|
||||
((InterfaceDataTypeDouble)this.m_Template).setDoubleDataLength(this.m_ProblemDimension);
|
||||
((InterfaceDataTypeDouble)this.m_Template).SetDoubleRange(makeRange());
|
||||
|
||||
for (int i = 0; i < population.getPopulationSize(); i++) {
|
||||
tmpIndy = (AbstractEAIndividual)((AbstractEAIndividual)this.m_Template).clone();
|
||||
tmpIndy.init(this);
|
||||
population.add(tmpIndy);
|
||||
}
|
||||
// population init must be last
|
||||
// it set's fitcalls and generation to zero
|
||||
population.init();
|
||||
AbstractOptimizationProblem.defaultInitPopulation(population, m_Template, this);
|
||||
}
|
||||
|
||||
public double[][] makeRange() {
|
||||
|
@ -9,7 +9,7 @@ import eva2.server.go.individuals.ESIndividualDoubleData;
|
||||
* Time: 14:33:07
|
||||
* To change this template use File | Settings | File Templates.
|
||||
*/
|
||||
public class F10Problem extends F1Problem implements InterfaceMultimodalProblem, java.io.Serializable {
|
||||
public class F10Problem extends AbstractProblemDoubleOffset implements InterfaceMultimodalProblem, java.io.Serializable {
|
||||
|
||||
private double m_D = 1.5;
|
||||
private double m_b = 2.3;
|
||||
|
@ -12,7 +12,7 @@ import eva2.server.go.populations.Population;
|
||||
* Time: 14:59:23
|
||||
* To change this template use File | Settings | File Templates.
|
||||
*/
|
||||
public class F11Problem extends F1Problem implements InterfaceMultimodalProblem, java.io.Serializable {
|
||||
public class F11Problem extends AbstractProblemDoubleOffset implements InterfaceMultimodalProblem, java.io.Serializable {
|
||||
|
||||
private double m_D = 4000;
|
||||
|
||||
|
@ -12,7 +12,7 @@ import eva2.server.go.populations.Population;
|
||||
* Time: 14:59:33
|
||||
* To change this template use File | Settings | File Templates.
|
||||
*/
|
||||
public class F12Problem extends F1Problem implements java.io.Serializable {
|
||||
public class F12Problem extends AbstractProblemDoubleOffset implements java.io.Serializable {
|
||||
private final static double f12range = 5.;
|
||||
|
||||
public F12Problem() {
|
||||
|
@ -6,7 +6,7 @@ import eva2.server.go.individuals.ESIndividualDoubleData;
|
||||
* Schwefels sine root function (1981) with a minimum at 420.9687^n of value 0.
|
||||
* Function f(x) = (418.9829 * n) - sum_n(x_i * sin(sqrt(abs(x_i)))) + (418.9829 * n);
|
||||
*/
|
||||
public class F13Problem extends F1Problem implements InterfaceMultimodalProblem {
|
||||
public class F13Problem extends AbstractProblemDoubleOffset implements InterfaceMultimodalProblem {
|
||||
|
||||
public F13Problem() {
|
||||
this.m_Template = new ESIndividualDoubleData();
|
||||
|
@ -9,7 +9,7 @@ import eva2.server.go.individuals.ESIndividualDoubleData;
|
||||
* Time: 19:15:03
|
||||
* To change this template use File | Settings | File Templates.
|
||||
*/
|
||||
public class F14Problem extends F1Problem implements InterfaceMultimodalProblem, java.io.Serializable {
|
||||
public class F14Problem extends AbstractProblemDoubleOffset implements InterfaceMultimodalProblem, java.io.Serializable {
|
||||
double rotation = 0.;
|
||||
double rotationDX = 2;
|
||||
|
||||
|
@ -1,7 +1,5 @@
|
||||
package eva2.server.go.problems;
|
||||
|
||||
import eva2.server.go.individuals.AbstractEAIndividual;
|
||||
import eva2.server.go.operators.constraint.GenericConstraint;
|
||||
import eva2.server.go.strategies.InterfaceOptimizer;
|
||||
|
||||
/**
|
||||
@ -11,18 +9,7 @@ import eva2.server.go.strategies.InterfaceOptimizer;
|
||||
* Time: 17:58:55
|
||||
* To change this template use Options | File Templates.
|
||||
*/
|
||||
public class F1Problem extends AbstractProblemDouble implements Interface2DBorderProblem, java.io.Serializable {
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
private static final long serialVersionUID = 4870484001737601464L;
|
||||
// protected AbstractEAIndividual m_OverallBest = null;
|
||||
protected int m_ProblemDimension = 10;
|
||||
protected double m_XOffSet = 0.0;
|
||||
protected double m_YOffSet = 0.0;
|
||||
// protected boolean m_UseTestConstraint = false;
|
||||
|
||||
public class F1Problem extends AbstractProblemDoubleOffset implements Interface2DBorderProblem, java.io.Serializable, InterfaceFirstOrderDerivableProblem {
|
||||
public F1Problem() {
|
||||
super();
|
||||
setDefaultRange(10);
|
||||
@ -31,15 +18,10 @@ public class F1Problem extends AbstractProblemDouble implements Interface2DBorde
|
||||
public F1Problem(F1Problem b) {
|
||||
super();
|
||||
super.cloneObjects(b);
|
||||
this.m_ProblemDimension = b.m_ProblemDimension;
|
||||
this.m_XOffSet = b.m_XOffSet;
|
||||
this.m_YOffSet = b.m_YOffSet;
|
||||
// this.m_UseTestConstraint = b.m_UseTestConstraint;
|
||||
}
|
||||
|
||||
public F1Problem(int dim) {
|
||||
this();
|
||||
setProblemDimension(dim);
|
||||
super(dim);
|
||||
}
|
||||
|
||||
public F1Problem(int dim, double defRange) {
|
||||
@ -54,13 +36,6 @@ public class F1Problem extends AbstractProblemDouble implements Interface2DBorde
|
||||
return (Object) new F1Problem(this);
|
||||
}
|
||||
|
||||
/** This method inits the Problem to log multiruns
|
||||
*/
|
||||
public void initProblem() {
|
||||
// this.m_OverallBest = null;
|
||||
initTemplate();
|
||||
}
|
||||
|
||||
/** Ths method allows you to evaluate a simple bit string to determine the fitness
|
||||
* @param x The n-dimensional input vector
|
||||
* @return The m-dimensional output vector.
|
||||
@ -110,54 +85,12 @@ public class F1Problem extends AbstractProblemDouble implements Interface2DBorde
|
||||
return "F1: multidimensional parabola problem";
|
||||
}
|
||||
|
||||
/** This method allows you to set/get an offset for decision variables.
|
||||
* @param XOffSet The offset for the decision variables.
|
||||
*/
|
||||
public void setXOffSet(double XOffSet) {
|
||||
this.m_XOffSet = XOffSet;
|
||||
}
|
||||
public double getXOffSet() {
|
||||
return this.m_XOffSet;
|
||||
}
|
||||
public String xOffSetTipText() {
|
||||
return "Choose an offset for the decision variable.";
|
||||
}
|
||||
|
||||
/** This method allows you to set/get the offset for the
|
||||
* objective value.
|
||||
* @param YOffSet The offset for the objective value.
|
||||
*/
|
||||
public void setYOffSet(double YOffSet) {
|
||||
this.m_YOffSet = YOffSet;
|
||||
}
|
||||
public double getYOffSet() {
|
||||
return this.m_YOffSet;
|
||||
}
|
||||
public String yOffSetTipText() {
|
||||
return "Choose an offset for the objective value.";
|
||||
}
|
||||
/** Length of the x vector at is to be optimized
|
||||
* @param t Length of the x vector at is to be optimized
|
||||
*/
|
||||
public void setProblemDimension(int t) {
|
||||
this.m_ProblemDimension = t;
|
||||
}
|
||||
public int getProblemDimension() {
|
||||
return this.m_ProblemDimension;
|
||||
}
|
||||
public String problemDimensionTipText() {
|
||||
return "Length of the x vector to be optimized.";
|
||||
}
|
||||
// /** This method allows you to toggle the application of a simple test constraint.
|
||||
// * @param b The mode for the test constraint
|
||||
// */
|
||||
// public void setUseTestConstraint(boolean b) {
|
||||
// this.m_UseTestConstraint = b;
|
||||
// }
|
||||
// public boolean getUseTestConstraint() {
|
||||
// return this.m_UseTestConstraint;
|
||||
// }
|
||||
// public String useTestConstraintTipText() {
|
||||
// return "Just a simple test constraint of x[0] >= 1.";
|
||||
// }
|
||||
public double[] getFirstOrderGradients(double[] x) {
|
||||
// first order partial derivation in direction x_i is 2*x_i
|
||||
double[] grads=new double[x.length];
|
||||
for (int i=0; i<x.length; i++) {
|
||||
grads[i]=(2.*(x[i] - this.m_XOffSet));
|
||||
}
|
||||
return grads;
|
||||
}
|
||||
}
|
||||
|
@ -9,7 +9,7 @@ import eva2.server.go.individuals.ESIndividualDoubleData;
|
||||
* Time: 19:03:09
|
||||
* To change this template use File | Settings | File Templates.
|
||||
*/
|
||||
public class F2Problem extends F1Problem implements InterfaceMultimodalProblem, java.io.Serializable {
|
||||
public class F2Problem extends AbstractProblemDoubleOffset implements InterfaceMultimodalProblem, java.io.Serializable, InterfaceFirstOrderDerivableProblem {
|
||||
|
||||
public F2Problem() {
|
||||
this.m_Template = new ESIndividualDoubleData();
|
||||
@ -44,7 +44,22 @@ public class F2Problem extends F1Problem implements InterfaceMultimodalProblem,
|
||||
if (m_YOffSet==0 && (result[0]<=0)) result[0]=Math.sqrt(Double.MIN_VALUE); // guard for plots in log scale
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
public double[] getFirstOrderGradients(double[] x) {
|
||||
int dim = x.length;
|
||||
double[] result = new double[dim];
|
||||
double xi, xii;
|
||||
|
||||
for (int i = 0; i < dim-1; i++) {
|
||||
xi=x[i]-m_XOffSet;
|
||||
xii=x[i+1]-m_XOffSet;
|
||||
|
||||
result[i] += (-200.*xii+200.*xi+2.*xi-2);
|
||||
result[i+1] += (200.*xii-200*xi);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/** This method returns a string describing the optimization problem.
|
||||
* @return The description.
|
||||
*/
|
||||
|
@ -10,7 +10,7 @@ import eva2.server.go.individuals.ESIndividualDoubleData;
|
||||
* Time: 19:15:03
|
||||
* To change this template use File | Settings | File Templates.
|
||||
*/
|
||||
public class F3Problem extends F1Problem implements java.io.Serializable {
|
||||
public class F3Problem extends AbstractProblemDoubleOffset implements java.io.Serializable {
|
||||
|
||||
public F3Problem() {
|
||||
this.m_Template = new ESIndividualDoubleData();
|
||||
|
@ -13,7 +13,7 @@ import eva2.tools.math.RNG;
|
||||
* Time: 19:28:33
|
||||
* To change this template use File | Settings | File Templates.
|
||||
*/
|
||||
public class F4Problem extends F1Problem implements java.io.Serializable {
|
||||
public class F4Problem extends AbstractProblemDoubleOffset implements java.io.Serializable {
|
||||
final static double f4range = 1.28;
|
||||
|
||||
public F4Problem() {
|
||||
|
@ -13,7 +13,7 @@ import eva2.tools.math.RNG;
|
||||
* Time: 19:30:52
|
||||
* To change this template use File | Settings | File Templates.
|
||||
*/
|
||||
public class F5Problem extends F1Problem implements java.io.Serializable {
|
||||
public class F5Problem extends AbstractProblemDoubleOffset implements java.io.Serializable {
|
||||
final static double f5range = 65.536;
|
||||
|
||||
public F5Problem() {
|
||||
|
@ -11,7 +11,7 @@ import eva2.tools.math.Jama.Matrix;
|
||||
* Time: 13:09:36
|
||||
* To change this template use File | Settings | File Templates.
|
||||
*/
|
||||
public class F6Problem extends F1Problem implements InterfaceMultimodalProblem, java.io.Serializable {
|
||||
public class F6Problem extends AbstractProblemDoubleOffset implements InterfaceMultimodalProblem, java.io.Serializable {
|
||||
|
||||
private boolean doRotation = false;
|
||||
private double m_A = 10;
|
||||
|
@ -15,7 +15,7 @@ import eva2.tools.math.RNG;
|
||||
* Time: 13:23:43
|
||||
* To change this template use File | Settings | File Templates.
|
||||
*/
|
||||
public class F7Problem extends F1Problem implements java.io.Serializable {
|
||||
public class F7Problem extends AbstractProblemDoubleOffset implements java.io.Serializable {
|
||||
|
||||
private double m_t = 250;
|
||||
private double m_Change = 4;
|
||||
|
@ -8,7 +8,7 @@ package eva2.server.go.problems;
|
||||
* Time: 19:40:28
|
||||
* To change this template use File | Settings | File Templates.
|
||||
*/
|
||||
public class F8Problem extends F1Problem implements InterfaceMultimodalProblem, java.io.Serializable {
|
||||
public class F8Problem extends AbstractProblemDoubleOffset implements InterfaceMultimodalProblem, java.io.Serializable {
|
||||
|
||||
private double a = 20;
|
||||
private double b = 0.2;
|
||||
|
@ -3,7 +3,7 @@ package eva2.server.go.problems;
|
||||
import eva2.server.go.individuals.AbstractEAIndividual;
|
||||
import eva2.server.go.individuals.ESIndividualDoubleData;
|
||||
|
||||
public class F9Problem extends F1Problem implements java.io.Serializable {
|
||||
public class F9Problem extends AbstractProblemDoubleOffset implements java.io.Serializable {
|
||||
|
||||
public F9Problem() {
|
||||
this.m_Template = new ESIndividualDoubleData();
|
||||
|
@ -247,13 +247,8 @@ public class FLensProblem extends AbstractOptimizationProblem implements Interfa
|
||||
* @param population The populations that is to be inited
|
||||
*/
|
||||
public void initPopulation(Population population) {
|
||||
AbstractEAIndividual tmpIndy;
|
||||
|
||||
this.m_OverallBest = null;
|
||||
population.clear();
|
||||
|
||||
((InterfaceDataTypeDouble)this.m_Template).setDoubleDataLength(this.m_ProblemDimension);
|
||||
|
||||
// set the range
|
||||
double[][] range = new double[this.m_ProblemDimension][2];
|
||||
for (int i = 0; i < range.length; i++) {
|
||||
@ -262,13 +257,8 @@ public class FLensProblem extends AbstractOptimizationProblem implements Interfa
|
||||
}
|
||||
((InterfaceDataTypeDouble)this.m_Template).SetDoubleRange(range);
|
||||
|
||||
for (int i = 0; i < population.getPopulationSize(); i++) {
|
||||
tmpIndy = (AbstractEAIndividual)((AbstractEAIndividual)this.m_Template).clone();
|
||||
tmpIndy.init(this);
|
||||
population.add(tmpIndy);
|
||||
}
|
||||
AbstractOptimizationProblem.defaultInitPopulation(population, m_Template, this);
|
||||
if (this.m_Show) this.initProblemFrame();
|
||||
population.init();
|
||||
}
|
||||
|
||||
public void evaluatePopulationEnd(Population pop) {
|
||||
|
@ -1,18 +1,19 @@
|
||||
package eva2.server.go.problems;
|
||||
|
||||
/**
|
||||
* <p>Title: EvA2</p>
|
||||
* <p>Description: </p>
|
||||
* <p>Copyright: Copyright (c) 2003</p>
|
||||
* <p>Company: </p>
|
||||
* @author not attributable
|
||||
* @version 1.0
|
||||
* An interface for first-order derivable problems which can be used for gradient descent.
|
||||
*
|
||||
* @author hplanatscher, mkron
|
||||
*
|
||||
*/
|
||||
|
||||
public interface InterfaceFirstOrderDerivableProblem {
|
||||
|
||||
/**
|
||||
* Calculate the first order gradients of this problem.
|
||||
* @param x
|
||||
* @return the first order gradients of this problem
|
||||
*/
|
||||
public double[] getFirstOrderGradients(double[] x);
|
||||
public double getFirstOrderGradient(int paramindex,double[] x);
|
||||
|
||||
// public double getFirstOrderGradient(int paramindex,double[] x);
|
||||
|
||||
}
|
||||
|
@ -9,7 +9,7 @@ import eva2.server.go.individuals.codings.gp.GPArea;
|
||||
* Time: 14:43:03
|
||||
* To change this template use Options | File Templates.
|
||||
*/
|
||||
public interface InterfaceProgramProblem {
|
||||
public interface InterfaceProgramProblem extends InterfaceOptimizationProblem {
|
||||
|
||||
/** This method allows a GP program to sense the environment, e.g.
|
||||
* input values, current time etc
|
||||
|
@ -437,19 +437,8 @@ public class MatlabProblem extends AbstractOptimizationProblem implements Interf
|
||||
|
||||
@Override
|
||||
public void initPopulation(Population population) {
|
||||
AbstractEAIndividual tmpIndy;
|
||||
population.clear();
|
||||
initTemplate();
|
||||
|
||||
for (int i = 0; i < population.getPopulationSize(); i++) {
|
||||
tmpIndy = (AbstractEAIndividual)((AbstractEAIndividual)this.m_Template).clone();
|
||||
tmpIndy.init(this);
|
||||
// System.err.println("initPopulation: " + AbstractEAIndividual.getDefaultDataString(tmpIndy) + " , " + tmpIndy.getStringRepresentation());
|
||||
population.add(tmpIndy);
|
||||
}
|
||||
// population init must be last
|
||||
// it set's fitcalls and generation to zero
|
||||
population.init();
|
||||
AbstractOptimizationProblem.defaultInitPopulation(population, m_Template, this);
|
||||
}
|
||||
|
||||
public String getStringRepresentationForProblem(InterfaceOptimizer opt) {
|
||||
|
@ -143,9 +143,8 @@ public class PSymbolicRegression extends AbstractOptimizationProblem implements
|
||||
* @param population The populations that is to be inited
|
||||
*/
|
||||
public static void initPopulation(Population pop, InterfaceProgramProblem prob, boolean useInnerConsts, int numConsts) {
|
||||
AbstractEAIndividual tmpIndy, template;
|
||||
AbstractEAIndividual template;
|
||||
|
||||
pop.clear();
|
||||
template = ((AbstractOptimizationProblem)prob).getIndividualTemplate();
|
||||
GPArea tmpArea[] = new GPArea[1];
|
||||
tmpArea[0] = prob.getArea();
|
||||
@ -154,14 +153,7 @@ public class PSymbolicRegression extends AbstractOptimizationProblem implements
|
||||
if ((template instanceof GAPIndividualProgramData) && useInnerConsts) {
|
||||
((GAPIndividualProgramData)template).setDoubleDataLength(numConsts);
|
||||
}
|
||||
for (int i = 0; i < pop.getPopulationSize(); i++) {
|
||||
tmpIndy = (AbstractEAIndividual)((AbstractEAIndividual)template).clone();
|
||||
tmpIndy.init((AbstractOptimizationProblem)prob);
|
||||
pop.add(tmpIndy);
|
||||
}
|
||||
// population init must be last
|
||||
// it set's fitcalls and generation to zero
|
||||
pop.init();
|
||||
AbstractOptimizationProblem.defaultInitPopulation(pop, template, prob);
|
||||
}
|
||||
|
||||
/** This method init the enviroment panel if necessary.
|
||||
@ -238,6 +230,7 @@ public class PSymbolicRegression extends AbstractOptimizationProblem implements
|
||||
if ((this.m_OverallBest == null) || (this.m_OverallBest.getFitness(0) > individual.getFitness(0))) {
|
||||
this.m_OverallBest = (AbstractEAIndividual)individual.clone();
|
||||
if (this.m_Show) {
|
||||
if (m_Plot==null) this.initEnvironmentPanel();
|
||||
this.m_Plot.clearAll();
|
||||
program = ((InterfaceDataTypeProgram)this.m_OverallBest).getProgramData()[0];
|
||||
for (double i = 0; i < this.m_NumberOfCheckPoints; i++) {
|
||||
|
@ -101,20 +101,8 @@ public class SimpleProblemWrapper extends AbstractOptimizationProblem {
|
||||
|
||||
@Override
|
||||
public void initPopulation(Population population) {
|
||||
AbstractEAIndividual tmpIndy;
|
||||
population.clear();
|
||||
|
||||
initTemplate();
|
||||
|
||||
for (int i = 0; i < population.getPopulationSize(); i++) {
|
||||
tmpIndy = (AbstractEAIndividual)((AbstractEAIndividual)this.m_Template).clone();
|
||||
tmpIndy.init(this);
|
||||
population.add(tmpIndy);
|
||||
}
|
||||
// population init must be last
|
||||
// it set's fitcalls and generation to zero
|
||||
population.init();
|
||||
|
||||
AbstractOptimizationProblem.defaultInitPopulation(population, m_Template, this);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -90,23 +90,14 @@ public class TF1Problem extends AbstractMultiObjectiveOptimizationProblem implem
|
||||
* @param population The populations that is to be inited
|
||||
*/
|
||||
public void initPopulation(Population population) {
|
||||
AbstractEAIndividual tmpIndy;
|
||||
this.m_ParetoFront = new Population();
|
||||
|
||||
double[][] newRange = makeRange();
|
||||
|
||||
population.clear();
|
||||
|
||||
((InterfaceDataTypeDouble)this.m_Template).setDoubleDataLength(this.m_ProblemDimension);
|
||||
((InterfaceDataTypeDouble)this.m_Template).SetDoubleRange(newRange);
|
||||
for (int i = 0; i < population.getPopulationSize(); i++) {
|
||||
tmpIndy = (AbstractEAIndividual)((AbstractEAIndividual)this.m_Template).clone();
|
||||
tmpIndy.init(this);
|
||||
population.add(tmpIndy);
|
||||
}
|
||||
// population init must be last
|
||||
// it set's fitcalls and generation to zero
|
||||
population.init();
|
||||
|
||||
AbstractOptimizationProblem.defaultInitPopulation(population, m_Template, this);
|
||||
}
|
||||
|
||||
protected double[][] makeRange() {
|
||||
|
@ -118,7 +118,7 @@ public class CHCAdaptiveSearchAlgorithm implements InterfaceOptimizer, java.io.S
|
||||
//System.out.println("Population:"+this.m_Population.getSolutionRepresentationFor());
|
||||
this.m_PopulSelectionOperator.prepareSelection(this.m_Population);
|
||||
this.m_RecombSelectionOperator.prepareSelection(this.m_Population);
|
||||
parents = this.m_PopulSelectionOperator.selectFrom(this.m_Population, this.m_Population.getPopulationSize());
|
||||
parents = this.m_PopulSelectionOperator.selectFrom(this.m_Population, this.m_Population.getTargetSize());
|
||||
//System.out.println("Parents:"+parents.getSolutionRepresentationFor());
|
||||
|
||||
for (int i = 0; i < parents.size(); i++) {
|
||||
@ -169,7 +169,7 @@ public class CHCAdaptiveSearchAlgorithm implements InterfaceOptimizer, java.io.S
|
||||
|
||||
this.m_Population.clear();
|
||||
this.m_Population.add(best);
|
||||
for (int i = 1; i < this.m_Population.getPopulationSize(); i++) {
|
||||
for (int i = 1; i < this.m_Population.getTargetSize(); i++) {
|
||||
mutant = (InterfaceGAIndividual)best.clone();
|
||||
tmpBitSet = mutant.getBGenotype();
|
||||
for (int j = 0; j < mutant.getGenotypeLength(); j++) {
|
||||
@ -207,7 +207,7 @@ public class CHCAdaptiveSearchAlgorithm implements InterfaceOptimizer, java.io.S
|
||||
nextGeneration.addPopulation(this.m_Population);
|
||||
// this.m_NormationOperator.computeSelectionProbability(nextGeneration, "Fitness");
|
||||
this.m_PopulSelectionOperator.prepareSelection(this.m_Population);
|
||||
tmp = this.m_PopulSelectionOperator.selectFrom(nextGeneration, this.m_Population.getPopulationSize());
|
||||
tmp = this.m_PopulSelectionOperator.selectFrom(nextGeneration, this.m_Population.getTargetSize());
|
||||
nextGeneration.clear();
|
||||
nextGeneration.addPopulation(tmp);
|
||||
this.m_Population = nextGeneration;
|
||||
|
@ -111,7 +111,7 @@ public class ClusterBasedNichingEA implements InterfacePopulationChangedEventLis
|
||||
this.m_Optimizer.addPopulationChangedEventListener(this);
|
||||
this.m_Undifferentiated = new Population();
|
||||
this.m_Undifferentiated.setUseHistory(true);
|
||||
this.m_Undifferentiated.setPopulationSize(this.m_PopulationSize);
|
||||
this.m_Undifferentiated.setTargetSize(this.m_PopulationSize);
|
||||
this.m_Species = new ArrayList<Population>();
|
||||
this.m_Problem.initPopulation(this.m_Undifferentiated);
|
||||
this.evaluatePopulation(this.m_Undifferentiated);
|
||||
@ -132,7 +132,7 @@ public class ClusterBasedNichingEA implements InterfacePopulationChangedEventLis
|
||||
pop.setUseHistory(true);
|
||||
this.m_Undifferentiated = (Population)pop.clone();
|
||||
if (reset) this.m_Undifferentiated.init();
|
||||
this.m_Undifferentiated.setPopulationSize(this.m_PopulationSize);
|
||||
this.m_Undifferentiated.setTargetSize(this.m_PopulationSize);
|
||||
this.m_Species = new ArrayList<Population>();
|
||||
m_Archive = new Population();
|
||||
convergedCnt = 0;
|
||||
@ -273,7 +273,7 @@ public class ClusterBasedNichingEA implements InterfacePopulationChangedEventLis
|
||||
private Population initializeIndividuals(int n) {
|
||||
Population result = new Population();
|
||||
result.setUseHistory(true);
|
||||
result.setPopulationSize(n);
|
||||
result.setTargetSize(n);
|
||||
//@todo: crossover between species is to be impelemented
|
||||
this.m_Problem.initPopulation(result);
|
||||
this.m_Problem.evaluate(result);
|
||||
@ -334,18 +334,18 @@ public class ClusterBasedNichingEA implements InterfacePopulationChangedEventLis
|
||||
if (TRACE) System.out.println("mu: "+es.getMu() + " / lambda: " + es.getLambda());
|
||||
}
|
||||
if (TRACE) {
|
||||
System.out.println("Bef: spec size: " + species.size() + ", says its " + species.getPopulationSize());
|
||||
System.out.println("Bef: spec size: " + species.size() + ", target size " + species.getTargetSize());
|
||||
System.out.println("Best bef: " + BeanInspector.toString(m_Optimizer.getPopulation().getBestFitness()));
|
||||
}
|
||||
this.m_Optimizer.optimize();
|
||||
Population retPop = m_Optimizer.getPopulation();
|
||||
if (TRACE) {
|
||||
System.out.println("Aft: spec size: " + retPop.size() + ", says its " + retPop.getPopulationSize());
|
||||
System.out.println("Aft: spec size: " + retPop.size() + ", target size " + retPop.getTargetSize());
|
||||
System.out.println("Best aft: " + BeanInspector.toString(retPop.getBestFitness()));
|
||||
}
|
||||
if (retPop.size() != retPop.getPopulationSize()) {
|
||||
if (TRACE) System.out.println("correcting popsize after opt: " + retPop.getPopulationSize() + " to " + retPop.size());
|
||||
retPop.setPopulationSize(retPop.size());
|
||||
if (retPop.size() != retPop.getTargetSize()) {
|
||||
if (TRACE) System.out.println("correcting popsize after opt: " + retPop.getTargetSize() + " to " + retPop.size());
|
||||
retPop.synchSize();
|
||||
}
|
||||
|
||||
// if (useDistraction) {
|
||||
@ -376,7 +376,7 @@ public class ClusterBasedNichingEA implements InterfacePopulationChangedEventLis
|
||||
}
|
||||
|
||||
// optimize D_0
|
||||
this.m_Undifferentiated.setPopulationSize(this.m_Undifferentiated.size());
|
||||
this.m_Undifferentiated.synchSize();
|
||||
if (isActive(m_Undifferentiated)) {
|
||||
this.capMutationRate(this.m_Undifferentiated, 0); // MK TODO this sets mutation rate to 0! why?
|
||||
m_Undifferentiated = optimizeSpecies(m_Undifferentiated);
|
||||
@ -398,7 +398,7 @@ public class ClusterBasedNichingEA implements InterfacePopulationChangedEventLis
|
||||
if (TRACE) System.out.println("-Deme " + i + " size: " + ((Population)this.m_Species.get(i)).size());
|
||||
curSpecies = ((Population)this.m_Species.get(i));
|
||||
curSpecies.SetFunctionCalls(0);
|
||||
curSpecies.setPopulationSize(curSpecies.size());
|
||||
curSpecies.synchSize();
|
||||
if (isActive(curSpecies)) {
|
||||
if ((haltingWindow > 0) && (this.testSpeciesForConvergence(curSpecies))) {
|
||||
///////////////////////////////////////////// Halting Window /////////////////////////////////////////////////
|
||||
@ -431,7 +431,7 @@ public class ClusterBasedNichingEA implements InterfacePopulationChangedEventLis
|
||||
// reinit the surplus individuals and add these new individuals to undifferentiated
|
||||
m_Undifferentiated.addPopulation(this.initializeIndividuals(reinitCount));
|
||||
m_Undifferentiated.incrFunctionCallsBy(reinitCount);
|
||||
m_Undifferentiated.setPopulationSize(this.m_Undifferentiated.getPopulationSize()+reinitCount);
|
||||
m_Undifferentiated.setTargetSize(this.m_Undifferentiated.getTargetSize()+reinitCount);
|
||||
// if (this.m_Debug) {
|
||||
// System.out.println("Undiff.Size: " + this.m_Undifferentiated.size() +"/"+this.m_Undifferentiated.getPopulationSize());
|
||||
// System.out.println("Diff.Size : " + ((Population)this.m_Species.get(i)).size() +"/"+((Population)this.m_Species.get(i)).getPopulationSize());
|
||||
@ -492,9 +492,9 @@ public class ClusterBasedNichingEA implements InterfacePopulationChangedEventLis
|
||||
ClusterResult = this.m_CAForSpeciesDifferentation.cluster(curSpecies);
|
||||
this.m_Undifferentiated.addPopulation(ClusterResult[0]);
|
||||
// ClusterResult[0].setUseHistory(true);
|
||||
this.m_Undifferentiated.setPopulationSize(this.m_Undifferentiated.getPopulationSize() + ClusterResult[0].size());
|
||||
this.m_Undifferentiated.setTargetSize(this.m_Undifferentiated.getTargetSize() + ClusterResult[0].size());
|
||||
for (int j = 1; j < ClusterResult.length; j++) { // set up new species
|
||||
ClusterResult[j].setPopulationSize(ClusterResult[j].size());
|
||||
ClusterResult[j].synchSize();
|
||||
ClusterResult[j].setUseHistory(true);
|
||||
// if (ClusterResult.length > 2) ClusterResult[j].m_History = new ArrayList(); // mk: why min 3? Ill copy the history from the original pop for any j...
|
||||
ClusterResult[j].m_History = (ArrayList<AbstractEAIndividual>) curSpecies.m_History.clone();
|
||||
@ -537,7 +537,7 @@ public class ClusterBasedNichingEA implements InterfacePopulationChangedEventLis
|
||||
this.m_Undifferentiated.remove(i);
|
||||
if (isActive(curSpecies)) {
|
||||
curSpecies.add(tmpIndy);
|
||||
this.m_Undifferentiated.setPopulationSize(this.m_Undifferentiated.getPopulationSize()-1);
|
||||
this.m_Undifferentiated.setTargetSize(this.m_Undifferentiated.getTargetSize()-1);
|
||||
i--; // needs to be reduced because D0 size has decreased
|
||||
} else {
|
||||
// the species is inactive and seen as converged, so reinitialize the individual
|
||||
@ -578,7 +578,7 @@ public class ClusterBasedNichingEA implements InterfacePopulationChangedEventLis
|
||||
// reinitialized individuals and add them to undifferentiated
|
||||
this.m_Undifferentiated.addPopulation(this.initializeIndividuals(reinitCount));
|
||||
// m_Undifferentiated.incrFunctionCallsby(reinitCount);
|
||||
this.m_Undifferentiated.setPopulationSize(this.m_Undifferentiated.getPopulationSize()+reinitCount);
|
||||
this.m_Undifferentiated.setTargetSize(this.m_Undifferentiated.getTargetSize()+reinitCount);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -639,7 +639,7 @@ public class ClusterBasedNichingEA implements InterfacePopulationChangedEventLis
|
||||
* @param spec
|
||||
*/
|
||||
protected void deactivateSpecies(Population spec, AbstractEAIndividual survivor) {
|
||||
spec.setPopulationSize(1);
|
||||
spec.setTargetSize(1);
|
||||
spec.clear();
|
||||
spec.add(survivor);
|
||||
}
|
||||
@ -736,7 +736,7 @@ public class ClusterBasedNichingEA implements InterfacePopulationChangedEventLis
|
||||
this.m_Population = (Population)m_Undifferentiated.clone();
|
||||
// m_Population.addPopulation(this.m_Undifferentiated);
|
||||
for (int i = 0; i < this.m_Species.size(); i++) this.m_Population.addPopulation((Population)this.m_Species.get(i));
|
||||
m_Population.setPopulationSize(m_Population.size()); // set it to true value
|
||||
m_Population.synchSize(); // set target size to current size
|
||||
return this.m_Population;
|
||||
}
|
||||
|
||||
@ -753,7 +753,7 @@ public class ClusterBasedNichingEA implements InterfacePopulationChangedEventLis
|
||||
// return inactive species
|
||||
Population sols = (Population)m_Archive.clone();
|
||||
sols.addPopulation(getPopulation());
|
||||
sols.setPopulationSize(sols.size());
|
||||
sols.synchSize();
|
||||
return new SolutionSet(getPopulation(), sols);
|
||||
}
|
||||
|
||||
|
@ -4,6 +4,7 @@ import java.io.Serializable;
|
||||
|
||||
import eva2.gui.GenericObjectEditor;
|
||||
import eva2.server.go.InterfacePopulationChangedEventListener;
|
||||
import eva2.server.go.PopulationInterface;
|
||||
import eva2.server.go.enums.PostProcessMethod;
|
||||
import eva2.server.go.operators.mutation.MutateESFixedStepSize;
|
||||
import eva2.server.go.operators.postprocess.PostProcess;
|
||||
@ -12,6 +13,7 @@ import eva2.server.go.populations.Population;
|
||||
import eva2.server.go.populations.SolutionSet;
|
||||
import eva2.server.go.problems.AbstractOptimizationProblem;
|
||||
import eva2.server.go.problems.F1Problem;
|
||||
import eva2.server.go.problems.InterfaceAdditionalPopulationInformer;
|
||||
import eva2.server.go.problems.InterfaceOptimizationProblem;
|
||||
import eva2.tools.Pair;
|
||||
|
||||
@ -31,7 +33,7 @@ import eva2.tools.Pair;
|
||||
* @author mkron
|
||||
*
|
||||
*/
|
||||
public class ClusteringHillClimbing implements InterfacePopulationChangedEventListener, InterfaceOptimizer, Serializable {
|
||||
public class ClusteringHillClimbing implements InterfacePopulationChangedEventListener, InterfaceOptimizer, Serializable, InterfaceAdditionalPopulationInformer {
|
||||
transient private InterfacePopulationChangedEventListener m_Listener;
|
||||
public static final boolean TRACE = false;
|
||||
|
||||
@ -52,6 +54,7 @@ public class ClusteringHillClimbing implements InterfacePopulationChangedEventLi
|
||||
private double reduceFactor = 0.2;
|
||||
private MutateESFixedStepSize mutator = new MutateESFixedStepSize(0.1);
|
||||
private PostProcessMethod localSearchMethod = PostProcessMethod.nelderMead;
|
||||
private boolean doReinitialization = true;
|
||||
|
||||
public ClusteringHillClimbing() {
|
||||
hideHideable();
|
||||
@ -83,6 +86,8 @@ public class ClusteringHillClimbing implements InterfacePopulationChangedEventLi
|
||||
*/
|
||||
public void hideHideable() {
|
||||
GenericObjectEditor.setHideProperty(getClass(), "population", true);
|
||||
setDoReinitialization(isDoReinitialization());
|
||||
setLocalSearchMethod(getLocalSearchMethod());
|
||||
}
|
||||
|
||||
public void SetIdentifier(String name) {
|
||||
@ -117,7 +122,7 @@ public class ClusteringHillClimbing implements InterfacePopulationChangedEventLi
|
||||
mutator = new MutateESFixedStepSize(initialStepSize);
|
||||
archive = new Population();
|
||||
hideHideable();
|
||||
m_Population.setPopulationSize(initialPopSize);
|
||||
m_Population.setTargetSize(initialPopSize);
|
||||
this.m_Problem.initPopulation(this.m_Population);
|
||||
m_Population.addPopulationChangedEventListener(null); // noone will be notified directly on pop changes
|
||||
this.m_Problem.evaluate(this.m_Population);
|
||||
@ -152,16 +157,26 @@ public class ClusteringHillClimbing implements InterfacePopulationChangedEventLi
|
||||
m_Population.addPopulationChangedEventListener(this);
|
||||
m_Population.setNotifyEvalInterval(notifyGuiEvery);
|
||||
Pair<Population, Double> popD;
|
||||
if (TRACE) System.out.println("evalCycle: " + hcEvalCycle + ", evals now: " + (2*hcEvalCycle - (m_Population.getFunctionCalls() % hcEvalCycle)));
|
||||
popD = PostProcess.clusterLocalSearch(localSearchMethod, m_Population, (AbstractOptimizationProblem)m_Problem, sigmaClust, 2*hcEvalCycle - (m_Population.getFunctionCalls() % hcEvalCycle), 0.5, mutator);
|
||||
// (m_Population, (AbstractOptimizationProblem)m_Problem, sigmaClust, hcEvalCycle - (m_Population.getFunctionCalls() % hcEvalCycle), 0.5);
|
||||
int funCallsBefore=m_Population.getFunctionCalls();
|
||||
int evalsNow, lastOverhead = (m_Population.getFunctionCalls() % hcEvalCycle);
|
||||
if (lastOverhead>0) evalsNow = (2*hcEvalCycle - (m_Population.getFunctionCalls() % hcEvalCycle));
|
||||
else evalsNow = hcEvalCycle;
|
||||
do {
|
||||
if (TRACE) System.out.println("evalCycle: " + hcEvalCycle + ", evals now: " + evalsNow);
|
||||
popD = PostProcess.clusterLocalSearch(localSearchMethod, m_Population, (AbstractOptimizationProblem)m_Problem, sigmaClust, evalsNow, 0.5, mutator);
|
||||
// (m_Population, (AbstractOptimizationProblem)m_Problem, sigmaClust, hcEvalCycle - (m_Population.getFunctionCalls() % hcEvalCycle), 0.5);
|
||||
if (popD.head().getFunctionCalls()==funCallsBefore) {
|
||||
System.err.println("Bad case, increasing allowed evaluations!");
|
||||
evalsNow=Math.max(evalsNow++, (int)(evalsNow*1.2));
|
||||
}
|
||||
} while (popD.head().getFunctionCalls()==funCallsBefore);
|
||||
improvement = popD.tail();
|
||||
m_Population = popD.head();
|
||||
if (TRACE) System.out.println("num inds after clusterLS: " + m_Population.size());
|
||||
|
||||
popD.head().setGenerationTo(m_Population.getGeneration()+1);
|
||||
|
||||
if (improvement < minImprovement) {
|
||||
if (doReinitialization && (improvement < minImprovement)) {
|
||||
if (TRACE) System.out.println("improvement below " + minImprovement);
|
||||
if ((localSearchMethod != PostProcessMethod.hillClimber) || (mutator.getSigma() < stepSizeThreshold)) { // reinit!
|
||||
// is performed for nm and cma, and if hc has too low sigma
|
||||
@ -175,10 +190,10 @@ public class ClusteringHillClimbing implements InterfacePopulationChangedEventLi
|
||||
|
||||
Population tmpPop = new Population();
|
||||
tmpPop.addPopulationChangedEventListener(null);
|
||||
tmpPop.setPopulationSize(initialPopSize);
|
||||
tmpPop.setTargetSize(initialPopSize);
|
||||
this.m_Problem.initPopulation(tmpPop);
|
||||
tmpPop.setSameParams(m_Population);
|
||||
tmpPop.setPopulationSize(initialPopSize);
|
||||
tmpPop.setTargetSize(initialPopSize);
|
||||
this.m_Problem.evaluate(tmpPop);
|
||||
|
||||
// reset population while keeping function calls etc.
|
||||
@ -245,7 +260,7 @@ public class ClusteringHillClimbing implements InterfacePopulationChangedEventLi
|
||||
public String getStringRepresentation() {
|
||||
StringBuffer sbuf = new StringBuffer("Clustering Hill Climbing");
|
||||
sbuf.append(", initial pop size: ");
|
||||
sbuf.append(getPopulation().getPopulationSize());
|
||||
sbuf.append(getPopulation().getTargetSize());
|
||||
sbuf.append("Optimization Problem: ");
|
||||
sbuf.append(this.m_Problem.getStringRepresentationForProblem(this));
|
||||
sbuf.append(this.m_Population.getStringRepresentation());
|
||||
@ -259,7 +274,8 @@ public class ClusteringHillClimbing implements InterfacePopulationChangedEventLi
|
||||
}
|
||||
|
||||
public String globalInfo() {
|
||||
return "Similar to multi-start HC, but clusters the population during optimization to remove redundant individuals for efficiency.";
|
||||
return "Similar to multi-start HC, but clusters the population during optimization to remove redundant individuals for efficiency." +
|
||||
"If the local search step does not achieve a minimum improvement, the population may be reinitialized.";
|
||||
}
|
||||
|
||||
/**
|
||||
@ -394,23 +410,32 @@ public class ClusteringHillClimbing implements InterfacePopulationChangedEventLi
|
||||
|
||||
public void setLocalSearchMethod(PostProcessMethod localSearchMethod) {
|
||||
this.localSearchMethod = localSearchMethod;
|
||||
GenericObjectEditor.setShowProperty(this.getClass(), "stepSizeInitial", localSearchMethod==PostProcessMethod.hillClimber);
|
||||
GenericObjectEditor.setShowProperty(this.getClass(), "stepSizeThreshold", localSearchMethod==PostProcessMethod.hillClimber);
|
||||
}
|
||||
|
||||
public String localSearchMethodTipText() {
|
||||
return "Set the method to be used for local search";
|
||||
return "Set the method to be used for the hill climbing as local search";
|
||||
}
|
||||
|
||||
// /**
|
||||
// * @return the mutator
|
||||
// */
|
||||
// public InterfaceMutation getMutator() {
|
||||
// return mutator;
|
||||
// }
|
||||
//
|
||||
// /**
|
||||
// * @param mutator the mutator to set
|
||||
// */
|
||||
// public void setMutator(InterfaceMutation mutator) {
|
||||
// this.mutator = mutator;
|
||||
// }
|
||||
public String getAdditionalFileStringHeader(PopulationInterface pop) {
|
||||
return "#Indies";
|
||||
}
|
||||
|
||||
public String getAdditionalFileStringValue(PopulationInterface pop) {
|
||||
return ""+m_Population.size();
|
||||
}
|
||||
|
||||
public boolean isDoReinitialization() {
|
||||
return doReinitialization;
|
||||
}
|
||||
|
||||
public void setDoReinitialization(boolean doReinitialization) {
|
||||
this.doReinitialization = doReinitialization;
|
||||
GenericObjectEditor.setShowProperty(this.getClass(), "minImprovement", doReinitialization);
|
||||
}
|
||||
|
||||
public String doReinitializationTipText() {
|
||||
return "Activate reinitialization if no improvement was achieved.";
|
||||
}
|
||||
}
|
||||
|
@ -52,7 +52,7 @@ public class EvolutionStrategies implements InterfaceOptimizer, java.io.Serializ
|
||||
public static final String esMuParam = "EvolutionStrategyMuParameter";
|
||||
|
||||
public EvolutionStrategies() {
|
||||
this.m_Population.setPopulationSize(this.m_Lambda);
|
||||
this.m_Population.setTargetSize(this.m_Lambda);
|
||||
}
|
||||
|
||||
public EvolutionStrategies(int mu, int lambda, boolean usePlus) {
|
||||
@ -111,7 +111,7 @@ public class EvolutionStrategies implements InterfaceOptimizer, java.io.Serializ
|
||||
* @param reset If true the population is reset.
|
||||
*/
|
||||
public void initByPopulation(Population pop, boolean reset) {
|
||||
origPopSize = pop.getPopulationSize();
|
||||
origPopSize = pop.getTargetSize();
|
||||
// System.out.println("ES: orig popsize is " + origPopSize);
|
||||
this.m_Population = (Population)pop.clone();
|
||||
if (reset) {
|
||||
@ -368,9 +368,9 @@ public class EvolutionStrategies implements InterfaceOptimizer, java.io.Serializ
|
||||
System.err.println("Invalid mu/lambda ratio! Setting mu=lambda="+m_Mu);
|
||||
this.m_Lambda = this.m_Mu;
|
||||
}
|
||||
if (this.m_UsePlusStrategy) this.m_Population.setPopulationSize(this.m_Mu + this.m_Lambda);
|
||||
else this.m_Population.setPopulationSize(this.m_Lambda);
|
||||
origPopSize=m_Population.getPopulationSize();
|
||||
if (this.m_UsePlusStrategy) this.m_Population.setTargetSize(this.m_Mu + this.m_Lambda);
|
||||
else this.m_Population.setTargetSize(this.m_Lambda);
|
||||
origPopSize=m_Population.getTargetSize();
|
||||
}
|
||||
|
||||
/** This method allows you to set an identifier for the algorithm
|
||||
|
@ -39,7 +39,7 @@ public class FloodAlgorithm implements InterfaceOptimizer, java.io.Serializable
|
||||
|
||||
public FloodAlgorithm() {
|
||||
this.m_Population = new Population();
|
||||
this.m_Population.setPopulationSize(10);
|
||||
this.m_Population.setTargetSize(10);
|
||||
}
|
||||
|
||||
public FloodAlgorithm(FloodAlgorithm a) {
|
||||
|
@ -110,7 +110,7 @@ public class GeneticAlgorithm implements InterfaceOptimizer, java.io.Serializabl
|
||||
//System.out.println("Population:"+this.m_Population.getSolutionRepresentationFor());
|
||||
this.m_ParentSelection.prepareSelection(this.m_Population);
|
||||
this.m_PartnerSelection.prepareSelection(this.m_Population);
|
||||
parents = this.m_ParentSelection.selectFrom(this.m_Population, this.m_Population.getPopulationSize());
|
||||
parents = this.m_ParentSelection.selectFrom(this.m_Population, this.m_Population.getTargetSize());
|
||||
//System.out.println("Parents:"+parents.getSolutionRepresentationFor());
|
||||
|
||||
if (parents.getEAIndividual(0).getMutationOperator() instanceof InterfaceMutationGenerational) {
|
||||
@ -153,7 +153,7 @@ public class GeneticAlgorithm implements InterfaceOptimizer, java.io.Serializabl
|
||||
}
|
||||
if (this.m_Plague > 0) {
|
||||
for (int i = 0; i < this.m_Plague; i++) if (this.m_Population.size() > 2) this.m_Population.remove(this.m_Population.getWorstEAIndividual());
|
||||
this.m_Population.setPopulationSize(this.m_Population.size());
|
||||
this.m_Population.setTargetSize(this.m_Population.size());
|
||||
}
|
||||
//System.out.println("Population size: " + this.m_Population.size());
|
||||
// if (this.m_Population.getArchive() != null) {
|
||||
@ -203,7 +203,7 @@ public class GeneticAlgorithm implements InterfaceOptimizer, java.io.Serializabl
|
||||
String result = "";
|
||||
result += "Genetic Algorithm:\n";
|
||||
result += "Using:\n";
|
||||
result += " Population Size = " + this.m_Population.getPopulationSize() + "/" + this.m_Population.size() + "\n";
|
||||
result += " Population Size = " + this.m_Population.getTargetSize() + "/" + this.m_Population.size() + "\n";
|
||||
result += " Parent Selection = " + this.m_ParentSelection.getClass().toString() + "\n";
|
||||
result += " Partner Selection = " + this.m_PartnerSelection.getClass().toString() + "\n";
|
||||
result += " Number of Partners = " + this.m_NumberOfPartners + "\n";
|
||||
|
@ -1,7 +1,5 @@
|
||||
package eva2.server.go.strategies;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
import eva2.server.go.InterfacePopulationChangedEventListener;
|
||||
import eva2.server.go.individuals.AbstractEAIndividual;
|
||||
import eva2.server.go.individuals.InterfaceDataTypeDouble;
|
||||
@ -11,45 +9,53 @@ import eva2.server.go.populations.SolutionSet;
|
||||
import eva2.server.go.problems.F1Problem;
|
||||
import eva2.server.go.problems.InterfaceFirstOrderDerivableProblem;
|
||||
import eva2.server.go.problems.InterfaceOptimizationProblem;
|
||||
|
||||
|
||||
import eva2.tools.EVAERROR;
|
||||
|
||||
/**
|
||||
* A gradient descent algorithm by hannes planatscher don't expect any
|
||||
* descriptions here... *big sigh*
|
||||
*
|
||||
* mkron added some!
|
||||
*
|
||||
* @author not attributable
|
||||
* @version 1.0
|
||||
*/
|
||||
|
||||
public class GradientDescentAlgorithm implements InterfaceOptimizer, java.io.Serializable {
|
||||
|
||||
private InterfaceOptimizationProblem m_Problem;
|
||||
private InterfaceOptimizationProblem m_Problem;
|
||||
|
||||
InterfaceDataTypeDouble m_Best, m_Test;
|
||||
private int iterations = 1;
|
||||
private double localnminus = 0.5;
|
||||
private double localnplus = 1.1;
|
||||
boolean recovery = false;
|
||||
private int recoverylocksteps = 5;
|
||||
private double recoverythreshold = 100000;
|
||||
boolean localstepsizeadaption = true;
|
||||
boolean globalstepsizeadaption = true;
|
||||
private double globalinitstepsize = 1;
|
||||
double globalmaxstepsize = 3.0;
|
||||
double globalminstepsize = 0.1;
|
||||
boolean manhattan = false;
|
||||
double localmaxstepsize = 10;
|
||||
double localminstepsize = 0.1;
|
||||
private boolean momentumterm = false;
|
||||
transient private InterfacePopulationChangedEventListener m_Listener;
|
||||
public double maximumabsolutechange = 0.2;
|
||||
Hashtable indyhash;
|
||||
InterfaceDataTypeDouble m_Best, m_Test;
|
||||
private int iterations = 1;
|
||||
private double wDecreaseStepSize = 0.5;
|
||||
private double wIncreaseStepSize = 1.1;
|
||||
boolean recovery = false;
|
||||
private int recoverylocksteps = 5;
|
||||
private double recoverythreshold = 100000;
|
||||
boolean localStepSizeAdaption = true;
|
||||
boolean globalStepSizeAdaption = false;
|
||||
private double globalinitstepsize = 1;
|
||||
double globalmaxstepsize = 3.0;
|
||||
double globalminstepsize = 0.0001;
|
||||
boolean manhattan = false;
|
||||
double localmaxstepsize = 10;
|
||||
double localminstepsize = 0.0001;
|
||||
private boolean momentumterm = false;
|
||||
transient private InterfacePopulationChangedEventListener m_Listener;
|
||||
public double maximumabsolutechange = 0.2;
|
||||
// Hashtable indyhash;
|
||||
|
||||
// These variables are necessary for the more complex LectureGUI enviroment
|
||||
transient private String m_Identifier = "";
|
||||
private Population m_Population;
|
||||
private InterfaceDataTypeDouble InterfaceDataTypeDouble;
|
||||
// These variables are necessary for the more complex LectureGUI enviroment
|
||||
transient private String m_Identifier = "";
|
||||
private Population m_Population;
|
||||
|
||||
private static final String lockKey = "gdaLockDataKey";
|
||||
private static final String lastFitnessKey = "gdaLastFitDataKey";
|
||||
private static final String stepSizeKey = "gdaStepSizeDataKey";
|
||||
private static final String wStepSizeKey = "gdaWStepSizeDataKey";
|
||||
private static final String gradientKey = "gdaGradientDataKey";
|
||||
private static final String changesKey = "gdaChangesDataKey";
|
||||
private static final String oldParamsKey = "gdaOldParamsDataKey";
|
||||
|
||||
public void initByPopulation(Population pop, boolean reset) {
|
||||
this.setPopulation((Population) pop.clone());
|
||||
@ -59,16 +65,15 @@ public class GradientDescentAlgorithm implements InterfaceOptimizer, java.io.Ser
|
||||
this.firePropertyChangedEvent(Population.nextGenerationPerformed);
|
||||
}
|
||||
//System.out.println("initByPopulation() called");
|
||||
indyhash = new Hashtable();
|
||||
// indyhash = new Hashtable();
|
||||
}
|
||||
|
||||
public GradientDescentAlgorithm() {
|
||||
indyhash = new Hashtable();
|
||||
// indyhash = new Hashtable();
|
||||
this.m_Population = new Population();
|
||||
this.m_Population.setPopulationSize(1);
|
||||
this.m_Population.setTargetSize(1);
|
||||
}
|
||||
|
||||
|
||||
public Object clone() {
|
||||
/**@todo Implement InterfaceOptimizer method*/
|
||||
throw new java.lang.UnsupportedOperationException("Method clone() not yet implemented.");
|
||||
@ -78,15 +83,13 @@ public class GradientDescentAlgorithm implements InterfaceOptimizer, java.io.Ser
|
||||
return "GradientDescentAlgorithm";
|
||||
}
|
||||
|
||||
|
||||
public void init() {
|
||||
//System.out.println("init() called ");
|
||||
indyhash = new Hashtable();
|
||||
// indyhash = new Hashtable();
|
||||
this.m_Problem.initPopulation(this.m_Population);
|
||||
this.m_Problem.evaluate(this.m_Population);
|
||||
}
|
||||
|
||||
|
||||
public double signum(double val) {
|
||||
return (val < 0) ? -1 : 1;
|
||||
}
|
||||
@ -94,23 +97,23 @@ public class GradientDescentAlgorithm implements InterfaceOptimizer, java.io.Ser
|
||||
public void optimize() {
|
||||
// System.out.println("opt. called");
|
||||
AbstractEAIndividual indy;
|
||||
if ((this.indyhash == null) || (this.indyhash.size() <1)) init();
|
||||
// if ((this.indyhash == null) || (this.indyhash.size() <1)) init();
|
||||
|
||||
for (int i = 0; i < this.m_Population.size(); i++) {
|
||||
indy = ((AbstractEAIndividual)this.m_Population.get(i));
|
||||
if (!indyhash.containsKey(indy)) {
|
||||
if (!indy.hasData(gradientKey)) {
|
||||
//System.out.println("new indy to hash");
|
||||
Hashtable history = new Hashtable();
|
||||
// Hashtable history = new Hashtable();
|
||||
int[] lock = new int[((InterfaceDataTypeDouble) indy).getDoubleData().length];
|
||||
double[] wstepsize = new double[((InterfaceDataTypeDouble) indy).getDoubleData().length];
|
||||
for (int li = 0; li < lock.length; li++) lock[li] = 0;
|
||||
for (int li = 0; li < lock.length; li++) wstepsize[li] = 1.0;
|
||||
double fitness = 0;
|
||||
history.put("lock", lock);
|
||||
history.put("lastfitness", new Double(fitness));
|
||||
history.put("stepsize", new Double(globalinitstepsize));
|
||||
history.put("wstepsize", wstepsize);
|
||||
indyhash.put(indy, history);
|
||||
indy.putData(lockKey, lock);
|
||||
indy.putData(lastFitnessKey, new Double(fitness));
|
||||
indy.putData(stepSizeKey, new Double(globalinitstepsize));
|
||||
indy.putData(wStepSizeKey, wstepsize);
|
||||
// indyhash.put(indy, history);
|
||||
} else {
|
||||
//System.out.println("indy already in hash");
|
||||
}
|
||||
@ -121,48 +124,49 @@ public class GradientDescentAlgorithm implements InterfaceOptimizer, java.io.Ser
|
||||
indy = ((AbstractEAIndividual)this.m_Population.get(i));
|
||||
double[][] range = ((InterfaceDataTypeDouble) indy).getDoubleRange();
|
||||
double[] params = ((InterfaceDataTypeDouble) indy).getDoubleData();
|
||||
indy.putData(oldParamsKey , params);
|
||||
|
||||
int[] lock = (int[]) ((Hashtable) indyhash.get(indy)).get("lock");
|
||||
double indystepsize = ((Double) ((Hashtable) indyhash.get(indy)).get("stepsize")).doubleValue();
|
||||
int[] lock = (int[]) indy.getData(lockKey);
|
||||
double indystepsize = ((Double) indy.getData(stepSizeKey)).doubleValue();
|
||||
// System.out.println("indystepsize" + indystepsize);
|
||||
|
||||
if ((this.m_Problem instanceof InterfaceFirstOrderDerivableProblem) && (indy instanceof InterfaceDataTypeDouble)) {
|
||||
Hashtable history = (Hashtable) indyhash.get(indy);
|
||||
// Hashtable history = (Hashtable) indyhash.get(indy);
|
||||
for (int iterations = 0; iterations < this.iterations; iterations++) {
|
||||
|
||||
double[] oldgradient = (double[]) history.get("gradient");
|
||||
double[] wstepsize = (double[]) history.get("wstepsize");
|
||||
double[] oldgradient = indy.hasData(gradientKey) ? (double[]) indy.getData(gradientKey) : null;
|
||||
double[] wstepsize = (double[]) indy.getData(wStepSizeKey);
|
||||
double[] oldchange = null;
|
||||
|
||||
double[] gradient = ((InterfaceFirstOrderDerivableProblem) m_Problem).getFirstOrderGradients(params);
|
||||
if ((oldgradient != null) && (wstepsize != null)) {
|
||||
if ((oldgradient != null) && (wstepsize != null)) { // LOCAL adaption
|
||||
for (int li = 0; li < wstepsize.length; li++) {
|
||||
double prod = gradient[li] * oldgradient[li];
|
||||
if (prod < 0) {
|
||||
wstepsize[li] = localnminus * wstepsize[li];
|
||||
wstepsize[li] = wDecreaseStepSize * wstepsize[li];
|
||||
} else if (prod > 0) {
|
||||
wstepsize[li] = localnplus * wstepsize[li];
|
||||
wstepsize[li] = wIncreaseStepSize * wstepsize[li];
|
||||
}
|
||||
wstepsize[li] = (wstepsize[li] < localminstepsize) ? localminstepsize : wstepsize[li];
|
||||
wstepsize[li] = (wstepsize[li] > localmaxstepsize) ? localmaxstepsize : wstepsize[li];
|
||||
|
||||
//System.out.println("wstepsize "+ li + " " + wstepsize[li]);
|
||||
// System.out.println("wstepsize "+ li + " " + wstepsize[li]);
|
||||
}
|
||||
|
||||
}
|
||||
double[] newparams = new double[params.length];
|
||||
history.put("gradient", gradient);
|
||||
indy.putData(gradientKey, gradient);
|
||||
double[] change = new double[params.length];
|
||||
if (history.containsKey("changes")) {
|
||||
oldchange =(double[]) history.get("changes");
|
||||
if (indy.hasData(changesKey)) {
|
||||
oldchange =(double[]) indy.getData(changesKey);
|
||||
}
|
||||
boolean dograddesc = (this.momentumterm) && (oldchange != null);
|
||||
|
||||
for (int j = 0; j < newparams.length; j++) {
|
||||
if (lock[j] == 0) {
|
||||
double tempstepsize = 1;
|
||||
if (this.localstepsizeadaption) tempstepsize = tempstepsize *wstepsize[j];
|
||||
if (this.globalstepsizeadaption) tempstepsize = tempstepsize *indystepsize;
|
||||
if (this.localStepSizeAdaption) tempstepsize = tempstepsize * wstepsize[j];
|
||||
if (this.globalStepSizeAdaption) tempstepsize = tempstepsize * indystepsize;
|
||||
double wchange = signum(tempstepsize * gradient[j]) * Math.min(maximumabsolutechange,Math.abs(tempstepsize * gradient[j])); //indystepsize * gradient[j];
|
||||
if (this.manhattan) wchange = this.signum(wchange) * tempstepsize;
|
||||
if (dograddesc) {
|
||||
@ -181,26 +185,31 @@ public class GradientDescentAlgorithm implements InterfaceOptimizer, java.io.Ser
|
||||
}
|
||||
params = newparams;
|
||||
|
||||
history.put("changes", change);
|
||||
indy.putData(changesKey, change);
|
||||
|
||||
}
|
||||
} // end loop iterations
|
||||
|
||||
((InterfaceDataTypeDouble) indy).SetDoubleGenotype(params);
|
||||
|
||||
} // end if ((this.m_Problem instanceof InterfaceFirstOrderDerivableProblem) && (indy instanceof InterfaceDataTypeDouble)) {
|
||||
else {
|
||||
String msg="Warning, problem of type InterfaceFirstOrderDerivableProblem and template of type InterfaceDataTypeDouble is required for " + this.getClass();
|
||||
EVAERROR.errorMsgOnce(msg);
|
||||
throw new RuntimeException(msg);
|
||||
}
|
||||
}
|
||||
} // for loop population size
|
||||
|
||||
this.m_Problem.evaluate(this.m_Population);
|
||||
|
||||
if (this.recovery) {
|
||||
for (int i = 0; i < this.m_Population.size(); i++) {
|
||||
indy = ((AbstractEAIndividual)this.m_Population.get(i));
|
||||
Hashtable history = (Hashtable) indyhash.get(indy);
|
||||
// Hashtable history = (Hashtable) indyhash.get(indy);
|
||||
if (indy.getFitness()[0] > recoverythreshold) {
|
||||
System.out.println("Gradient Descent: Fitness critical:" + indy.getFitness()[0]);
|
||||
((InterfaceDataTypeDouble) indy).SetDoublePhenotype((double[]) history.get("params"));
|
||||
double[] changes = (double[]) history.get("changes");
|
||||
int[] lock = (int[]) history.get("lock");
|
||||
((InterfaceDataTypeDouble) indy).SetDoublePhenotype((double[]) indy.getData(oldParamsKey));
|
||||
double[] changes = (double[]) indy.getData(changesKey);
|
||||
int[] lock = (int[]) indy.getData(lockKey);
|
||||
|
||||
int indexmaxchange = 0;
|
||||
double maxchangeval = Double.NEGATIVE_INFINITY;
|
||||
@ -211,37 +220,37 @@ public class GradientDescentAlgorithm implements InterfaceOptimizer, java.io.Ser
|
||||
}
|
||||
}
|
||||
lock[indexmaxchange] = recoverylocksteps;
|
||||
history.put("lock", lock);
|
||||
indy.putData(lockKey, lock);
|
||||
} else {
|
||||
}
|
||||
}
|
||||
this.m_Problem.evaluate(this.m_Population);
|
||||
}
|
||||
|
||||
if (this.globalstepsizeadaption) {
|
||||
if (this.globalStepSizeAdaption) {
|
||||
|
||||
//System.out.println("gsa main");
|
||||
for (int i = 0; i < this.m_Population.size(); i++) {
|
||||
indy = ((AbstractEAIndividual)this.m_Population.get(i));
|
||||
Hashtable history = (Hashtable) indyhash.get(indy);
|
||||
if (history == null) break;
|
||||
if (history.get("lastfitness") != null) {
|
||||
double lastfit = ((Double) history.get("lastfitness")).doubleValue();
|
||||
double indystepsize = ((Double) history.get("stepsize")).doubleValue();
|
||||
// Hashtable history = (Hashtable) indyhash.get(indy);
|
||||
// if (history == null) break;
|
||||
if (indy.getData(lastFitnessKey) != null) {
|
||||
double lastfit = ((Double) indy.getData(lastFitnessKey)).doubleValue();
|
||||
double indystepsize = ((Double) indy.getData(stepSizeKey)).doubleValue();
|
||||
|
||||
if (lastfit < indy.getFitness()[0]) {
|
||||
indystepsize *= 0.5;
|
||||
if (lastfit < indy.getFitness()[0]) { // GLOBAL adaption
|
||||
indystepsize *= wDecreaseStepSize;
|
||||
} else {
|
||||
indystepsize *= 1.1;
|
||||
indystepsize *= wIncreaseStepSize;
|
||||
}
|
||||
//System.out.println("newstepsize" + indystepsize);
|
||||
indystepsize = (indystepsize > globalmaxstepsize) ? globalmaxstepsize : indystepsize;
|
||||
indystepsize = (indystepsize < globalminstepsize) ? globalminstepsize : indystepsize;
|
||||
history.put("stepsize", new Double(indystepsize));
|
||||
indy.putData(stepSizeKey, new Double(indystepsize));
|
||||
}
|
||||
|
||||
//System.out.println("newstepsize in bounds" + indystepsize);
|
||||
history.put("lastfitness", new Double(indy.getFitness()[0]));
|
||||
indy.putData(lastFitnessKey, new Double(indy.getFitness()[0]));
|
||||
}
|
||||
|
||||
}
|
||||
@ -265,11 +274,11 @@ public class GradientDescentAlgorithm implements InterfaceOptimizer, java.io.Ser
|
||||
}
|
||||
|
||||
public void setPopulation(Population pop) {
|
||||
Hashtable newindyhash = new Hashtable();
|
||||
for (int i = 0; i < pop.size(); i++) {
|
||||
if (indyhash.contains(pop.get(i))) newindyhash.put(pop.get(i), indyhash.get(pop.get(i)));
|
||||
}
|
||||
indyhash = newindyhash;
|
||||
// Hashtable newindyhash = new Hashtable();
|
||||
// for (int i = 0; i < pop.size(); i++) {
|
||||
// if (indyhash.contains(pop.get(i))) newindyhash.put(pop.get(i), indyhash.get(pop.get(i)));
|
||||
// }
|
||||
// indyhash = newindyhash;
|
||||
this.m_Population = pop;
|
||||
}
|
||||
|
||||
@ -298,7 +307,6 @@ public class GradientDescentAlgorithm implements InterfaceOptimizer, java.io.Ser
|
||||
return "GradientDescentAlgorithm";
|
||||
}
|
||||
|
||||
|
||||
public void addPopulationChangedEventListener(InterfacePopulationChangedEventListener ea) {
|
||||
this.m_Listener = ea;
|
||||
}
|
||||
@ -324,143 +332,163 @@ public class GradientDescentAlgorithm implements InterfaceOptimizer, java.io.Ser
|
||||
}
|
||||
}
|
||||
|
||||
public void freeWilly() { }
|
||||
|
||||
|
||||
public void freeWilly() {
|
||||
|
||||
public String globalInfo() {
|
||||
return "Gradient Descent can be applied to derivable functions ("+InterfaceFirstOrderDerivableProblem.class.getSimpleName()+").";
|
||||
}
|
||||
|
||||
|
||||
public double getGlobalMaxstepsize() {
|
||||
//////////////// for global adaption
|
||||
public boolean isAdaptStepSizeGlobally() {
|
||||
return globalStepSizeAdaption;
|
||||
}
|
||||
public void setAdaptStepSizeGlobally(boolean globalstepsizeadaption) {
|
||||
this.globalStepSizeAdaption = globalstepsizeadaption;
|
||||
if (globalstepsizeadaption && localStepSizeAdaption) setAdaptStepSizeLocally(false);
|
||||
}
|
||||
public String adaptStepSizeGloballyTipText() {
|
||||
return "Use a single step size per individual - (priority over local step size).";
|
||||
}
|
||||
|
||||
public double getGlobalMaxStepSize() {
|
||||
return globalmaxstepsize;
|
||||
}
|
||||
|
||||
public void setGlobalMaxstepsize(double p) {
|
||||
public void setGlobalMaxStepSize(double p) {
|
||||
globalmaxstepsize = p;
|
||||
}
|
||||
public String globalMaxStepSizeTipText() {
|
||||
return "Maximum step size for global adaption.";
|
||||
}
|
||||
|
||||
|
||||
public double getGlobalMinstepsize() {
|
||||
public double getGlobalMinStepSize() {
|
||||
return globalminstepsize;
|
||||
}
|
||||
|
||||
public void setGlobalMinstepsize(double p) {
|
||||
public void setGlobalMinStepSize(double p) {
|
||||
globalminstepsize = p;
|
||||
}
|
||||
|
||||
public int getRecoveryLocksteps() {
|
||||
return recoverylocksteps;
|
||||
public String globalMindStepSizeTipText() {
|
||||
return "Minimum step size for global adaption.";
|
||||
}
|
||||
|
||||
public void setRecoveryLocksteps(int locksteps) {
|
||||
this.recoverylocksteps = locksteps;
|
||||
}
|
||||
|
||||
public double getGlobalInitstepsize() {
|
||||
|
||||
public double getGlobalInitStepSize() {
|
||||
return globalinitstepsize;
|
||||
}
|
||||
|
||||
public void setGlobalInitstepsize(double initstepsize) {
|
||||
public void setGlobalInitStepSize(double initstepsize) {
|
||||
this.globalinitstepsize = initstepsize;
|
||||
}
|
||||
public boolean isLocalStepsizeadaption() {
|
||||
return localstepsizeadaption;
|
||||
public String globalInitStepSizeTipText() {
|
||||
return "Initial step size for global adaption.";
|
||||
}
|
||||
public void setLocalStepsizeadaption(boolean stepsizeadaption) {
|
||||
this.localstepsizeadaption = stepsizeadaption;
|
||||
|
||||
//////////////// for local adaption
|
||||
public boolean isAdaptStepSizeLocally() {
|
||||
return localStepSizeAdaption;
|
||||
}
|
||||
public void setAdaptStepSizeLocally(boolean stepsizeadaption) {
|
||||
this.localStepSizeAdaption = stepsizeadaption;
|
||||
if (globalStepSizeAdaption && localStepSizeAdaption) setAdaptStepSizeGlobally(false);
|
||||
}
|
||||
public String adaptStepSizeLocallyTipText() {
|
||||
return "Use a step size parameter in any dimension.";
|
||||
}
|
||||
|
||||
public double getLocalMinStepSize() {
|
||||
return localminstepsize;
|
||||
}
|
||||
public void setLocalMinStepSize(double localminstepsize) {
|
||||
this.localminstepsize = localminstepsize;
|
||||
}
|
||||
|
||||
public double getLocalMaxStepSize() {
|
||||
return localmaxstepsize;
|
||||
}
|
||||
public void setLocalMaxStepSize(double localmaxstepsize) {
|
||||
this.localmaxstepsize = localmaxstepsize;
|
||||
}
|
||||
|
||||
public void setStepSizeIncreaseFact(double nplus) {
|
||||
this.wIncreaseStepSize = nplus;
|
||||
}
|
||||
public double getStepSizeIncreaseFact() {
|
||||
return wIncreaseStepSize;
|
||||
}
|
||||
public String stepSizeIncreaseFactTipText() {
|
||||
return "Factor for increasing the step size in adaption.";
|
||||
}
|
||||
|
||||
public void setStepSizeDecreaseFact(double nminus) {
|
||||
this.wDecreaseStepSize = nminus;
|
||||
}
|
||||
public double getStepSizeDecreaseFact() {
|
||||
return wDecreaseStepSize;
|
||||
}
|
||||
public String stepSizeDecreaseFactTipText() {
|
||||
return "Factor for decreasing the step size in adaption.";
|
||||
}
|
||||
|
||||
//////////////// concerning recovery
|
||||
public boolean isRecovery() {
|
||||
return recovery;
|
||||
return recovery;
|
||||
}
|
||||
public void setRecovery(boolean recovery) {
|
||||
this.recovery = recovery;
|
||||
this.recovery = recovery;
|
||||
}
|
||||
public double getLocalNplus() {
|
||||
return localnplus;
|
||||
public int getRecoveryLocksteps() {
|
||||
return recoverylocksteps;
|
||||
}
|
||||
public double getLocalNminus() {
|
||||
return localnminus;
|
||||
public void setRecoveryLocksteps(int locksteps) {
|
||||
this.recoverylocksteps = locksteps;
|
||||
}
|
||||
public void setLocalNplus(double nplus) {
|
||||
this.localnplus = nplus;
|
||||
public double getRecoveryThreshold() {
|
||||
return recoverythreshold;
|
||||
}
|
||||
public void setLocalNminus(double nminus) {
|
||||
this.localnminus = nminus;
|
||||
public void setRecoveryThreshold(double recoverythreshold) {
|
||||
this.recoverythreshold = recoverythreshold;
|
||||
}
|
||||
public String recoveryThresholdTipText() {
|
||||
return "If the fitness exceeds this threshold, an unstable area is assumed and one step recovered.";
|
||||
}
|
||||
|
||||
|
||||
public int getIterations() {
|
||||
return iterations;
|
||||
}
|
||||
public void setIterations(int iterations) {
|
||||
this.iterations = iterations;
|
||||
}
|
||||
public boolean isGlobalstepsizeadaption() {
|
||||
return globalstepsizeadaption;
|
||||
}
|
||||
public void setGlobalstepsizeadaption(boolean globalstepsizeadaption) {
|
||||
this.globalstepsizeadaption = globalstepsizeadaption;
|
||||
}
|
||||
public double getLocalminstepsize() {
|
||||
return localminstepsize;
|
||||
}
|
||||
public double getLocalmaxstepsize() {
|
||||
return localmaxstepsize;
|
||||
}
|
||||
public void setLocalminstepsize(double localminstepsize) {
|
||||
this.localminstepsize = localminstepsize;
|
||||
}
|
||||
public void setLocalmaxstepsize(double localmaxstepsize) {
|
||||
this.localmaxstepsize = localmaxstepsize;
|
||||
public String iterationsTipText() {
|
||||
return "The number of GD-iterations per generation.";
|
||||
}
|
||||
|
||||
|
||||
public boolean isManhattan() {
|
||||
return manhattan;
|
||||
}
|
||||
|
||||
|
||||
|
||||
public boolean isMomentumTerm() {
|
||||
return momentumterm;
|
||||
}
|
||||
|
||||
public double getMomentumweigth() {
|
||||
return momentumweigth;
|
||||
}
|
||||
|
||||
public void setManhattan(boolean manhattan) {
|
||||
this.manhattan = manhattan;
|
||||
}
|
||||
|
||||
|
||||
|
||||
public boolean isMomentumTerm() {
|
||||
return momentumterm;
|
||||
}
|
||||
public void setMomentumTerm(boolean momentum) {
|
||||
this.momentumterm = momentum;
|
||||
}
|
||||
|
||||
public void setMomentumweigth(double momentumweigth) {
|
||||
|
||||
public double getMomentumWeigth() {
|
||||
return momentumweigth;
|
||||
}
|
||||
public void setMomentumWeigth(double momentumweigth) {
|
||||
this.momentumweigth = momentumweigth;
|
||||
}
|
||||
|
||||
public void setPopulationSize(int p) {
|
||||
this.getPopulation().setPopulationSize(p);
|
||||
}
|
||||
|
||||
public int GetPopulationSize() {
|
||||
return this.getPopulation().getPopulationSize();
|
||||
}
|
||||
|
||||
public double getRecoverythreshold() {
|
||||
return recoverythreshold;
|
||||
}
|
||||
public void setRecoverythreshold(double recoverythreshold) {
|
||||
this.recoverythreshold = recoverythreshold;
|
||||
}
|
||||
|
||||
public double getMaximumabsolutechange() {
|
||||
public double getMaximumAbsoluteChange() {
|
||||
return maximumabsolutechange;
|
||||
}
|
||||
|
||||
|
||||
public void setMaximumabsolutechange(double maximumabsolutechange) {
|
||||
public void setMaximumAbsoluteChange(double maximumabsolutechange) {
|
||||
this.maximumabsolutechange = maximumabsolutechange;
|
||||
}
|
||||
public String maximumAbsoluteChangeTipText() {
|
||||
return "The maximum change along a coordinate in one step.";
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -38,7 +38,7 @@ public class HillClimbing implements InterfaceOptimizer, java.io.Serializable {
|
||||
|
||||
public HillClimbing() {
|
||||
this.m_Population = new Population();
|
||||
this.m_Population.setPopulationSize(10);
|
||||
this.m_Population.setTargetSize(10);
|
||||
}
|
||||
|
||||
public HillClimbing(HillClimbing a) {
|
||||
|
@ -336,7 +336,7 @@ public class IslandModelEA implements InterfacePopulationChangedEventListener, I
|
||||
if (false) {
|
||||
imea.m_Optimizer = new MultiObjectiveEA();
|
||||
((MultiObjectiveEA)imea.m_Optimizer).setArchiveSize(25);
|
||||
((MultiObjectiveEA)imea.m_Optimizer).getPopulation().setPopulationSize(50);
|
||||
((MultiObjectiveEA)imea.m_Optimizer).getPopulation().setTargetSize(50);
|
||||
imea.m_Problem = new TF1Problem();
|
||||
((TF1Problem)imea.m_Problem).setEAIndividual(new ESIndividualDoubleData());
|
||||
// ((TF1Problem)imea.m_Problem).setEAIndividual(new ESIndividualDoubleData());
|
||||
|
@ -42,7 +42,7 @@ public class MonteCarloSearch implements InterfaceOptimizer, java.io.Serializabl
|
||||
|
||||
public MonteCarloSearch() {
|
||||
this.m_Population = new Population();
|
||||
this.m_Population.setPopulationSize(50);
|
||||
this.m_Population.setTargetSize(50);
|
||||
}
|
||||
|
||||
public MonteCarloSearch(MonteCarloSearch a) {
|
||||
|
@ -48,7 +48,7 @@ public class MultiObjectiveEA implements InterfaceOptimizer, java.io.Serializabl
|
||||
transient private InterfacePopulationChangedEventListener m_Listener;
|
||||
|
||||
public MultiObjectiveEA() {
|
||||
this.m_Optimizer.getPopulation().setPopulationSize(100);
|
||||
this.m_Optimizer.getPopulation().setTargetSize(100);
|
||||
((GeneticAlgorithm)this.m_Optimizer).setParentSelection(new SelectMONonDominated());
|
||||
((GeneticAlgorithm)this.m_Optimizer).setPartnerSelection(new SelectMONonDominated());
|
||||
}
|
||||
@ -297,7 +297,7 @@ public class MultiObjectiveEA implements InterfaceOptimizer, java.io.Serializabl
|
||||
archive = new Population();
|
||||
this.m_Optimizer.getPopulation().SetArchive(archive);
|
||||
}
|
||||
return archive.getPopulationSize();
|
||||
return archive.getTargetSize();
|
||||
}
|
||||
public void setArchiveSize(int b){
|
||||
Population archive = this.m_Optimizer.getPopulation().getArchive();
|
||||
@ -305,7 +305,7 @@ public class MultiObjectiveEA implements InterfaceOptimizer, java.io.Serializabl
|
||||
archive = new Population();
|
||||
this.m_Optimizer.getPopulation().SetArchive(archive);
|
||||
}
|
||||
archive.setPopulationSize(b);
|
||||
archive.setTargetSize(b);
|
||||
}
|
||||
public String archiveSizeTipText() {
|
||||
return "Choose the size of the archive.";
|
||||
|
@ -312,8 +312,8 @@ public class NelderMeadSimplex implements InterfaceOptimizer, Serializable, Inte
|
||||
public void setPopulationSize(int populationSize) {
|
||||
this.populationSize = populationSize;
|
||||
if (m_Population!=null) {
|
||||
m_Population.setPopulationSize(populationSize);
|
||||
m_Population.setNotifyEvalInterval(m_Population.getPopulationSize());
|
||||
m_Population.setTargetSize(populationSize);
|
||||
m_Population.setNotifyEvalInterval(m_Population.getTargetSize());
|
||||
}
|
||||
}
|
||||
|
||||
@ -430,7 +430,7 @@ public class NelderMeadSimplex implements InterfaceOptimizer, Serializable, Inte
|
||||
indy.resetConstraintViolation();
|
||||
initialPop.add((AbstractEAIndividual)indy.clone());
|
||||
}
|
||||
initialPop.setPopulationSize(initialPop.size());
|
||||
initialPop.synchSize();
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -100,7 +100,7 @@ public class ParticleFilterOptimization implements InterfaceOptimizer, java.io.S
|
||||
} else {
|
||||
(((AbstractOptimizationProblem)m_Problem).getIndividualTemplate()).setMutationOperator(new MutateESCorrVector(mutationSigma, initialVelocity, rotationDeg));
|
||||
}
|
||||
m_Population.setPopSize(popSize);
|
||||
m_Population.setTargetSize(popSize);
|
||||
this.m_Problem.initPopulation(this.m_Population);
|
||||
|
||||
setWithShow(withShow);
|
||||
@ -144,13 +144,13 @@ public class ParticleFilterOptimization implements InterfaceOptimizer, java.io.S
|
||||
|
||||
// Generate a Population of Parents with Parantselectionmethod.
|
||||
// DONT forget cloning -> selection does only shallow copies!
|
||||
int targetSize = this.m_Population.getPopulationSize();
|
||||
int targetSize = this.m_Population.getTargetSize();
|
||||
if (randomImmigrationQuota>0) {
|
||||
if (randomImmigrationQuota>1.) System.err.println("Error, invalid immigration quota!");
|
||||
else {
|
||||
targetSize = (int)(this.m_Population.getPopulationSize() * (1.-randomImmigrationQuota));
|
||||
targetSize = (int)(this.m_Population.getTargetSize() * (1.-randomImmigrationQuota));
|
||||
targetSize = Math.max(1, targetSize); // guarantee at least one to be selected
|
||||
if (targetSize < this.m_Population.getPopulationSize()) doImmigr=true;
|
||||
if (targetSize < this.m_Population.getTargetSize()) doImmigr=true;
|
||||
}
|
||||
}
|
||||
|
||||
@ -160,7 +160,7 @@ public class ParticleFilterOptimization implements InterfaceOptimizer, java.io.S
|
||||
// add immigrants
|
||||
AbstractEAIndividual immi;
|
||||
int i;
|
||||
for (i=0; (i+parents.getPopulationSize())<pop.getPopulationSize(); i++) {
|
||||
for (i=0; (i+parents.getTargetSize())<pop.getTargetSize(); i++) {
|
||||
immi = (AbstractEAIndividual)pop.getEAIndividual(0).clone();
|
||||
immi.init(getProblem());
|
||||
parents.add(immi);
|
||||
@ -181,7 +181,7 @@ public class ParticleFilterOptimization implements InterfaceOptimizer, java.io.S
|
||||
if (withShow) {
|
||||
drawPop(pop, 0, false);
|
||||
}
|
||||
for (int i = 0; i < pop.getPopulationSize(); i++) {
|
||||
for (int i = 0; i < pop.getTargetSize(); i++) {
|
||||
applyMotionModel((AbstractEAIndividual)((AbstractEAIndividual)pop.get(i)), 0.);
|
||||
indCount++;
|
||||
}
|
||||
@ -454,6 +454,6 @@ public class ParticleFilterOptimization implements InterfaceOptimizer, java.io.S
|
||||
|
||||
public void setPopSize(int popSize) {
|
||||
this.popSize = popSize;
|
||||
m_Population.setPopSize(popSize);
|
||||
m_Population.setTargetSize(popSize);
|
||||
}
|
||||
}
|
||||
|
@ -1569,17 +1569,12 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se
|
||||
return "PSO-"+getTopology()+getTopologyRange()+"_"+getPhi1()+"_"+getPhi2();
|
||||
}
|
||||
|
||||
/** Assuming that all optimizer will store thier data in a population
|
||||
* we will allow acess to this population to query to current state
|
||||
* of the optimizer.
|
||||
* @return The population of current solutions to a given problem.
|
||||
*/
|
||||
public Population getPopulation() {
|
||||
return this.m_Population;
|
||||
}
|
||||
public void setPopulation(Population pop){
|
||||
this.m_Population = pop;
|
||||
if (pop.size() != pop.getPopulationSize()) { // new particle count!
|
||||
if (pop.size() != pop.getTargetSize()) { // new particle count!
|
||||
tracedVelocity = null;
|
||||
initByPopulation(null, false);
|
||||
} else for (int i=0; i<pop.size(); i++) {
|
||||
|
@ -37,7 +37,7 @@ public class SimulatedAnnealing implements InterfaceOptimizer, java.io.Serializa
|
||||
|
||||
public SimulatedAnnealing() {
|
||||
this.m_Population = new Population();
|
||||
this.m_Population.setPopulationSize(10);
|
||||
this.m_Population.setTargetSize(10);
|
||||
}
|
||||
|
||||
public SimulatedAnnealing(SimulatedAnnealing a) {
|
||||
|
@ -35,7 +35,7 @@ public class ThresholdAlgorithm implements InterfaceOptimizer, java.io.Serializa
|
||||
|
||||
public ThresholdAlgorithm() {
|
||||
this.m_Population = new Population();
|
||||
this.m_Population.setPopulationSize(10);
|
||||
this.m_Population.setTargetSize(10);
|
||||
}
|
||||
|
||||
public ThresholdAlgorithm(ThresholdAlgorithm a) {
|
||||
|
@ -65,7 +65,7 @@ public class TribesSwarm implements java.io.Serializable{
|
||||
for (int i=0; i<tribes[n].explorerNb; i++) pop.add(tribes[n].explorer[i]);
|
||||
}
|
||||
pop.add(getBestMemory().asDummyExplorer(range, masterTribe.getObjectiveFirstDim()));
|
||||
pop.setPopulationSize(pop.size());
|
||||
pop.synchSize();
|
||||
return pop;
|
||||
}
|
||||
|
||||
|
@ -133,7 +133,7 @@ public class MOEAParameters extends AbstractGOParameters implements InterfaceGOP
|
||||
archive = new Population();
|
||||
((MultiObjectiveEA)this.m_Optimizer).getPopulation().SetArchive(archive);
|
||||
}
|
||||
((MultiObjectiveEA)this.m_Optimizer).getPopulation().getArchive().setPopulationSize(b);
|
||||
((MultiObjectiveEA)this.m_Optimizer).getPopulation().getArchive().setTargetSize(b);
|
||||
}
|
||||
public String archiveSizeTipText() {
|
||||
return "Choose the size of the archive.";
|
||||
|
@ -2,6 +2,8 @@ package eva2.server.modules;
|
||||
|
||||
import java.util.Vector;
|
||||
|
||||
import javax.swing.JOptionPane;
|
||||
|
||||
import eva2.gui.BeanInspector;
|
||||
import eva2.server.go.InterfaceGOParameters;
|
||||
import eva2.server.go.InterfacePopulationChangedEventListener;
|
||||
@ -25,6 +27,7 @@ import eva2.server.stat.StatisticsWithGUI;
|
||||
import eva2.tools.EVAERROR;
|
||||
import eva2.tools.EVAHELP;
|
||||
import eva2.tools.Pair;
|
||||
import eva2.tools.StringTools;
|
||||
import eva2.tools.jproxy.RemoteStateListener;
|
||||
import eva2.tools.math.RNG;
|
||||
|
||||
@ -165,15 +168,19 @@ public class Processor extends Thread implements InterfaceProcessor, InterfacePo
|
||||
setPriority(1);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
System.err.println("Caught exception in Processor: "+e.getMessage());
|
||||
String errMsg = e.getMessage();
|
||||
if ((errMsg == null) || (errMsg.length() == 0)) errMsg="check console output for error messages.";
|
||||
errMsg = "Exception in Processor: "+errMsg;
|
||||
System.err.println(errMsg);
|
||||
e.printStackTrace();
|
||||
try {
|
||||
JOptionPane.showMessageDialog(null, StringTools.wrapLine(errMsg, 60, 0.2), "Error in Optimization", JOptionPane.ERROR_MESSAGE);
|
||||
} catch (Exception ex) {} catch(Error er) {};
|
||||
//m_Statistics.stopOptPerformed(false);
|
||||
setOptRunning(false); // normal finish
|
||||
if (m_ListenerModule!=null) {
|
||||
m_ListenerModule.performedStop(); // is only needed in client server mode
|
||||
String errMsg = e.getMessage();
|
||||
if ((errMsg == null) || (errMsg.length() == 0)) errMsg="check console output for error messages.";
|
||||
m_ListenerModule.updateProgress(0, "Error in optimization: " + errMsg);
|
||||
m_ListenerModule.updateProgress(0, errMsg);
|
||||
}
|
||||
}
|
||||
return resPop;
|
||||
@ -428,7 +435,7 @@ public class Processor extends Thread implements InterfaceProcessor, InterfacePo
|
||||
}
|
||||
if (!resultPop.contains(m_Statistics.getBestSolution())) {
|
||||
resultPop.add(m_Statistics.getBestSolution()); // this is a minor cheat but guarantees that the best solution ever found is contained in the final results
|
||||
resultPop.setPopulationSize(resultPop.size());
|
||||
resultPop.synchSize();
|
||||
}
|
||||
resultPop = PostProcess.postProcess(ppp, resultPop, (AbstractOptimizationProblem)goParams.getProblem(), listener);
|
||||
resPop = resultPop;
|
||||
|
@ -130,4 +130,52 @@ public class StringTools {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Rewrap a given string to lines of approx. length len.
|
||||
*
|
||||
* @param str
|
||||
* @param len
|
||||
* @return
|
||||
*/
|
||||
public static String wrapLine(String str, int len, double tolerancePerCent) {
|
||||
return wrapLine(str, new char[]{' ', '-', ',', '.'}, len, tolerancePerCent);
|
||||
}
|
||||
|
||||
/**
|
||||
* Rewrap a given string to lines of approx. length len.
|
||||
*
|
||||
* @param str
|
||||
* @param len
|
||||
* @return
|
||||
*/
|
||||
public static String wrapLine(String str, char[] breakChars, int len, double tolerancePerCent) {
|
||||
StringBuffer res=new StringBuffer();
|
||||
String rest=str;
|
||||
int minLen = (int)((1.-tolerancePerCent)*(double)len);
|
||||
int maxLen = (int)((1.+tolerancePerCent)*(double)len);
|
||||
int nextBreak=-1;
|
||||
while (rest.length()>0) {
|
||||
if (rest.length()<=maxLen) {
|
||||
nextBreak = rest.length()-1;
|
||||
} else {
|
||||
nextBreak = getNextBreak(minLen, maxLen, breakChars, rest); // search for a break character in a certain interval
|
||||
if (nextBreak<0) nextBreak = len; // if none found force the break at the intended length
|
||||
}
|
||||
if (res.length()>0) res.append("\n"); // insert newline
|
||||
res.append(rest.substring(0, nextBreak+1));
|
||||
rest = rest.substring(nextBreak+1);
|
||||
}
|
||||
return res.toString();
|
||||
}
|
||||
|
||||
public static int getNextBreak(int startIndex, int endIndex, char[] brkChars, String str) {
|
||||
int index;
|
||||
for (int i=0; i<brkChars.length; i++) {
|
||||
//indices[i] = str.indexOf(""+brkChars[i], startIndex);
|
||||
index =str.indexOf(""+brkChars[i], startIndex);
|
||||
if (index>=0 && (index <= endIndex)) return index;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user