Merging mk branch rev 342, generational DE.
This commit is contained in:
parent
4ba48274e7
commit
47877547a7
@ -32,6 +32,7 @@ import eva2.tools.Mathematics;
|
|||||||
public class DifferentialEvolution implements InterfaceOptimizer, java.io.Serializable {
|
public class DifferentialEvolution implements InterfaceOptimizer, java.io.Serializable {
|
||||||
|
|
||||||
private Population m_Population = new Population();
|
private Population m_Population = new Population();
|
||||||
|
private transient Population children = null;
|
||||||
private AbstractOptimizationProblem m_Problem = new F1Problem();
|
private AbstractOptimizationProblem m_Problem = new F1Problem();
|
||||||
private DETypeEnum m_DEType;
|
private DETypeEnum m_DEType;
|
||||||
private double m_F = 0.8;
|
private double m_F = 0.8;
|
||||||
@ -44,6 +45,7 @@ public class DifferentialEvolution implements InterfaceOptimizer, java.io.Serial
|
|||||||
private transient Vector<AbstractEAIndividual> parents = null;
|
private transient Vector<AbstractEAIndividual> parents = null;
|
||||||
|
|
||||||
private boolean randomizeFKLambda = false;
|
private boolean randomizeFKLambda = false;
|
||||||
|
private boolean generational = true;
|
||||||
private String m_Identifier = "";
|
private String m_Identifier = "";
|
||||||
transient private InterfacePopulationChangedEventListener m_Listener;
|
transient private InterfacePopulationChangedEventListener m_Listener;
|
||||||
private boolean forceRange = true;
|
private boolean forceRange = true;
|
||||||
@ -384,7 +386,60 @@ public class DifferentialEvolution implements InterfaceOptimizer, java.io.Serial
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void optimize() {
|
public void optimize() {
|
||||||
|
if (generational) optimizeGenerational();
|
||||||
|
else optimizeSteadyState();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This generational DE variant calls the method AbstractOptimizationProblem.evaluate(Population).
|
||||||
|
* Its performance may be slightly worse for schemes that rely on current best individuals,
|
||||||
|
* because improvements are not immediately incorporated as in the steady state DE.
|
||||||
|
* However it may be easier to parallelize.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void optimizeGenerational() {
|
||||||
|
// AbstractEAIndividual indy = null, orig;
|
||||||
|
int parentIndex;
|
||||||
|
// required for dynamic problems especially
|
||||||
|
// m_Problem.evaluatePopulationStart(m_Population);
|
||||||
|
if (children==null) children = new Population(m_Population.size());
|
||||||
|
else children.clear();
|
||||||
|
for (int i = 0; i < this.m_Population.size(); i++) {
|
||||||
|
if (cyclePop) parentIndex=i;
|
||||||
|
else parentIndex=RNG.randomInt(0, this.m_Population.size()-1);
|
||||||
|
AbstractEAIndividual indy = generateNewIndividual(m_Population, parentIndex);
|
||||||
|
children.add(indy);
|
||||||
|
}
|
||||||
|
|
||||||
|
m_Problem.evaluate(children);
|
||||||
|
|
||||||
|
int nextDoomed = getNextDoomed(m_Population, 0);
|
||||||
|
for (int i = 0; i < this.m_Population.size(); i++) {
|
||||||
|
AbstractEAIndividual indy = children.getEAIndividual(i);
|
||||||
|
if (cyclePop) parentIndex=i;
|
||||||
|
else parentIndex=RNG.randomInt(0, this.m_Population.size()-1);
|
||||||
|
if (nextDoomed >= 0) { // this one is lucky, may replace an 'old' one
|
||||||
|
m_Population.replaceIndividualAt(nextDoomed, indy);
|
||||||
|
nextDoomed = getNextDoomed(m_Population, nextDoomed+1);
|
||||||
|
} else {
|
||||||
|
if (m_Problem instanceof AbstractMultiObjectiveOptimizationProblem) {
|
||||||
|
ReplacementCrowding repl = new ReplacementCrowding();
|
||||||
|
repl.insertIndividual(indy, m_Population, null);
|
||||||
|
} else {
|
||||||
|
// index = RNG.randomInt(0, this.m_Population.size()-1);
|
||||||
|
if (!compareToParent) parentIndex = RNG.randomInt(0, this.m_Population.size()-1);
|
||||||
|
AbstractEAIndividual orig = (AbstractEAIndividual)this.m_Population.get(parentIndex);
|
||||||
|
if (indy.isDominatingDebConstraints(orig)) this.m_Population.replaceIndividualAt(parentIndex, indy);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.m_Population.incrFunctionCallsBy(children.size());
|
||||||
|
this.m_Population.incrGeneration();
|
||||||
|
this.firePropertyChangedEvent(Population.nextGenerationPerformed);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void optimizeSteadyState() {
|
||||||
AbstractEAIndividual indy = null, orig;
|
AbstractEAIndividual indy = null, orig;
|
||||||
int index;
|
int index;
|
||||||
|
|
||||||
@ -458,7 +513,7 @@ public class DifferentialEvolution implements InterfaceOptimizer, java.io.Serial
|
|||||||
this.m_Population.incrGeneration();
|
this.m_Population.incrGeneration();
|
||||||
this.firePropertyChangedEvent(Population.nextGenerationPerformed);
|
this.firePropertyChangedEvent(Population.nextGenerationPerformed);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Search for the first individual which is older than the age limit and return its index.
|
* Search for the first individual which is older than the age limit and return its index.
|
||||||
* If there is no age limit or all individuals are younger, -1 is returned. The start index
|
* If there is no age limit or all individuals are younger, -1 is returned. The start index
|
||||||
@ -714,4 +769,16 @@ public class DifferentialEvolution implements InterfaceOptimizer, java.io.Serial
|
|||||||
public String compareToParentTipText() {
|
public String compareToParentTipText() {
|
||||||
return "Compare a challenge individual to its original parent instead of a random one.";
|
return "Compare a challenge individual to its original parent instead of a random one.";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isGenerational() {
|
||||||
|
return generational;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setGenerational(boolean generational) {
|
||||||
|
this.generational = generational;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String generationalTipText() {
|
||||||
|
return "Switch to generational DE as opposed to standard steady-state DE";
|
||||||
|
}
|
||||||
}
|
}
|
Loading…
x
Reference in New Issue
Block a user