Merging MK branch revs. 370, 346:363
This commit is contained in:
parent
08ab9a7d58
commit
d9050fb822
@ -39,7 +39,6 @@ import eva2.server.go.operators.terminators.EvaluationTerminator;
|
||||
import eva2.server.go.populations.PBILPopulation;
|
||||
import eva2.server.go.populations.Population;
|
||||
import eva2.server.go.problems.AbstractOptimizationProblem;
|
||||
import eva2.server.go.problems.B1Problem;
|
||||
import eva2.server.go.strategies.ClusterBasedNichingEA;
|
||||
import eva2.server.go.strategies.ClusteringHillClimbing;
|
||||
import eva2.server.go.strategies.DifferentialEvolution;
|
||||
@ -57,6 +56,7 @@ import eva2.server.go.strategies.SimulatedAnnealing;
|
||||
import eva2.server.go.strategies.Tribes;
|
||||
import eva2.server.modules.GOParameters;
|
||||
import eva2.server.stat.InterfaceStatistics;
|
||||
import eva2.tools.math.RNG;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
@ -750,6 +750,7 @@ public class OptimizerFactory {
|
||||
int popSize, AbstractOptimizationProblem problem, long seed,
|
||||
InterfaceTerminator term) {
|
||||
Population pop = new Population(popSize);
|
||||
RNG.setRandomSeed(seed);
|
||||
problem.initPopulation(pop);
|
||||
return makeParams(opt, pop, problem, seed, term);
|
||||
}
|
||||
|
@ -25,10 +25,8 @@ import java.awt.event.ActionListener;
|
||||
import java.awt.event.KeyEvent;
|
||||
import java.awt.event.WindowAdapter;
|
||||
import java.awt.event.WindowEvent;
|
||||
import java.beans.BeanInfo;
|
||||
import java.io.Serializable;
|
||||
import java.net.URL;
|
||||
import java.util.LinkedList;
|
||||
import java.util.Properties;
|
||||
import java.util.Set;
|
||||
import java.util.Vector;
|
||||
@ -53,18 +51,21 @@ import javax.swing.event.MenuListener;
|
||||
|
||||
import eva2.EvAInfo;
|
||||
import eva2.gui.BeanInspector;
|
||||
import eva2.gui.EvATabbedFrameMaker;
|
||||
import eva2.gui.ExtAction;
|
||||
import eva2.gui.HtmlDemo;
|
||||
import eva2.gui.JEFrame;
|
||||
import eva2.gui.JEFrameRegister;
|
||||
import eva2.gui.JExtMenu;
|
||||
import eva2.gui.EvATabbedFrameMaker;
|
||||
import eva2.gui.LogPanel;
|
||||
import eva2.server.EvAServer;
|
||||
import eva2.server.go.InterfaceGOParameters;
|
||||
import eva2.server.modules.AbstractModuleAdapter;
|
||||
import eva2.server.modules.GenericModuleAdapter;
|
||||
import eva2.server.modules.ModuleAdapter;
|
||||
import eva2.server.stat.AbstractStatistics;
|
||||
import eva2.server.stat.InterfaceStatisticsParameter;
|
||||
import eva2.server.stat.StatsParameter;
|
||||
import eva2.tools.EVAERROR;
|
||||
import eva2.tools.EVAHELP;
|
||||
import eva2.tools.ReflectPackage;
|
||||
@ -276,6 +277,19 @@ public class EvAClient implements RemoteStateListener, Serializable {
|
||||
new Thread(cp).start();
|
||||
}
|
||||
|
||||
/**
|
||||
* Try to start the optimization with current parameters on the loaded module.
|
||||
* Return true on success, otherwise false.
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
public boolean startOptimization() {
|
||||
if (currentModuleAdapter!=null) {
|
||||
currentModuleAdapter.startOpt();
|
||||
return true;
|
||||
} else return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets given hostname and tries to load GOParamsters from given file if non null.
|
||||
*/
|
||||
@ -704,6 +718,14 @@ public class EvAClient implements RemoteStateListener, Serializable {
|
||||
return null;
|
||||
}
|
||||
|
||||
public AbstractStatistics getStatistics() {
|
||||
return ((GenericModuleAdapter)currentModuleAdapter).getStatistics();
|
||||
}
|
||||
|
||||
public InterfaceStatisticsParameter getStatsParams() {
|
||||
return ((GenericModuleAdapter)currentModuleAdapter).getStatistics().getStatisticsParameter();
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if there is an optimization currently running.
|
||||
*
|
||||
|
@ -316,11 +316,6 @@ public class FunctionArea extends DArea implements Serializable {
|
||||
for (int j = 1; j < s.length; j++) { // add column data of place holder if no value in this set
|
||||
if ((j-1) < pset.getSize()) s[j] = s[j] + " " + pset.getDPoint(j - 1).y;
|
||||
else s[j] += " #";
|
||||
// try {
|
||||
// s[j] = s[j] + " " + pset.getDPoint(j - 1).y;
|
||||
// } catch (Exception e) {
|
||||
// s[j] += " ";
|
||||
// }
|
||||
}
|
||||
} else System.err.println("error in FunctionArea::exportToAscii");
|
||||
}
|
||||
|
@ -46,6 +46,7 @@ import com.sun.image.codec.jpeg.JPEGImageEncoder;
|
||||
import eva2.EvAInfo;
|
||||
import eva2.tools.chart2d.DPointSet;
|
||||
import eva2.tools.tool.BasicResourceLoader;
|
||||
import eva2.server.go.populations.Population;
|
||||
/*==========================================================================*
|
||||
* CLASS DECLARATION
|
||||
*==========================================================================*/
|
||||
@ -277,6 +278,19 @@ public class Plot implements PlotInterface, Serializable {
|
||||
m_Frame.setVisible(true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Draw a population to the Plot instance. Each individual is annotated with the
|
||||
* given prefix and its fitness.
|
||||
*
|
||||
* @param prefix
|
||||
* @param pop
|
||||
*/
|
||||
public void drawPopulation(String prefix, Population pop) {
|
||||
for (int i=0; i<pop.size(); i++) {
|
||||
getFunctionArea().drawIcon(1, prefix+" "+pop.getEAIndividual(i).getFitness(0), pop.getEAIndividual(i).getDoublePosition(), 2);
|
||||
}
|
||||
}
|
||||
|
||||
public void setPreferredSize(Dimension prefSize) {
|
||||
if (m_Frame != null) {
|
||||
m_Frame.setPreferredSize(prefSize);
|
||||
|
@ -59,13 +59,17 @@ public class TopoPlot extends Plot {
|
||||
colorScale = color_scale;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
/**
|
||||
* Defines the topology (by setting a specific problem) and draws the topology
|
||||
*/
|
||||
public void setTopology(Interface2DBorderProblem problem) {
|
||||
double[][] border = problem.get2DBorder();
|
||||
double[] sizeXY=Mathematics.shiftRange(border);
|
||||
setTopology(problem, problem.get2DBorder());
|
||||
}
|
||||
/**
|
||||
* Defines the topology (by setting a specific problem) and draws the topology
|
||||
*/
|
||||
public void setTopology(Interface2DBorderProblem problem, double[][] border) {
|
||||
double[] sizeXY=Mathematics.shiftRange(border);
|
||||
double deltaX = sizeXY[0]/gridx;
|
||||
double deltaY = sizeXY[1]/gridy;
|
||||
double[] pos = new double[2];
|
||||
@ -86,8 +90,8 @@ public class TopoPlot extends Plot {
|
||||
m_Frame.setVisible(false);
|
||||
for (int x=0; x<gridx; x++) {
|
||||
for (int y=0; y<gridy; y++) {
|
||||
pos[0] = problem.get2DBorder()[0][0]+x*deltaX;
|
||||
pos[1] = problem.get2DBorder()[1][0]+y*deltaY;
|
||||
pos[0] = border[0][0]+x*deltaX;
|
||||
pos[1] = border[1][0]+y*deltaY;
|
||||
DRectangle rect = new DRectangle(pos[0],pos[1],deltaX,deltaY);
|
||||
Color color = new Color(colorBar.getRGB((float)((problem.functionValue(pos)-min)/fitRange)));
|
||||
// Color color = new Color(255,(int)(problem.doEvaluation(pos)[0]/fitRange*255),(int)(problem.doEvaluation(pos)[0]/fitRange*255));
|
||||
|
@ -28,7 +28,8 @@ public enum PSOTopologyEnum {
|
||||
/**
|
||||
*
|
||||
*/
|
||||
random;
|
||||
random,
|
||||
dms;
|
||||
|
||||
/**
|
||||
* A method to translate the "old" integer tags into the enum type.
|
||||
@ -44,6 +45,7 @@ public enum PSOTopologyEnum {
|
||||
case 4: return tree;
|
||||
case 5: return hpso;
|
||||
case 6: return random;
|
||||
case 7: return dms;
|
||||
default: System.err.println("Error: invalid old topology ID in PSOTopologyEnum translateOldID! Returning grid.");
|
||||
return grid;
|
||||
}
|
||||
|
@ -952,6 +952,28 @@ public abstract class AbstractEAIndividual implements IndividualInterface, java.
|
||||
return getDefaultStringRepresentation(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* For any AbstractEAIndividual try retrieve its position as double[].
|
||||
* Returns null if there is no conversion available. Makes shallow copies if possible.
|
||||
*
|
||||
* @param indy
|
||||
* @return double valued position of an individual or null
|
||||
*/
|
||||
public static double[] getDoublePositionShallow(AbstractEAIndividual indy) {
|
||||
if (indy instanceof InterfaceESIndividual) {
|
||||
return ((InterfaceESIndividual)indy).getDGenotype();
|
||||
} else if (indy instanceof InterfaceDataTypeDouble) {
|
||||
return ((InterfaceDataTypeDouble)indy).getDoubleData();
|
||||
} else if (indy instanceof InterfaceDataTypeInteger) {
|
||||
int[] intData = ((InterfaceDataTypeInteger)indy).getIntegerData();
|
||||
double[] pos = new double[intData.length];
|
||||
for (int i=0; i<intData.length; i++) pos[i] = (double)intData[i];
|
||||
return pos;
|
||||
} // TODO check some more types here?
|
||||
EVAERROR.errorMsgOnce("Unhandled case in AbstractEAIndividual.getPosition()!");
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* For any AbstractEAIndividual try to convert its position to double[] and return it.
|
||||
* Returns null if there is no conversion available.
|
||||
@ -961,9 +983,9 @@ public abstract class AbstractEAIndividual implements IndividualInterface, java.
|
||||
*/
|
||||
public static double[] getDoublePosition(AbstractEAIndividual indy) {
|
||||
if (indy instanceof InterfaceESIndividual) {
|
||||
return ((InterfaceESIndividual)indy).getDGenotype();
|
||||
return ((InterfaceESIndividual)indy).getDGenotype().clone();
|
||||
} else if (indy instanceof InterfaceDataTypeDouble) {
|
||||
return ((InterfaceDataTypeDouble)indy).getDoubleData();
|
||||
return ((InterfaceDataTypeDouble)indy).getDoubleData().clone();
|
||||
} else if (indy instanceof InterfaceDataTypeInteger) {
|
||||
int[] intData = ((InterfaceDataTypeInteger)indy).getIntegerData();
|
||||
double[] pos = new double[intData.length];
|
||||
@ -985,6 +1007,7 @@ public abstract class AbstractEAIndividual implements IndividualInterface, java.
|
||||
return AbstractEAIndividual.getDoublePosition(this);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @return true if parent history logging is activated
|
||||
*
|
||||
|
@ -28,6 +28,7 @@ public class ESIndividualDoubleData extends AbstractEAIndividual implements Inte
|
||||
this.m_CrossoverProbability = 0.5;
|
||||
this.m_CrossoverOperator = new CrossoverESDefault();
|
||||
this.m_Genotype = new double[1];
|
||||
this.m_Phenotype = null;
|
||||
this.m_Range = new double[1][2];
|
||||
this.m_Range[0][0] = -10;
|
||||
this.m_Range[0][1] = 10;
|
||||
@ -170,7 +171,8 @@ public class ESIndividualDoubleData extends AbstractEAIndividual implements Inte
|
||||
* @return double[] representing the double data.
|
||||
*/
|
||||
public double[] getDoubleDataWithoutUpdate() {
|
||||
return this.m_Phenotype;
|
||||
if (m_Phenotype==null) return getDoubleData();
|
||||
else return this.m_Phenotype;
|
||||
}
|
||||
|
||||
/** This method allows you to set the phenotype double data. To change the genotype,
|
||||
|
@ -10,6 +10,7 @@ import eva2.server.go.operators.paramcontrol.InterfaceParameterControl;
|
||||
import eva2.server.go.operators.paramcontrol.NoParamAdaption;
|
||||
import eva2.server.go.operators.paramcontrol.ParamAdaption;
|
||||
import eva2.server.go.operators.paramcontrol.ParameterControlManager;
|
||||
import eva2.server.go.problems.AbstractProblemDouble;
|
||||
import eva2.tools.EVAERROR;
|
||||
|
||||
/**
|
||||
@ -25,6 +26,7 @@ public abstract class AbstractConstraint implements InterfaceDoubleConstraint, S
|
||||
protected ConstraintHandlingEnum handling = ConstraintHandlingEnum.specificTag;
|
||||
protected static boolean TRACE = false;
|
||||
protected double equalityEpsilon = 0.0001; // threshold below which equality constraints are seen as satisfied
|
||||
private AbstractEAIndividual currentIndy = null;
|
||||
|
||||
private double penaltyFactor = 1.;
|
||||
// protected ParamAdaption penaltyFactAdaption = new NoParamAdaption();
|
||||
@ -62,7 +64,6 @@ public abstract class AbstractConstraint implements InterfaceDoubleConstraint, S
|
||||
|
||||
/**
|
||||
* Return the absolute (positive) degree of violation or zero if the constraint is fulfilled.
|
||||
* The penalty factor is included here.
|
||||
*/
|
||||
public double getViolation(double[] indyX) {
|
||||
double viol = getRawViolationValue(indyX);
|
||||
@ -71,13 +72,14 @@ public abstract class AbstractConstraint implements InterfaceDoubleConstraint, S
|
||||
|
||||
/**
|
||||
* Check whether the given individual violates the constraint and immediately add
|
||||
* the violation if it is the case. Expect that the fitness has already been set.
|
||||
* the penalty and violation if it is the case. Expect that the fitness has already been set.
|
||||
* This regards the handling strategy and adds the violation to the fitness (in each dimension) or
|
||||
* sets the individual constraint violation.
|
||||
*
|
||||
* @param indy the individual to check for constraint violation.
|
||||
*/
|
||||
public void addViolation(AbstractEAIndividual indy, double[] indyX) {
|
||||
currentIndy=indy;
|
||||
double v = getViolation(indyX);
|
||||
switch (handling) {
|
||||
case penaltyAdditive:
|
||||
@ -99,6 +101,54 @@ public abstract class AbstractConstraint implements InterfaceDoubleConstraint, S
|
||||
if (v>0) indy.addConstraintViolation(v);
|
||||
break;
|
||||
}
|
||||
currentIndy=null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Some constraints require further information on the individual or work on the
|
||||
* raw fitness which can be requested using this method.
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
protected double[] getIndyRawFit(String key) {
|
||||
return getIndyDblData(AbstractProblemDouble.rawFitKey);
|
||||
}
|
||||
|
||||
/**
|
||||
* Some constraints require further information on the individual, such as
|
||||
* additional individual data. This method uses getData of AbstractEAIndividual
|
||||
* to try to retrieve a double array.
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
protected double[] getIndyDblData(String key) {
|
||||
if (currentIndy!=null) {
|
||||
Object dat = currentIndy.getData(key);
|
||||
if (dat!=null && (dat instanceof double[])) return (double[])dat;
|
||||
else {
|
||||
System.err.println("Error, invalid call to AbstractConstraint.getRawFitness(). Individual had no raw fitness set.");
|
||||
return null;
|
||||
}
|
||||
} else {
|
||||
System.err.println("Error, invalid call to AbstractConstraint.getRawFitness(). Individual was unknown.");
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Some constraints require further information on the individual, such as
|
||||
* additional individual data. This method uses getData of AbstractEAIndividual
|
||||
* to try to retrieve a stored object.
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
protected Object getIndyData(String key) {
|
||||
if (currentIndy!=null) {
|
||||
return currentIndy.getData(key);
|
||||
} else {
|
||||
System.err.println("Error, invalid call to AbstractConstraint.getRawFitness(). Individual was unknown.");
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private double getViolationConsideringRelation(double val) {
|
||||
|
@ -26,8 +26,8 @@ public class EuclideanMetric implements InterfaceDistanceMetric {
|
||||
double[] dIndy1, dIndy2;
|
||||
double result = 0;
|
||||
|
||||
dIndy1 = AbstractEAIndividual.getDoublePosition(indy1);
|
||||
dIndy2 = AbstractEAIndividual.getDoublePosition(indy2);
|
||||
dIndy1 = AbstractEAIndividual.getDoublePositionShallow(indy1);
|
||||
dIndy2 = AbstractEAIndividual.getDoublePositionShallow(indy2);
|
||||
|
||||
for (int i = 0; (i < dIndy1.length) && (i < dIndy2.length); i++) {
|
||||
result += Math.pow((dIndy1[i] - dIndy2[i]), 2);
|
||||
|
@ -111,7 +111,7 @@ public class PhenotypeMetric implements InterfaceDistanceMetric, java.io.Seriali
|
||||
double[] d1, d2;
|
||||
double[][] r1, r2;
|
||||
double tmpResult = 0, tmp=0;
|
||||
d1 = ((InterfaceDataTypeDouble) indy1).getDoubleData();
|
||||
d1 = ((InterfaceDataTypeDouble) indy1).getDoubleData(); // TODO WithoutUpdate would be much quicker - but in which cases is it up to date?
|
||||
r1 = ((InterfaceDataTypeDouble) indy1).getDoubleRange();
|
||||
d2 = ((InterfaceDataTypeDouble) indy2).getDoubleData();
|
||||
r2 = ((InterfaceDataTypeDouble) indy2).getDoubleRange();
|
||||
|
@ -98,9 +98,27 @@ class CMAParamSet implements InterfacePopulationChangedEventListener, Serializab
|
||||
* @return
|
||||
*/
|
||||
public static CMAParamSet initCMAParams(CMAParamSet params, int mu, int lambda, Population pop, double initialSigma) {
|
||||
initCMAParams(params, mu, lambda, pop.getCenter(), ((InterfaceDataTypeDouble)pop.getEAIndividual(0)).getDoubleRange(), initialSigma);
|
||||
pop.addPopulationChangedEventListener(params);
|
||||
return params;
|
||||
}
|
||||
|
||||
/**
|
||||
* Initializes the CMA parameter set for given mu, lambda and a population.
|
||||
* The initialSigma parameter is used as initial sigma directly unless it is <0, in
|
||||
* that case the average range is used as initial sigma.
|
||||
*
|
||||
* @param params the CMA parameter set to be used - its data are overwritten
|
||||
* @param mu ES mu parameter
|
||||
* @param lambda ES lambda parameter
|
||||
* @param pop associated Population
|
||||
* @param initialSigma initial sigma or -1 to indicate the usage of average range
|
||||
* @return
|
||||
*/
|
||||
public static CMAParamSet initCMAParams(CMAParamSet params, int mu, int lambda, double[] center, double[][] range, double initialSigma) {
|
||||
// those are from init:
|
||||
params.firstAdaptionDone = false;
|
||||
params.range = ((InterfaceDataTypeDouble)pop.getEAIndividual(0)).getDoubleRange();
|
||||
params.range = range;
|
||||
|
||||
int dim = params.range.length;
|
||||
// if (TRACE_1) System.out.println("WCMA init " + dim);
|
||||
@ -129,8 +147,7 @@ class CMAParamSet implements InterfacePopulationChangedEventListener, Serializab
|
||||
params.sigma = initialSigma;
|
||||
// System.out.println("INitial sigma: "+sigma);
|
||||
params.firstSigma = params.sigma;
|
||||
params.meanX = pop.getCenter(); // this might be ok?
|
||||
pop.addPopulationChangedEventListener(params);
|
||||
params.meanX = center; // this might be ok?
|
||||
return params;
|
||||
}
|
||||
|
||||
@ -286,6 +303,8 @@ public class MutateESRankMuCMA implements InterfaceMutationGenerational, Seriali
|
||||
int mu,lambda;
|
||||
mu = selectedP.size();
|
||||
lambda = oldGen.size();
|
||||
int generation = oldGen.getGeneration();
|
||||
|
||||
if (mu>= lambda) {
|
||||
EVAERROR.errorMsgOnce("Warning: invalid mu/lambda ratio! Setting mu to lambda/2.");
|
||||
mu = lambda/2;
|
||||
@ -300,9 +319,6 @@ public class MutateESRankMuCMA implements InterfaceMutationGenerational, Seriali
|
||||
params = CMAParamSet.initCMAParams(mu, lambda, oldGen, getInitSigma(oldGen));
|
||||
} else params = (CMAParamSet)oldGen.getData(cmaParamsKey);
|
||||
}
|
||||
|
||||
int generation = oldGen.getGeneration();
|
||||
|
||||
if (TRACE_1) {
|
||||
System.out.println("WCMA adaptGenerational **********");
|
||||
// System.out.println("newPop measures: " + BeanInspector.toString(newPop.getPopulationMeasures()));
|
||||
@ -332,11 +348,16 @@ public class MutateESRankMuCMA implements InterfaceMutationGenerational, Seriali
|
||||
for (int j = 0; j < dim; ++j) {
|
||||
sum += params.mB.get(j,i) * BDz[j]; // times B transposed, (Eq 4) in HK04
|
||||
}
|
||||
zVect[i] = sum / Math.sqrt(params.eigenvalues[i]);
|
||||
if (Double.isInfinite(zVect[i])|| Double.isNaN(zVect[i])) {
|
||||
System.err.println("Error, infinite zVect entry!");
|
||||
zVect[i]=0; // TODO MK
|
||||
}
|
||||
if (params.eigenvalues[i]<0) {
|
||||
EVAERROR.errorMsgOnce("Warning: negative eigenvalue in MutateESRankMuCMA! (possibly multiple cases)");
|
||||
zVect[i]=0;
|
||||
} else {
|
||||
zVect[i] = sum / Math.sqrt(params.eigenvalues[i]);
|
||||
if (!checkValidDouble(zVect[i])) {
|
||||
System.err.println("Error, infinite zVect entry!");
|
||||
zVect[i]=0; // TODO MK
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* cumulation for sigma (ps) using B*z */
|
||||
@ -345,7 +366,7 @@ public class MutateESRankMuCMA implements InterfaceMutationGenerational, Seriali
|
||||
for (int j = 0; j < dim; ++j) sum += params.mB.get(i,j) * zVect[j];
|
||||
newPathS[i] = (1. - params.c_sig) * params.pathS[i]
|
||||
+ Math.sqrt(params.c_sig * (2. - params.c_sig)) * sum;
|
||||
if (Double.isInfinite(newPathS[i]) || Double.isNaN(newPathS[i])) {
|
||||
if (!checkValidDouble(newPathS[i])) {
|
||||
System.err.println("Error, infinite pathS!");
|
||||
}
|
||||
}
|
||||
@ -386,8 +407,11 @@ public class MutateESRankMuCMA implements InterfaceMutationGenerational, Seriali
|
||||
if (Double.isInfinite(sigFact)) params.sigma *= 10.; // in larger search spaces sigma tends to explode after init.
|
||||
else params.sigma *= sigFact;
|
||||
|
||||
testAndCorrectNumerics(params, generation, selectedSorted);
|
||||
|
||||
if (!testAndCorrectNumerics(params, generation, selectedSorted)) {
|
||||
// parameter seemingly exploded...
|
||||
params = CMAParamSet.initCMAParams(params, mu, lambda, params.meanX, ((InterfaceDataTypeDouble)oldGen.getEAIndividual(0)).getDoubleRange(), params.firstSigma);
|
||||
}
|
||||
|
||||
if (TRACE_1) {
|
||||
System.out.print("psLen=" + (psNorm) + " ");
|
||||
outputParams(params, mu);
|
||||
@ -422,10 +446,13 @@ public class MutateESRankMuCMA implements InterfaceMutationGenerational, Seriali
|
||||
/**
|
||||
* Requires selected population to be sorted by fitness.
|
||||
*
|
||||
* @param iterations
|
||||
* @param selected
|
||||
* @param params refering parameter set
|
||||
* @param iterations number of iterations performed
|
||||
* @param selected selected population
|
||||
* @return true if the parameters seem ok or were corrected, false if new parameters must be produced
|
||||
*/
|
||||
void testAndCorrectNumerics(CMAParamSet params, int iterations, Population selected) { // not much left here
|
||||
private boolean testAndCorrectNumerics(CMAParamSet params, int iterations, Population selected) { // not much left here
|
||||
boolean corrected = true;
|
||||
/* Flat Fitness, Test if function values are identical */
|
||||
if (iterations > 1) {
|
||||
// selected pop is sorted
|
||||
@ -438,7 +465,8 @@ public class MutateESRankMuCMA implements InterfaceMutationGenerational, Seriali
|
||||
|
||||
if (!checkValidDouble(params.sigma)) {
|
||||
System.err.println("Error, unstable sigma!");
|
||||
params.sigma=params.firstSigma; // MK TODO
|
||||
corrected = false;
|
||||
// params.sigma=params.firstSigma; // MK TODO
|
||||
// System.err.println(
|
||||
}
|
||||
|
||||
@ -465,6 +493,7 @@ public class MutateESRankMuCMA implements InterfaceMutationGenerational, Seriali
|
||||
}
|
||||
}
|
||||
}
|
||||
return corrected;
|
||||
} // Test...
|
||||
|
||||
private boolean nearlySame(double[] bestFitness, double[] worstFitness) {
|
||||
|
@ -202,10 +202,10 @@ public class PostProcess {
|
||||
Population exclude = new Population();
|
||||
exclude.add(clusters[j].getBestEAIndividual());
|
||||
result.add(exclude.getEAIndividual(0));
|
||||
result.addAll(clusters[j].getRandNIndividualsExcept(n-1, exclude));
|
||||
result.addAll(clusters[j].moveRandNIndividualsExcept(n-1, exclude));
|
||||
break;
|
||||
case RAND_ONLY:
|
||||
result.addAll(clusters[j].getRandNIndividuals(n));
|
||||
result.addAll(clusters[j].moveRandNIndividuals(n));
|
||||
break;
|
||||
default: System.err.println("Unknown mode in PostProcess:clusterBest!"); break;
|
||||
}
|
||||
@ -433,7 +433,7 @@ public class PostProcess {
|
||||
}
|
||||
|
||||
/**
|
||||
* Search for a local minimum using nelder mead and return the solution found and the number of steps
|
||||
* Search for a local minimum using CMA and return the solution found and the number of steps
|
||||
* (evaluations) actually performed. This uses the whole population as starting population for nelder mead
|
||||
* meaning that typically only one best is returned.
|
||||
* Returns the number of function calls really performed by the method; sets the number of function calls
|
||||
@ -448,10 +448,8 @@ public class PostProcess {
|
||||
* @return
|
||||
*/
|
||||
public static int processWithCMA(Population pop, AbstractOptimizationProblem problem, InterfaceTerminator term, int baseEvals) {
|
||||
// GOParameters cmaParams = OptimizerFactory.cmaESIPOP(problem);
|
||||
MutateESRankMuCMA mutator = new MutateESRankMuCMA();
|
||||
mutator.setInitializeSigma(ESMutationInitialSigma.avgInitialDistance);
|
||||
// mutator.
|
||||
EvolutionStrategies es = OptimizerFactory.createEvolutionStrategy(pop.size()/2, pop.size(), false, mutator, 1., new CrossoverESDefault(), 0.,
|
||||
new SelectBestIndividuals(), problem, null);
|
||||
for (int i=0; i<pop.size(); i++) {
|
||||
@ -1006,16 +1004,26 @@ public class PostProcess {
|
||||
public static double findNMSPerturb(Population candidates, int i, double maxPerturb) {
|
||||
double minDistNeighbour = Double.MAX_VALUE;
|
||||
AbstractEAIndividual indy = candidates.getEAIndividual(i);
|
||||
boolean found=false;
|
||||
for (int k=0; k<candidates.size(); k++) {
|
||||
if (k!=i) {
|
||||
double dist = PhenotypeMetric.euclidianDistance(AbstractEAIndividual.getDoublePosition(indy), AbstractEAIndividual.getDoublePosition(candidates.getEAIndividual(k)));
|
||||
double dist = PhenotypeMetric.euclidianDistance(AbstractEAIndividual.getDoublePositionShallow(indy), AbstractEAIndividual.getDoublePositionShallow(candidates.getEAIndividual(k)));
|
||||
if (dist == 0.) {
|
||||
System.err.println("error, equal candidates in findNMSPerturb!");
|
||||
// System.err.println("error, equal candidates in findNMSPerturb!");
|
||||
} else if (dist < minDistNeighbour) {
|
||||
minDistNeighbour = dist;
|
||||
found=true;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!found) {
|
||||
// System.err.println("warning, equal candidates in PostProcess.findNMSPerturb - converged population?!");
|
||||
if (maxPerturb>0) return maxPerturb;
|
||||
else {
|
||||
System.err.println("error, unable to select perturbance value in PostProcess.findNMSPerturb since all candidates are equal. Converged population?!");
|
||||
return 0.01;
|
||||
}
|
||||
}
|
||||
if (maxPerturb>0) return Math.min(maxPerturb, minDistNeighbour/3.);
|
||||
else return minDistNeighbour/3.;
|
||||
}
|
||||
@ -1083,9 +1091,9 @@ public class PostProcess {
|
||||
int cnt = pop.size()-1;
|
||||
if (cnt == 0) return 0.;
|
||||
else {
|
||||
double[] indyPos = AbstractEAIndividual.getDoublePosition(pop.getEAIndividual(index));
|
||||
double[] indyPos = AbstractEAIndividual.getDoublePositionShallow(pop.getEAIndividual(index));
|
||||
for (int i=0; i<pop.size(); i++) {
|
||||
if (i!=index) distSum += PhenotypeMetric.euclidianDistance(AbstractEAIndividual.getDoublePosition(pop.getEAIndividual(i)), indyPos);
|
||||
if (i!=index) distSum += PhenotypeMetric.euclidianDistance(AbstractEAIndividual.getDoublePositionShallow(pop.getEAIndividual(i)), indyPos);
|
||||
}
|
||||
return distSum/((double)cnt);
|
||||
}
|
||||
|
@ -5,9 +5,9 @@ import eva2.server.go.populations.Population;
|
||||
import eva2.tools.math.RNG;
|
||||
|
||||
|
||||
/** Random selection typically used for ES a mating selection.
|
||||
* In case of multiple fitness values the selection
|
||||
* critria is selected randomly for each selection event. pff
|
||||
/**
|
||||
* Random selection typically used for ES as mating selection.
|
||||
*
|
||||
* Created by IntelliJ IDEA.
|
||||
* User: streiche
|
||||
* Date: 18.03.2003
|
||||
@ -17,14 +17,21 @@ import eva2.tools.math.RNG;
|
||||
public class SelectRandom implements InterfaceSelection, java.io.Serializable {
|
||||
|
||||
private boolean m_ObeyDebsConstViolationPrinciple = false;
|
||||
private boolean withReplacement = true;
|
||||
|
||||
public SelectRandom() {
|
||||
}
|
||||
|
||||
public SelectRandom(SelectRandom a) {
|
||||
this.m_ObeyDebsConstViolationPrinciple = a.m_ObeyDebsConstViolationPrinciple;
|
||||
this.withReplacement = a.withReplacement;
|
||||
}
|
||||
|
||||
public SelectRandom(boolean withRepl) {
|
||||
withReplacement=withRepl;
|
||||
if (m_ObeyDebsConstViolationPrinciple) System.err.println("Error, replacement selection not supported for constrained selection (SelectRandom)");
|
||||
}
|
||||
|
||||
public Object clone() {
|
||||
return (Object) new SelectRandom(this);
|
||||
}
|
||||
@ -39,9 +46,9 @@ public class SelectRandom implements InterfaceSelection, java.io.Serializable {
|
||||
// nothing to prepare here
|
||||
}
|
||||
|
||||
/** This method will select one Individual from the given
|
||||
* Population in respect to the selection propability of the
|
||||
* individual.
|
||||
/** This method will select individuals randomly from the given
|
||||
* Population. Individuals may be drawn several times or not at all.
|
||||
*
|
||||
* @param population The source population where to select from
|
||||
* @param size The number of Individuals to select
|
||||
* @return The selected population.
|
||||
@ -64,17 +71,22 @@ public class SelectRandom implements InterfaceSelection, java.io.Serializable {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} else {
|
||||
for (int i = 0; i < size; i++) {
|
||||
result.add(population.get(RNG.randomInt(0, population.size()-1)));
|
||||
}
|
||||
if (withReplacement) {
|
||||
for (int i = 0; i < size; i++) {
|
||||
result.add(population.get(RNG.randomInt(0, population.size()-1)));
|
||||
}
|
||||
} else {
|
||||
if (size > population.size()) throw new RuntimeException("Error, invalid selection: trying to select more individuals (without replacement) than available in SelectRandom.");
|
||||
int[] perm = RNG.randomPerm(size);
|
||||
for (int i=0; i<size; i++) result.add(population.getEAIndividual(perm[i]));
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/** This method allows you to select partners for a given Individual
|
||||
* @param dad The already seleceted parent
|
||||
* @param dad The already selected parent
|
||||
* @param avaiablePartners The mating pool.
|
||||
* @param size The number of partners needed.
|
||||
* @return The selected partners.
|
||||
|
@ -21,9 +21,10 @@ public class ReplaceDeterministicCrowding implements InterfaceReplacement, java.
|
||||
return new ReplaceRandom();
|
||||
}
|
||||
|
||||
/** This method will insert the given individual into the population
|
||||
* by replacing a individual either from the population or the given
|
||||
* subset
|
||||
/**
|
||||
* Take the closest individual within the subset and remove it from pop. Add
|
||||
* indy as a replacement.
|
||||
*
|
||||
* @param indy The individual to insert
|
||||
* @param pop The population
|
||||
* @param sub The subset
|
||||
|
@ -11,7 +11,7 @@ import eva2.server.go.populations.Population;
|
||||
* Time: 15:24:03
|
||||
* To change this template use File | Settings | File Templates.
|
||||
*/
|
||||
public class PreplacePreselection implements InterfaceReplacement, java.io.Serializable {
|
||||
public class ReplacePreselection implements InterfaceReplacement, java.io.Serializable {
|
||||
|
||||
/** The ever present clone method
|
||||
*/
|
@ -28,15 +28,20 @@ public class ReplacementCrowding implements InterfaceReplacement, java.io.Serial
|
||||
this.m_C = b.m_C;
|
||||
}
|
||||
|
||||
public ReplacementCrowding(int C) {
|
||||
setC(C);
|
||||
}
|
||||
|
||||
/** The ever present clone method
|
||||
*/
|
||||
public Object clone() {
|
||||
return new ReplaceRandom();
|
||||
}
|
||||
|
||||
/** This method will insert the given individual into the population
|
||||
* by replacing a individual either from the population or the given
|
||||
* subset
|
||||
/**
|
||||
* From a random subset of size C, the closest is replaced by the given individual.
|
||||
* The sub parameter is not regarded.
|
||||
*
|
||||
* @param indy The individual to insert
|
||||
* @param pop The population
|
||||
* @param sub The subset
|
||||
|
@ -89,7 +89,7 @@ Serializable {
|
||||
}
|
||||
|
||||
public boolean isTerminated(PopulationInterface Pop) {
|
||||
if (!firstTime && isStillConverged(Pop.getBestIndividual())) {
|
||||
if (!firstTime && isStillConverged(Pop)) {
|
||||
if (stagnationTimeHasPassed(Pop)) {
|
||||
// population hasnt improved much for max time, criterion is met
|
||||
msg = getTerminationMessage(tagString);
|
||||
@ -137,8 +137,8 @@ Serializable {
|
||||
* @param curFit
|
||||
* @return
|
||||
*/
|
||||
protected boolean isStillConverged(IndividualInterface indy) {
|
||||
double[] curFit = indy.getFitness();
|
||||
protected boolean isStillConverged(PopulationInterface pop) {
|
||||
double[] curFit = pop.getBestFitness();
|
||||
double dist = PhenotypeMetric.euclidianDistance(oldFit, curFit);
|
||||
boolean ret;
|
||||
if (convergenceCondition.isSelectedString("Relative")) {
|
||||
|
@ -33,15 +33,15 @@ public class PhenotypeConvergenceTerminator extends FitnessConvergenceTerminator
|
||||
* @param curFit
|
||||
* @return
|
||||
*/
|
||||
protected boolean isStillConverged(IndividualInterface indy) {
|
||||
double dist = pMetric.distance(oldIndy, (AbstractEAIndividual)indy);
|
||||
protected boolean isStillConverged(PopulationInterface pop) {
|
||||
double dist = pMetric.distance(oldIndy, (AbstractEAIndividual)pop.getBestIndividual());
|
||||
boolean ret;
|
||||
if (getConvergenceCondition().isSelectedString("Relative")) {
|
||||
ret = (dist < (oldPhenNorm * convThresh));
|
||||
} else {
|
||||
ret = (dist < convThresh);
|
||||
}
|
||||
if (TRACE) System.out.println("isStillConverged returns " + ret + ", dist " + dist + ", old indy " + BeanInspector.toString(oldIndy) + ", cur indy" + BeanInspector.toString(indy));
|
||||
if (TRACE) System.out.println("isStillConverged returns " + ret + ", dist " + dist + ", old indy " + BeanInspector.toString(oldIndy) + ", cur indy" + BeanInspector.toString(pop.getBestIndividual()));
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -14,6 +14,7 @@ import eva2.server.go.PopulationInterface;
|
||||
import eva2.server.go.individuals.AbstractEAIndividual;
|
||||
import eva2.server.go.individuals.AbstractEAIndividualComparator;
|
||||
import eva2.server.go.individuals.GAIndividualBinaryData;
|
||||
import eva2.server.go.individuals.InterfaceDataTypeDouble;
|
||||
import eva2.server.go.operators.distancemetric.InterfaceDistanceMetric;
|
||||
import eva2.server.go.operators.distancemetric.PhenotypeMetric;
|
||||
import eva2.server.go.operators.selection.probability.AbstractSelProb;
|
||||
@ -21,6 +22,8 @@ import eva2.tools.EVAERROR;
|
||||
import eva2.tools.Mathematics;
|
||||
import eva2.tools.Pair;
|
||||
import eva2.tools.math.RNG;
|
||||
import eva2.tools.math.Jama.Matrix;
|
||||
import eva2.tools.tool.StatisticUtils;
|
||||
|
||||
|
||||
/** This is a basic implementation for a EA Population.
|
||||
@ -38,8 +41,8 @@ public class Population extends ArrayList implements PopulationInterface, Clonea
|
||||
protected int m_FunctionCalls = 0;
|
||||
protected int m_Size = 50;
|
||||
protected Population m_Archive = null;
|
||||
|
||||
transient private ArrayList<InterfacePopulationChangedEventListener> listeners = null;
|
||||
PopulationInitMethod initMethod = PopulationInitMethod.individualDefault;
|
||||
transient private ArrayList<InterfacePopulationChangedEventListener> listeners = null;
|
||||
// transient protected InterfacePopulationChangedEventListener m_Listener = null;
|
||||
|
||||
// the evaluation interval at which listeners are notified
|
||||
@ -148,6 +151,15 @@ public class Population extends ArrayList implements PopulationInterface, Clonea
|
||||
return res;
|
||||
}
|
||||
|
||||
/**
|
||||
* Clone the population with shallow copies of the individual. This should be used with care!
|
||||
* @return
|
||||
*/
|
||||
public Population cloneShallowInds() {
|
||||
Population pop = cloneWithoutInds();
|
||||
pop.addAll(this);
|
||||
return pop;
|
||||
}
|
||||
|
||||
/** This method inits the state of the population AFTER the individuals
|
||||
* have been inited by a problem
|
||||
@ -162,6 +174,13 @@ public class Population extends ArrayList implements PopulationInterface, Clonea
|
||||
this.m_Archive.clear();
|
||||
this.m_Archive.init();
|
||||
}
|
||||
switch (initMethod) {
|
||||
case individualDefault:
|
||||
break;
|
||||
case randomLatinHypercube:
|
||||
createRLHSampling(this, false);
|
||||
break;
|
||||
}
|
||||
firePropertyChangedEvent(Population.populationInitialized);
|
||||
}
|
||||
|
||||
@ -183,6 +202,51 @@ public class Population extends ArrayList implements PopulationInterface, Clonea
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a population instance which distributes the individuals according to
|
||||
* a random latin hypercube sampling.
|
||||
*
|
||||
* @param popSize
|
||||
* @param template
|
||||
* @return
|
||||
*/
|
||||
public static Population createRLHSampling(int popSize, AbstractEAIndividual template) {
|
||||
Population pop = new Population(popSize);
|
||||
pop.add(template);
|
||||
createRLHSampling(pop, true);
|
||||
return pop;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a population instance which distributes the individuals according to
|
||||
* a random latin hypercube sampling.
|
||||
*
|
||||
* @param popSize
|
||||
* @param template
|
||||
* @return
|
||||
*/
|
||||
public static void createRLHSampling(Population pop, boolean fillPop) {
|
||||
if (pop.size()<=0) {
|
||||
System.err.println("createRLHSampling needs at least one template individual in the population");
|
||||
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 (template instanceof InterfaceDataTypeDouble) {
|
||||
double[][] range = ((InterfaceDataTypeDouble)template).getDoubleRange();
|
||||
// Population pop = new Population(popSize);
|
||||
Matrix rlhM = StatisticUtils.rlh(pop.size(), range, true);
|
||||
for (int i=0; i<pop.size(); i++) {
|
||||
AbstractEAIndividual tmpIndy = pop.getEAIndividual(i);
|
||||
((InterfaceDataTypeDouble)tmpIndy).SetDoubleGenotype(rlhM.getRowShallow(i));
|
||||
}
|
||||
} else {
|
||||
System.err.println("Error: data type double required for Population.createUniformSampling");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Activate or deactivate the history tracking, which stores the best individual in every
|
||||
* generation in the incrGeneration() method.
|
||||
@ -664,7 +728,7 @@ public class Population extends ArrayList implements PopulationInterface, Clonea
|
||||
int skip = 0;
|
||||
if (!bBestOrWorst) skip = super.size()-n;
|
||||
|
||||
ArrayList<AbstractEAIndividual> sorted = getSorted();
|
||||
ArrayList<AbstractEAIndividual> sorted = getSorted(lastFitCrit);
|
||||
res.clear();
|
||||
for (int i = skip; i < skip+n; i++) {
|
||||
res.add(sorted.get(i));
|
||||
@ -672,6 +736,37 @@ public class Population extends ArrayList implements PopulationInterface, Clonea
|
||||
res.setPopulationSize(res.size());
|
||||
}
|
||||
|
||||
/**
|
||||
* From the given list, remove all but the first n elements.
|
||||
* @param n
|
||||
* @param l
|
||||
*/
|
||||
public static List<AbstractEAIndividual> toHead(int n, List<AbstractEAIndividual> l) {
|
||||
l.subList(n, l.size()).clear();
|
||||
return l;
|
||||
}
|
||||
|
||||
/**
|
||||
* From the given list, remove all but the last n elements.
|
||||
* @param n
|
||||
* @param l
|
||||
*/
|
||||
public static List<AbstractEAIndividual> toTail(int n, List<AbstractEAIndividual> l) {
|
||||
l.subList(0, l.size()-n).clear();
|
||||
return l;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return a new population containing only the last n elements of the instance.
|
||||
* @param n
|
||||
* @param l
|
||||
*/
|
||||
public Population toTail(int n) {
|
||||
Population retPop = new Population(n);
|
||||
retPop.addAll(subList(0, size()-n));
|
||||
return retPop;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set a fitness criterion for sorting procedures. This also affects getBest
|
||||
* @param fitIndex
|
||||
@ -680,16 +775,35 @@ public class Population extends ArrayList implements PopulationInterface, Clonea
|
||||
getSorted(fitIndex);
|
||||
}
|
||||
|
||||
// /**
|
||||
// * Reuses the last fitness criterion. Avoid having to sort again in several calls without modifications in between.
|
||||
// * The returned array should not be modified!
|
||||
// *
|
||||
// * @return
|
||||
// */
|
||||
// protected ArrayList<AbstractEAIndividual> getSorted() {
|
||||
// return getSorted(lastFitCrit);
|
||||
// }
|
||||
|
||||
/**
|
||||
* Reuses the last fitness criterion. Avoid having to sort again in several calls without modifications in between.
|
||||
* Sort the population returning a new ArrayList.
|
||||
* The returned array should not be modified!
|
||||
*
|
||||
* @param comp A comparator by which sorting is performed
|
||||
* @return
|
||||
*/
|
||||
protected ArrayList<AbstractEAIndividual> getSorted() {
|
||||
return getSorted(lastFitCrit);
|
||||
public ArrayList<AbstractEAIndividual> getSorted(AbstractEAIndividualComparator comp) {
|
||||
PriorityQueue<AbstractEAIndividual> sQueue = new PriorityQueue<AbstractEAIndividual>(super.size(), comp);
|
||||
for (int i = 0; i < super.size(); i++) {
|
||||
AbstractEAIndividual indy = getEAIndividual(i);
|
||||
if (indy != null) sQueue.add(indy);
|
||||
}
|
||||
ArrayList<AbstractEAIndividual> sArr = new ArrayList<AbstractEAIndividual>(this.size());
|
||||
AbstractEAIndividual indy;
|
||||
while ((indy=sQueue.poll())!=null) sArr.add(indy);
|
||||
return sArr;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Avoids having to sort again in several calls without modifications in between.
|
||||
* The returned array should not be modified!
|
||||
@ -699,38 +813,57 @@ public class Population extends ArrayList implements PopulationInterface, Clonea
|
||||
*/
|
||||
protected ArrayList<AbstractEAIndividual> getSorted(int fitIndex) {
|
||||
if ((fitIndex != lastFitCrit) || (sortedArr == null) || (super.modCount != lastQModCount)) {
|
||||
lastFitCrit=fitIndex; // TODO check if this works right?
|
||||
PriorityQueue<AbstractEAIndividual> sQueue = new PriorityQueue<AbstractEAIndividual>(super.size(), new AbstractEAIndividualComparator(fitIndex));
|
||||
for (int i = 0; i < super.size(); i++) {
|
||||
AbstractEAIndividual indy = getEAIndividual(i);
|
||||
if (indy != null) sQueue.add(indy);
|
||||
}
|
||||
lastFitCrit=fitIndex;
|
||||
ArrayList<AbstractEAIndividual> sArr = getSorted(new AbstractEAIndividualComparator(fitIndex));
|
||||
if (sortedArr==null) sortedArr = sArr;
|
||||
else {
|
||||
sortedArr.clear();
|
||||
sortedArr.addAll(sArr);
|
||||
}
|
||||
lastQModCount = super.modCount;
|
||||
if (sortedArr==null) sortedArr = new ArrayList<AbstractEAIndividual>(this.size());
|
||||
else sortedArr.clear();
|
||||
AbstractEAIndividual indy;
|
||||
while ((indy=sQueue.poll())!=null) sortedArr.add(indy);
|
||||
}
|
||||
return sortedArr;
|
||||
}
|
||||
|
||||
/** This method returns n random best individuals from the population.
|
||||
|
||||
/**
|
||||
* This method retrieves n random individuals from the population and
|
||||
* returns them within a new population.
|
||||
*
|
||||
* @param n number of individuals to look out for
|
||||
* @return The n best individuals
|
||||
*
|
||||
*/
|
||||
public List<AbstractEAIndividual> getRandNIndividuals(int n) {
|
||||
return getRandNIndividualsExcept(n, new Population());
|
||||
public Population getRandNIndividuals(int n) {
|
||||
if (n>=size()) return (Population)clone();
|
||||
else {
|
||||
Population pop = cloneShallowInds();
|
||||
Population retPop = cloneWithoutInds();
|
||||
moveNInds(n, pop, retPop);
|
||||
return retPop;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* This method removes n random individuals from the population and
|
||||
* returns them within a new population.
|
||||
*
|
||||
* @param n number of individuals to look out for
|
||||
* @return The n best individuals
|
||||
*
|
||||
*/
|
||||
public Population moveRandNIndividuals(int n) {
|
||||
return moveRandNIndividualsExcept(n, new Population());
|
||||
}
|
||||
|
||||
/** This method returns the n current best individuals from the population in an object array.
|
||||
/**
|
||||
* This method removes n random individuals from the population (excluding the given ones)
|
||||
* and returns them in a new population instance.
|
||||
*
|
||||
* @param n number of individuals to look out for
|
||||
* @return The n best individuals
|
||||
* @return The n random individuals
|
||||
*
|
||||
*/
|
||||
public Population getRandNIndividualsExcept(int n, Population exclude) {
|
||||
public Population moveRandNIndividualsExcept(int n, Population exclude) {
|
||||
return moveNInds(n, filter(exclude), new Population());
|
||||
}
|
||||
|
||||
@ -757,7 +890,7 @@ public class Population extends ArrayList implements PopulationInterface, Clonea
|
||||
*/
|
||||
public static void moveRandIndFromTo(Population src, Population dst) {
|
||||
int k = RNG.randomInt(src.size());
|
||||
dst.add(src.remove(k));
|
||||
dst.add(src.removeIndexSwitched(k));
|
||||
}
|
||||
|
||||
/**
|
||||
@ -901,6 +1034,10 @@ public class Population extends ArrayList implements PopulationInterface, Clonea
|
||||
return strB.toString();
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return "Population-"+getPopulationSize();
|
||||
}
|
||||
|
||||
/**
|
||||
* Return a list of individual IDs from the population.
|
||||
* @return
|
||||
@ -999,6 +1136,27 @@ public class Population extends ArrayList implements PopulationInterface, Clonea
|
||||
return prev;
|
||||
}
|
||||
|
||||
/**
|
||||
* ArrayList does not increase the modCount in set. Why???
|
||||
* This method keeps the internally sorted array in synch to minimize complete resorting events.
|
||||
*/
|
||||
public Object set(int index, Object element, int fitIndex) {
|
||||
Object prev = super.set(index, element);
|
||||
modCount++;
|
||||
if (lastFitCrit==fitIndex && (lastQModCount==(modCount-1))) {
|
||||
// if nothing happend between this event and the last sorting by the same criterion...
|
||||
sortedArr.remove(prev);
|
||||
int i=0;
|
||||
AbstractEAIndividualComparator comp = new AbstractEAIndividualComparator(fitIndex);
|
||||
while (i<sortedArr.size() && comp.compare(element, sortedArr.get(i))>0) {
|
||||
i++;
|
||||
}
|
||||
sortedArr.add(i, (AbstractEAIndividual)element);
|
||||
lastQModCount=modCount;
|
||||
}
|
||||
return prev;
|
||||
}
|
||||
|
||||
public boolean addIndividual(IndividualInterface ind) {
|
||||
super.add(ind);
|
||||
return true;
|
||||
@ -1010,10 +1168,12 @@ public class Population extends ArrayList implements PopulationInterface, Clonea
|
||||
*
|
||||
* @param index individual index to be removed
|
||||
*/
|
||||
public void removeIndexSwitched(int index) {
|
||||
public AbstractEAIndividual removeIndexSwitched(int index) {
|
||||
AbstractEAIndividual indy = getEAIndividual(index);
|
||||
int lastIndex = size()-1;
|
||||
if (index < lastIndex) set(index, get(lastIndex));
|
||||
remove(lastIndex);
|
||||
return indy;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1095,8 +1255,8 @@ public class Population extends ArrayList implements PopulationInterface, Clonea
|
||||
|
||||
for (int i = 0; i < this.size(); i++) {
|
||||
for (int j = i+1; j < this.size(); j++) {
|
||||
if (metric == null) d = PhenotypeMetric.euclidianDistance(AbstractEAIndividual.getDoublePosition(getEAIndividual(i)),
|
||||
AbstractEAIndividual.getDoublePosition(getEAIndividual(j)));
|
||||
if (metric == null) d = PhenotypeMetric.euclidianDistance(AbstractEAIndividual.getDoublePositionShallow(getEAIndividual(i)),
|
||||
AbstractEAIndividual.getDoublePositionShallow(getEAIndividual(j)));
|
||||
else d = metric.distance((AbstractEAIndividual)this.get(i), (AbstractEAIndividual)this.get(j));
|
||||
meanDist += d;
|
||||
if (d < minDist) minDist = d;
|
||||
@ -1110,6 +1270,7 @@ public class Population extends ArrayList implements PopulationInterface, Clonea
|
||||
res[1]=0;
|
||||
res[2]=0;
|
||||
}
|
||||
// System.out.println("0-1-dist: " + BeanInspector.toString(metric.distance((AbstractEAIndividual)this.get(0), (AbstractEAIndividual)this.get(1))));
|
||||
return res;
|
||||
}
|
||||
|
||||
@ -1152,6 +1313,32 @@ public class Population extends ArrayList implements PopulationInterface, Clonea
|
||||
return res;
|
||||
}
|
||||
|
||||
/**
|
||||
* Search for the closest (farthest) individual to the given position.
|
||||
* Return a Pair of the individuals index and distance.
|
||||
* If the population is empty, a Pair of (-1,-1) is returned.
|
||||
*
|
||||
* @param pos
|
||||
* @param pop
|
||||
* @param closestOrFarthest if true, the closest individual is retrieved, otherwise the farthest
|
||||
* @return
|
||||
*/
|
||||
public static Pair<Integer,Double> getClosestFarthestIndy(double[] pos, Population pop, boolean closestOrFarthest) {
|
||||
double dist = -1.;
|
||||
int sel=-1;
|
||||
for (int i = 0; i < pop.size(); i++) {
|
||||
AbstractEAIndividual indy = pop.getEAIndividual(i);
|
||||
double[] indyPos = AbstractEAIndividual.getDoublePositionShallow(indy);
|
||||
double curDist = PhenotypeMetric.euclidianDistance(pos, indyPos);
|
||||
if ((dist<0) || (!closestOrFarthest && (dist < curDist))
|
||||
|| (closestOrFarthest && (dist > curDist))) {
|
||||
dist = curDist;
|
||||
sel = i;
|
||||
}
|
||||
}
|
||||
return new Pair<Integer,Double>(sel,dist);
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculate the average position of the population.
|
||||
*
|
||||
@ -1161,7 +1348,7 @@ public class Population extends ArrayList implements PopulationInterface, Clonea
|
||||
if (size()==0) EVAERROR.errorMsgOnce("Invalid pop size in DistractingPopulation:getCenter!");
|
||||
double[] centerPos = AbstractEAIndividual.getDoublePosition(getEAIndividual(0));
|
||||
for (int i=1; i<size(); i++) {
|
||||
Mathematics.vvAdd(centerPos, AbstractEAIndividual.getDoublePosition(getEAIndividual(i)), centerPos);
|
||||
Mathematics.vvAdd(centerPos, AbstractEAIndividual.getDoublePositionShallow(getEAIndividual(i)), centerPos);
|
||||
}
|
||||
Mathematics.svDiv(size(), centerPos, centerPos);
|
||||
return centerPos;
|
||||
@ -1177,7 +1364,7 @@ public class Population extends ArrayList implements PopulationInterface, Clonea
|
||||
double[] centerPos = AbstractEAIndividual.getDoublePosition(getEAIndividual(0));
|
||||
Mathematics.svMult(weights[0], centerPos, centerPos);
|
||||
for (int i=1; i<weights.length; i++) {
|
||||
Mathematics.svvAddScaled(weights[i], AbstractEAIndividual.getDoublePosition(getEAIndividual(i)), centerPos, centerPos);
|
||||
Mathematics.svvAddScaled(weights[i], AbstractEAIndividual.getDoublePositionShallow(getEAIndividual(i)), centerPos, centerPos);
|
||||
}
|
||||
return centerPos;
|
||||
}
|
||||
@ -1195,14 +1382,14 @@ public class Population extends ArrayList implements PopulationInterface, Clonea
|
||||
*/
|
||||
public double[] getCenterWeighted(AbstractSelProb selProb, int criterion, boolean obeyConst) {
|
||||
selProb.computeSelectionProbability(this, "Fitness", obeyConst);
|
||||
double[] mean = AbstractEAIndividual.getDoublePosition(getEAIndividual(0)).clone();
|
||||
double[] mean = AbstractEAIndividual.getDoublePosition(getEAIndividual(0));
|
||||
|
||||
if (mean != null) {
|
||||
Arrays.fill(mean, 0.);
|
||||
AbstractEAIndividual indy = null;
|
||||
for (int i=0; i<size(); i++) {
|
||||
indy = getEAIndividual(i);
|
||||
double[] pos = AbstractEAIndividual.getDoublePosition(indy);
|
||||
double[] pos = AbstractEAIndividual.getDoublePositionShallow(indy);
|
||||
Mathematics.svvAddScaled(indy.getSelectionProbability(criterion), pos, mean, mean);
|
||||
}
|
||||
}
|
||||
@ -1224,8 +1411,8 @@ public class Population extends ArrayList implements PopulationInterface, Clonea
|
||||
for (int i = 0; i < size(); ++i){
|
||||
AbstractEAIndividual currentindy = getEAIndividual(i);
|
||||
if (!indy.equals(currentindy)){ // dont compare particle to itself or a copy of itself
|
||||
double dist = PhenotypeMetric.euclidianDistance(AbstractEAIndividual.getDoublePosition(indy),
|
||||
AbstractEAIndividual.getDoublePosition(currentindy));
|
||||
double dist = PhenotypeMetric.euclidianDistance(AbstractEAIndividual.getDoublePositionShallow(indy),
|
||||
AbstractEAIndividual.getDoublePositionShallow(currentindy));
|
||||
if (dist < mindist){
|
||||
mindist = dist;
|
||||
index = i;
|
||||
@ -1261,8 +1448,8 @@ public class Population extends ArrayList implements PopulationInterface, Clonea
|
||||
if (normalizedPhenoMetric){
|
||||
d = metric.distance(indy, neighbor);
|
||||
} else {
|
||||
d = PhenotypeMetric.euclidianDistance(AbstractEAIndividual.getDoublePosition(indy),
|
||||
AbstractEAIndividual.getDoublePosition(neighbor));
|
||||
d = PhenotypeMetric.euclidianDistance(AbstractEAIndividual.getDoublePositionShallow(indy),
|
||||
AbstractEAIndividual.getDoublePositionShallow(neighbor));
|
||||
}
|
||||
if (calcVariance) distances.add(d);
|
||||
sum += d;
|
||||
@ -1340,6 +1527,36 @@ public class Population extends ArrayList implements PopulationInterface, Clonea
|
||||
setPopulationSize(size());
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the range of all individuals to the given one. If forceRange is true
|
||||
* and the individuals are out of range, they are projected into the range
|
||||
* by force.
|
||||
*
|
||||
* @param modRange
|
||||
* @param b
|
||||
*/
|
||||
public void updateRange(double[][] range, boolean forceRange) {
|
||||
for (int i=0; i<size(); i++) {
|
||||
((InterfaceDataTypeDouble)getEAIndividual(i)).SetDoubleRange(range);
|
||||
double[] pos = ((InterfaceDataTypeDouble)getEAIndividual(i)).getDoubleData();
|
||||
if (!Mathematics.isInRange(pos, range)) {
|
||||
Mathematics.projectToRange(pos, range);
|
||||
((InterfaceDataTypeDouble)getEAIndividual(i)).SetDoubleGenotype(pos);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public PopulationInitMethod getInitMethod() {
|
||||
return initMethod;
|
||||
}
|
||||
|
||||
public void setInitMethod(PopulationInitMethod initMethod) {
|
||||
this.initMethod = initMethod;
|
||||
}
|
||||
|
||||
public String initMethodTipText() {
|
||||
return "Define the initial sampling method. Note that anything other than inidividualDefault will override the individual initialization concerning the positions in solution space.";
|
||||
}
|
||||
// /**
|
||||
// * Check whether the population at the current state has been marked as
|
||||
// * evaluated. This allows to avoid double evaluations.
|
||||
|
5
src/eva2/server/go/populations/PopulationInitMethod.java
Normal file
5
src/eva2/server/go/populations/PopulationInitMethod.java
Normal file
@ -0,0 +1,5 @@
|
||||
package eva2.server.go.populations;
|
||||
|
||||
public enum PopulationInitMethod {
|
||||
individualDefault, randomLatinHypercube;
|
||||
}
|
@ -319,7 +319,7 @@ public abstract class AbstractOptimizationProblem implements InterfaceOptimizati
|
||||
|
||||
// if not provided reasonable values use defaults:
|
||||
if (mutationStepSize<0) mutationStepSize = 0.0001;
|
||||
if (numOfFailures<0) numOfFailures = 100*AbstractEAIndividual.getDoublePosition(this.m_Template).length; // scales the effort with the number of problem dimensions
|
||||
if (numOfFailures<0) numOfFailures = 100*AbstractEAIndividual.getDoublePositionShallow(this.m_Template).length; // scales the effort with the number of problem dimensions
|
||||
|
||||
AbstractEAIndividual indy = (AbstractEAIndividual)orig.clone();
|
||||
this.evaluate(indy); // indy may be evaluated in a normalised way...
|
||||
@ -384,7 +384,7 @@ public abstract class AbstractOptimizationProblem implements InterfaceOptimizati
|
||||
if (orig instanceof InterfaceDataTypeDouble) {
|
||||
initPerturb = epsilonPhenoSpace/(2*(Mathematics.getAvgRange(((InterfaceDataTypeDouble)orig).getDoubleRange())));
|
||||
dim=((InterfaceDataTypeDouble)orig).getDoubleRange().length;
|
||||
if (numOfFailures<0) numOfFailures = 100*AbstractEAIndividual.getDoublePosition(this.m_Template).length; // scales the effort with the number of problem dimensions
|
||||
if (numOfFailures<0) numOfFailures = 100*AbstractEAIndividual.getDoublePositionShallow(this.m_Template).length; // scales the effort with the number of problem dimensions
|
||||
} else {
|
||||
System.err.println("Cannot initialize NMS on non-double valued individuals!");
|
||||
return false;
|
||||
|
@ -1,5 +1,6 @@
|
||||
package eva2.server.go.problems;
|
||||
|
||||
import eva2.gui.BeanInspector;
|
||||
import eva2.gui.GenericObjectEditor;
|
||||
import eva2.server.go.PopulationInterface;
|
||||
import eva2.server.go.individuals.AbstractEAIndividual;
|
||||
@ -40,6 +41,7 @@ public abstract class AbstractProblemDouble extends AbstractOptimizationProblem
|
||||
// PropertySelectableList<AbstractConstraint> constraintList = new PropertySelectableList<AbstractConstraint>(new AbstractConstraint[]{new GenericConstraint()});
|
||||
private AbstractConstraint[] constraintArray = new AbstractConstraint[]{new GenericConstraint()};
|
||||
private boolean withConstraints = false;
|
||||
public static String rawFitKey="UnconstrainedFitnessValue";
|
||||
|
||||
public AbstractProblemDouble() {
|
||||
initTemplate();
|
||||
@ -104,7 +106,10 @@ public abstract class AbstractProblemDouble extends AbstractOptimizationProblem
|
||||
if (m_Noise != 0) RNG.addNoise(fitness, m_Noise);
|
||||
// set the fitness
|
||||
setEvalFitness(individual, x, fitness);
|
||||
if (isWithConstraints()) addConstraints(individual, x);
|
||||
if (isWithConstraints()) {
|
||||
individual.putData(rawFitKey, individual.getFitness());
|
||||
addConstraints(individual, x);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@ -187,7 +192,7 @@ public abstract class AbstractProblemDouble extends AbstractOptimizationProblem
|
||||
* @param dim
|
||||
* @return the lower bound of the double range in the given dimension
|
||||
*/
|
||||
protected double getRangeLowerBound(int dim) {
|
||||
public double getRangeLowerBound(int dim) {
|
||||
return -getDefaultRange();
|
||||
}
|
||||
|
||||
@ -200,7 +205,7 @@ public abstract class AbstractProblemDouble extends AbstractOptimizationProblem
|
||||
* @param dim
|
||||
* @return the upper bound of the double range in the given dimension
|
||||
*/
|
||||
protected double getRangeUpperBound(int dim) {
|
||||
public double getRangeUpperBound(int dim) {
|
||||
return getDefaultRange();
|
||||
}
|
||||
|
||||
@ -369,7 +374,7 @@ public abstract class AbstractProblemDouble extends AbstractOptimizationProblem
|
||||
@Override
|
||||
public String getAdditionalFileStringHeader(PopulationInterface pop) {
|
||||
String superHeader = super.getAdditionalFileStringHeader(pop);
|
||||
if (isWithConstraints()) return superHeader + " \tNum.Viol. \t Sum.Viol.";
|
||||
if (isWithConstraints()) return superHeader + " \tRawFit. \tNum.Viol. \t Sum.Viol.";
|
||||
else return superHeader;
|
||||
}
|
||||
|
||||
@ -377,8 +382,9 @@ public abstract class AbstractProblemDouble extends AbstractOptimizationProblem
|
||||
public String getAdditionalFileStringValue(PopulationInterface pop) {
|
||||
String superVal = super.getAdditionalFileStringValue(pop);
|
||||
if (isWithConstraints()) {
|
||||
Pair<Integer,Double> violation= getConstraintViolation((AbstractEAIndividual)pop.getBestIndividual());
|
||||
return superVal + " \t" + violation.head() + " \t" + violation.tail();
|
||||
AbstractEAIndividual indy = (AbstractEAIndividual)pop.getBestIndividual();
|
||||
Pair<Integer,Double> violation= getConstraintViolation(indy);
|
||||
return superVal + " \t" + BeanInspector.toString(indy.getData(rawFitKey)) + " \t" + violation.head() + " \t" + violation.tail();
|
||||
} else return superVal;
|
||||
}
|
||||
|
||||
|
@ -86,7 +86,7 @@ public class ConstrPressureVessel extends AbstractProblemDouble {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected double getRangeLowerBound(int dim) {
|
||||
public double getRangeLowerBound(int dim) {
|
||||
switch (dim) {
|
||||
case 0:
|
||||
case 1: return minThickness/2;
|
||||
@ -100,7 +100,7 @@ public class ConstrPressureVessel extends AbstractProblemDouble {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected double getRangeUpperBound(int dim) {
|
||||
public double getRangeUpperBound(int dim) {
|
||||
switch (dim) {
|
||||
case 0:
|
||||
case 1: return maxThickness;
|
||||
|
@ -32,8 +32,9 @@ public class ExternalRuntimeProblem extends AbstractOptimizationProblem implemen
|
||||
protected String m_WorkingDir = "";
|
||||
protected double m_upperBound = 10;
|
||||
protected double m_lowerBound = 0;
|
||||
private String additionalArg="";
|
||||
|
||||
// Private Subclass to redirect Streams within an extra Thread to avoid dead
|
||||
// Private Subclass to redirect Streams within an extra Thread to avoid dead
|
||||
// locks
|
||||
private static class MonitorInputStreamThread extends Thread {
|
||||
private Reader reader;
|
||||
@ -165,6 +166,9 @@ public class ExternalRuntimeProblem extends AbstractOptimizationProblem implemen
|
||||
try {
|
||||
List<String> parameters=new ArrayList<String>();
|
||||
parameters.add(this.m_Command);
|
||||
if (additionalArg!=null && (additionalArg.length()>0)) {
|
||||
parameters.add(additionalArg);
|
||||
}
|
||||
for(int i=0;i<this.m_ProblemDimension;i++){
|
||||
parameters.add(new String(""+x[i]));
|
||||
}
|
||||
@ -337,4 +341,14 @@ public class ExternalRuntimeProblem extends AbstractOptimizationProblem implemen
|
||||
return "Lower bound of the search space in any dimension.";
|
||||
}
|
||||
|
||||
public String additionalArgumentTipText() {
|
||||
return "Optionally define an additional (first) argument for the command line command.";
|
||||
}
|
||||
|
||||
public String getAdditionalArgument() {
|
||||
return additionalArg;
|
||||
}
|
||||
public void setAdditionalArgument(String additionalArg) {
|
||||
this.additionalArg = additionalArg;
|
||||
}
|
||||
}
|
||||
|
@ -17,6 +17,9 @@ public class F2Problem extends F1Problem implements InterfaceMultimodalProblem,
|
||||
public F2Problem(F2Problem b) {
|
||||
super(b);
|
||||
}
|
||||
public F2Problem(int dim) {
|
||||
super(dim);
|
||||
}
|
||||
|
||||
/** This method returns a deep clone of the problem.
|
||||
* @return the clone
|
||||
|
@ -28,7 +28,10 @@ public class F6Problem extends F1Problem implements InterfaceMultimodalProblem,
|
||||
this.m_Omega = b.m_Omega;
|
||||
}
|
||||
|
||||
/** This method inits the Problem to log multiruns
|
||||
public F6Problem(int dim) {
|
||||
super(dim);
|
||||
}
|
||||
/** This method inits the Problem to log multiruns
|
||||
*/
|
||||
public void initProblem() {
|
||||
super.initProblem();
|
||||
|
@ -25,7 +25,11 @@ public class F8Problem extends F1Problem implements InterfaceMultimodalProblem,
|
||||
this.c = b.c;
|
||||
}
|
||||
|
||||
/** This method returns a deep clone of the problem.
|
||||
public F8Problem(int dim) {
|
||||
super(dim);
|
||||
setDefaultRange(f8Range);
|
||||
}
|
||||
/** This method returns a deep clone of the problem.
|
||||
* @return the clone
|
||||
*/
|
||||
public Object clone() {
|
||||
|
@ -29,12 +29,12 @@ public class FM0Problem extends AbstractMultiModalProblemKnown implements Interf
|
||||
// this.m_Extrema[1] = 6;
|
||||
}
|
||||
|
||||
protected double getRangeUpperBound(int dim) {
|
||||
public double getRangeUpperBound(int dim) {
|
||||
if (dim == 0) return 2.0;
|
||||
else return 2.8;
|
||||
}
|
||||
|
||||
protected double getRangeLowerBound(int dim) {
|
||||
public double getRangeLowerBound(int dim) {
|
||||
return -1*getRangeUpperBound(dim);
|
||||
}
|
||||
|
||||
|
@ -1,5 +1,7 @@
|
||||
package eva2.server.go.problems;
|
||||
|
||||
import eva2.server.go.individuals.InterfaceDataTypeDouble;
|
||||
|
||||
/**
|
||||
* A minimal interface for double valued problems.
|
||||
*
|
||||
@ -28,4 +30,33 @@ public interface InterfaceProblemDouble {
|
||||
* @return a range array
|
||||
*/
|
||||
public double[][] makeRange();
|
||||
|
||||
/**
|
||||
* Get the EA individual template currently used by the problem.
|
||||
*
|
||||
* @return the EA individual template currently used
|
||||
*/
|
||||
public InterfaceDataTypeDouble getEAIndividual();
|
||||
|
||||
/**
|
||||
* Get the upper bound of the double range in the given dimension. Override
|
||||
* this to implement non-symmetric ranges. User setDefaultRange for symmetric ranges.
|
||||
*
|
||||
* @see makeRange()
|
||||
* @see getRangeLowerBound(int dim)
|
||||
* @param dim
|
||||
* @return the upper bound of the double range in the given dimension
|
||||
*/
|
||||
public double getRangeUpperBound(int dim);
|
||||
|
||||
/**
|
||||
* Get the lower bound of the double range in the given dimension. Override
|
||||
* this to implement non-symmetric ranges. Use setDefaultRange for symmetric ranges.
|
||||
*
|
||||
* @see makeRange()
|
||||
* @see getRangeUpperBound(int dim)
|
||||
* @param dim
|
||||
* @return the lower bound of the double range in the given dimension
|
||||
*/
|
||||
public double getRangeLowerBound(int dim);
|
||||
}
|
||||
|
@ -291,9 +291,11 @@ public class PSymbolicRegression extends AbstractOptimizationProblem implements
|
||||
public static Object getSensorValue(String sensor, double[] vars, double[] consts) {
|
||||
if (sensor.charAt(0)=='X') {
|
||||
try {
|
||||
if (sensor.length()==1) return vars;
|
||||
int index=Integer.parseInt(sensor.substring(1));
|
||||
return new Double(vars[index]);
|
||||
} catch(Exception e) {
|
||||
System.err.println("Warning, unable to access " + sensor);
|
||||
return vars;
|
||||
}
|
||||
} else if (sensor.charAt(0)=='C') {
|
||||
|
@ -9,6 +9,7 @@ import eva2.gui.GraphPointSet;
|
||||
import eva2.gui.Plot;
|
||||
import eva2.gui.TopoPlot;
|
||||
import eva2.server.go.InterfacePopulationChangedEventListener;
|
||||
import eva2.server.go.PopulationInterface;
|
||||
import eva2.server.go.individuals.AbstractEAIndividual;
|
||||
import eva2.server.go.individuals.InterfaceDataTypeDouble;
|
||||
import eva2.server.go.operators.cluster.ClusteringDensityBased;
|
||||
@ -20,6 +21,7 @@ import eva2.server.go.populations.Population;
|
||||
import eva2.server.go.populations.SolutionSet;
|
||||
import eva2.server.go.problems.B1Problem;
|
||||
import eva2.server.go.problems.Interface2DBorderProblem;
|
||||
import eva2.server.go.problems.InterfaceAdditionalPopulationInformer;
|
||||
import eva2.server.go.problems.InterfaceOptimizationProblem;
|
||||
import eva2.server.go.problems.TF1Problem;
|
||||
import eva2.tools.chart2d.DPoint;
|
||||
@ -29,10 +31,8 @@ import eva2.tools.math.RNG;
|
||||
|
||||
/** The infamuos clustering based niching EA, still under construction.
|
||||
* It should be able to identify and track multiple global/local optima
|
||||
* at the same time, but currently i'm not sure what size the subpopulations
|
||||
* is. It is straightforward with a GA but in case of an ES i've changed the
|
||||
* interpretation of the population size and i guess that the mu/lambda ratio
|
||||
* is currently lost.. i'll have to fix that some day.
|
||||
* at the same time.
|
||||
*
|
||||
* Copyright: Copyright (c) 2003
|
||||
* Company: University of Tuebingen, Computer Architecture
|
||||
* @author Felix Streichert
|
||||
@ -41,7 +41,7 @@ import eva2.tools.math.RNG;
|
||||
* $Author: mkron $
|
||||
*/
|
||||
|
||||
public class ClusterBasedNichingEA implements InterfacePopulationChangedEventListener, InterfaceOptimizer, java.io.Serializable {
|
||||
public class ClusterBasedNichingEA implements InterfacePopulationChangedEventListener, InterfaceAdditionalPopulationInformer, InterfaceOptimizer, java.io.Serializable {
|
||||
|
||||
private Population m_Population = new Population();
|
||||
private transient Population m_Archive = new Population();
|
||||
@ -71,7 +71,7 @@ public class ClusterBasedNichingEA implements InterfacePopulationChangedEventLis
|
||||
private int convergedCnt = 0;
|
||||
|
||||
private static boolean TRACE = false;
|
||||
private int m_ShowCycle = 100;
|
||||
private int m_ShowCycle = 0;
|
||||
transient private TopoPlot m_Topology;
|
||||
private int haltingWindow = 15;
|
||||
private double muLambdaRatio = 0.5;
|
||||
@ -639,9 +639,23 @@ public class ClusterBasedNichingEA implements InterfacePopulationChangedEventLis
|
||||
spec.add(survivor);
|
||||
}
|
||||
|
||||
|
||||
public int countActiveSpec() {
|
||||
int k = 0;
|
||||
for (int i=0; i<m_Species.size(); i++) {
|
||||
if (isActive(m_Species.get(i))) k++;
|
||||
}
|
||||
return k;
|
||||
}
|
||||
|
||||
/** This method allows an optimizer to register a change in the optimizer.
|
||||
* @param source The source of the event.
|
||||
* @param name Could be used to indicate the nature of the event.
|
||||
*/
|
||||
public void registerPopulationStateChanged(Object source, String name) {
|
||||
//Population population = ((InterfaceOptimizer)source).getPopulation();
|
||||
}
|
||||
|
||||
public void addPopulationChangedEventListener(InterfacePopulationChangedEventListener ea) {
|
||||
this.m_Listener = ea;
|
||||
}
|
||||
@ -725,6 +739,7 @@ public class ClusterBasedNichingEA implements InterfacePopulationChangedEventLis
|
||||
this.m_Undifferentiated = pop;
|
||||
pop.setUseHistory(true);
|
||||
}
|
||||
|
||||
public String populationTipText() {
|
||||
return "Edit the properties of the population used.";
|
||||
}
|
||||
@ -882,6 +897,10 @@ public class ClusterBasedNichingEA implements InterfacePopulationChangedEventLis
|
||||
return "Determines the size of the initial population.";
|
||||
}
|
||||
|
||||
public String[] getGOEPropertyUpdateLinks() {
|
||||
return new String[] {"population", "populationSize", "populationSize", "population"};
|
||||
}
|
||||
|
||||
// /**
|
||||
// * @return the muLambdaRatio
|
||||
// */
|
||||
@ -914,4 +933,14 @@ public class ClusterBasedNichingEA implements InterfacePopulationChangedEventLis
|
||||
public String haltingWindowTipText() {
|
||||
return "Lenght of the halting window defining when a cluster is seen as converged and frozen; set to zero to disable.";
|
||||
}
|
||||
|
||||
public String getAdditionalFileStringHeader(PopulationInterface pop) {
|
||||
return " Undiff. \t #Act.spec.; \t #Inact.spec.";
|
||||
}
|
||||
|
||||
public String getAdditionalFileStringValue(PopulationInterface pop) {
|
||||
int actives = countActiveSpec();
|
||||
return m_Undifferentiated.size() + " \t " + actives + " \t " + (m_Species.size()-actives);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -150,7 +150,7 @@ public class DynamicParticleSwarmOptimization extends ParticleSwarmOptimization
|
||||
//double[] rand = getUniformRandVect(position.length, range);
|
||||
|
||||
Mathematics.vvAdd(newPos, rand, newPos);
|
||||
if (m_CheckConstraints) {
|
||||
if (m_CheckRange) {
|
||||
Mathematics.projectToRange(newPos, range);
|
||||
}
|
||||
|
||||
|
@ -156,7 +156,7 @@ public class EvolutionStrategyIPOP extends EvolutionStrategies implements Interf
|
||||
super.init();
|
||||
bestList = new LinkedList<AbstractEAIndividual>();
|
||||
best = getPopulation().getBestEAIndividual();
|
||||
dim = AbstractEAIndividual.getDoublePosition(getPopulation().getEAIndividual(0)).length;
|
||||
dim = AbstractEAIndividual.getDoublePositionShallow(getPopulation().getEAIndividual(0)).length;
|
||||
|
||||
fitConvTerm = new FitnessConvergenceTerminator(stagThreshold, (isStagnationTimeUserDef()) ? stagTimeArbitrary : calcDefaultStagnationTime(), false, true); // gen. based, absolute
|
||||
getPopulation().addPopulationChangedEventListener(this);
|
||||
|
@ -123,9 +123,10 @@ public class GeneticAlgorithm implements InterfaceOptimizer, java.io.Serializabl
|
||||
if (this.m_Population == null) System.out.println("population null "+i);
|
||||
|
||||
offSprings = tmpIndy.mateWith(this.m_PartnerSelection.findPartnerFor(tmpIndy, this.m_Population, this.m_NumberOfPartners));
|
||||
for (int j = 0; j < offSprings.length; j++) {
|
||||
offSprings[j].mutate();
|
||||
}
|
||||
// for (int j = 0; j < offSprings.length; j++) {
|
||||
// offSprings[j].mutate(); // quite useless if n-1 are thrown away...
|
||||
// }
|
||||
offSprings[0].mutate();
|
||||
result.add(i, offSprings[0]);
|
||||
}
|
||||
this.evaluatePopulation(result);
|
||||
|
@ -138,7 +138,8 @@ public class NelderMeadSimplex implements InterfaceOptimizer, Serializable, Inte
|
||||
for (int i=0; i<bestpop.size(); i++) {
|
||||
for (int j=0; j<dim; j++) {
|
||||
AbstractEAIndividual bestIndi= (AbstractEAIndividual) bestpop.getIndividual(i);
|
||||
centroid[j] +=((InterfaceDataTypeDouble)bestIndi).getDoubleData()[j]/bestpop.size(); // bug?
|
||||
double[] bestIndyPos = ((InterfaceDataTypeDouble)bestIndi).getDoubleDataWithoutUpdate();
|
||||
centroid[j] +=bestIndyPos[j]/bestpop.size(); // bug?
|
||||
}
|
||||
}
|
||||
|
||||
@ -269,7 +270,7 @@ public class NelderMeadSimplex implements InterfaceOptimizer, Serializable, Inte
|
||||
// m_Problem.evaluate(ind);
|
||||
// this.m_Population.incrFunctionCalls();
|
||||
}
|
||||
m_Population.set(m_Population.getIndexOfWorstIndividual(fitIndex), ind);
|
||||
m_Population.set(m_Population.getIndexOfWorstIndividual(fitIndex), ind, fitIndex);
|
||||
}else{//keine Verbesserung gefunden shrink!!
|
||||
|
||||
double[] u_1 = ((InterfaceDataTypeDouble) m_Population.getBestEAIndividual(fitIndex)).getDoubleData();
|
||||
|
@ -7,19 +7,25 @@ import eva2.gui.BeanInspector;
|
||||
import eva2.gui.GenericObjectEditor;
|
||||
import eva2.gui.TopoPlot;
|
||||
import eva2.server.go.InterfacePopulationChangedEventListener;
|
||||
import eva2.server.go.PopulationInterface;
|
||||
import eva2.server.go.enums.PSOTopologyEnum;
|
||||
import eva2.server.go.enums.PostProcessMethod;
|
||||
import eva2.server.go.individuals.AbstractEAIndividual;
|
||||
import eva2.server.go.individuals.AbstractEAIndividualComparator;
|
||||
import eva2.server.go.individuals.InterfaceDataTypeDouble;
|
||||
import eva2.server.go.operators.distancemetric.PhenotypeMetric;
|
||||
import eva2.server.go.operators.paramcontrol.ParamAdaption;
|
||||
import eva2.server.go.operators.paramcontrol.ParameterControlManager;
|
||||
import eva2.server.go.operators.postprocess.PostProcess;
|
||||
import eva2.server.go.populations.InterfaceSolutionSet;
|
||||
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.Interface2DBorderProblem;
|
||||
import eva2.server.go.problems.InterfaceAdditionalPopulationInformer;
|
||||
import eva2.server.go.problems.InterfaceOptimizationProblem;
|
||||
import eva2.server.go.problems.InterfaceProblemDouble;
|
||||
import eva2.tools.EVAERROR;
|
||||
import eva2.tools.Mathematics;
|
||||
import eva2.tools.SelectedTag;
|
||||
@ -46,13 +52,13 @@ import eva2.tools.math.Jama.Matrix;
|
||||
* Time: 11:23:21
|
||||
* To change this template use File | Settings | File Templates.
|
||||
*/
|
||||
public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Serializable {
|
||||
public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Serializable, InterfaceAdditionalPopulationInformer {
|
||||
|
||||
protected Population m_Population = new Population();
|
||||
Object[] sortedPop = null;
|
||||
protected AbstractEAIndividual m_BestIndividual;
|
||||
protected InterfaceOptimizationProblem m_Problem = new F1Problem();
|
||||
protected boolean m_CheckConstraints = true;
|
||||
protected boolean m_CheckRange = true;
|
||||
protected boolean checkSpeedLimit = false;
|
||||
protected boolean useAlternative = false;
|
||||
protected PSOTopologyEnum topology = PSOTopologyEnum.grid;
|
||||
@ -72,8 +78,12 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se
|
||||
protected int minSubSwarmSize = 2;
|
||||
protected int treeStruct = 1;
|
||||
protected boolean wrapTopology = true;
|
||||
protected int treeBranchDeg = 3;
|
||||
// protected boolean doLocalSearch = false;
|
||||
// protected int localSearchGens=100;
|
||||
// protected int lsStepsPerInd=200;
|
||||
protected int treeLevels, treeOrphans, treeLastFullLevelNodeCnt;
|
||||
protected int dmsRegroupInterval = 10;
|
||||
private transient Vector<int[]> dmsLinks = null;
|
||||
protected ParameterControlManager paramControl = new ParameterControlManager();
|
||||
|
||||
/**
|
||||
@ -92,6 +102,7 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se
|
||||
transient final static String multiSwSizeKey="MultiSwarmSize";
|
||||
transient final static String indexKey="particleIndex";
|
||||
transient final static String sortedIndexKey="sortedParticleIndex";
|
||||
transient final static String dmsGroupIndexKey="dmsGroupIndex";
|
||||
|
||||
protected String m_Identifier = "";
|
||||
transient private InterfacePopulationChangedEventListener m_Listener;
|
||||
@ -110,6 +121,9 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se
|
||||
transient protected boolean m_Show = false;
|
||||
transient protected eva2.gui.Plot m_Plot;
|
||||
|
||||
private boolean externalInitialPop = false;
|
||||
// private double lsCandidateRatio=0.25;
|
||||
|
||||
|
||||
public ParticleSwarmOptimization() {
|
||||
// this.m_Topology = new SelectedTag( "Linear", "Grid", "Star", "Multi-Swarm", "Tree", "HPSO", "Random" );
|
||||
@ -143,11 +157,11 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se
|
||||
/**
|
||||
* Constructor for most common parameters with constriction based approach.
|
||||
*
|
||||
* @param popSize swarm size
|
||||
* @param p1 the value for phi1
|
||||
* @param p2 the value for phi1
|
||||
* @param topo type of the neighbourhood topology
|
||||
* @param topoRange range of the neighbourhood topology
|
||||
* @param popSize swarm size
|
||||
*/
|
||||
public ParticleSwarmOptimization(int popSize, double p1, double p2, PSOTopologyEnum topo, int topoRange) {
|
||||
this();
|
||||
@ -158,6 +172,26 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se
|
||||
topology=topo;
|
||||
}
|
||||
|
||||
// /**
|
||||
// * Constructor for most common parameters with constriction based approach and local search.
|
||||
// *
|
||||
// * @param popSize swarm size
|
||||
// * @param p1 the value for phi1
|
||||
// * @param p2 the value for phi1
|
||||
// * @param topo type of the neighbourhood topology
|
||||
// * @param topoRange range of the neighbourhood topology
|
||||
// * @param lsEveryNGens interval of local search steps in generations
|
||||
// * @param stepsPerInd number of local search steps per individual
|
||||
// * @param candidateRatio ratio of population on which local search is performed
|
||||
// */
|
||||
// public ParticleSwarmOptimization(int popSize, double p1, double p2, PSOTopologyEnum topo, int topoRange, int lsEveryNGens, int stepsPerInd, double candidateRatio) {
|
||||
// this(popSize, p1, p2, topo, topoRange);
|
||||
// setDoLocalSearch(true);
|
||||
// localSearchGens=lsEveryNGens;
|
||||
// lsStepsPerInd=stepsPerInd;
|
||||
// lsCandidateRatio = candidateRatio;
|
||||
// }
|
||||
|
||||
public Object clone() {
|
||||
return (Object) new ParticleSwarmOptimization(this);
|
||||
}
|
||||
@ -180,12 +214,13 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se
|
||||
// topoPlot.dispose();
|
||||
topoPlot = null;
|
||||
}
|
||||
this.m_Problem.initPopulation(this.m_Population);
|
||||
tracedVelocity = null;
|
||||
if (!externalInitialPop) this.m_Problem.initPopulation(this.m_Population);
|
||||
// evaluation needs to be done here now, as its omitted if reset is false
|
||||
initDefaults(this.m_Population);
|
||||
this.evaluatePopulation(this.m_Population);
|
||||
initByPopulation(m_Population, false);
|
||||
initByPopulation(null, false);
|
||||
externalInitialPop = false;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -380,12 +415,17 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se
|
||||
return getPopulationVelSpeed(pop, 2, partVelKey, partTypeKey, defaultType)[0];
|
||||
}
|
||||
|
||||
/** This method will init the optimizer with a given population
|
||||
/**
|
||||
* This method will init the optimizer with a given population or, if pop is null,
|
||||
* initialize the current population as if it was new.
|
||||
* @param pop The initial population
|
||||
* @param reset If true the population is reset.
|
||||
*/
|
||||
public void initByPopulation(Population pop, boolean reset) {
|
||||
this.m_Population = (Population)pop.clone();
|
||||
if (pop != null) {
|
||||
this.m_Population = (Population)pop.clone();
|
||||
externalInitialPop = true;
|
||||
}
|
||||
if (reset) this.m_Population.init();
|
||||
|
||||
AbstractEAIndividual indy;
|
||||
@ -407,13 +447,19 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se
|
||||
|
||||
treeLevels = 0;
|
||||
// the HPSO tree will contain layers 0...HPSOLevels, the last one is "incomplete" with only HPSOOrphans number of nodes
|
||||
while (getMaxNodes(treeBranchDeg, treeLevels) < pop.size()) treeLevels++;
|
||||
treeOrphans = pop.size()-getMaxNodes(treeBranchDeg, treeLevels-1);
|
||||
treeLastFullLevelNodeCnt = (int)Math.pow(treeBranchDeg, treeLevels-1);
|
||||
if (getTopology()==PSOTopologyEnum.hpso || getTopology()==PSOTopologyEnum.tree) {
|
||||
if (m_TopologyRange<2) System.err.println("Error, tree/hpso requires topology range of at least 2!");
|
||||
else {
|
||||
while (getMaxNodes(m_TopologyRange, treeLevels) < m_Population.size()) treeLevels++;
|
||||
treeOrphans = m_Population.size()-getMaxNodes(m_TopologyRange, treeLevels-1);
|
||||
treeLastFullLevelNodeCnt = (int)Math.pow(m_TopologyRange, treeLevels-1);
|
||||
}
|
||||
}
|
||||
if (getTopology()==PSOTopologyEnum.dms) dmsLinks=regroupSwarm(m_Population, getTopologyRange());
|
||||
}
|
||||
|
||||
private boolean defaultsDone(AbstractEAIndividual individual) {
|
||||
return individual.hasData(indexKey);
|
||||
private boolean defaultsDone(AbstractEAIndividual indy) {
|
||||
return (indy.hasData(partVelKey) && indy.hasData(indexKey));
|
||||
}
|
||||
|
||||
/**
|
||||
@ -426,7 +472,7 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se
|
||||
for (int i = 0; i < pop.size(); i++) {
|
||||
indy = (AbstractEAIndividual) pop.get(i);
|
||||
if (indy instanceof InterfaceDataTypeDouble) {
|
||||
initIndividualDefaults(indy, m_InitialVelocity);
|
||||
if (!externalInitialPop || (!defaultsDone(indy))) initIndividualDefaults(indy, m_InitialVelocity);
|
||||
}
|
||||
indy.putData(indexKey, i);
|
||||
indy.SetIndividualIndex(i);
|
||||
@ -460,6 +506,24 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se
|
||||
//try { Thread.sleep(10); } catch(Exception e) {}
|
||||
}
|
||||
|
||||
public static void dumpPop(String prefix, Population pop) {
|
||||
if (prefix!=null) System.out.println(prefix);
|
||||
for (int i=0; i<pop.size(); i++) {
|
||||
AbstractEAIndividual indy=pop.getEAIndividual(i);
|
||||
String info=getParticleInfo(indy);
|
||||
System.out.println(info);
|
||||
}
|
||||
}
|
||||
|
||||
public static String getParticleInfo(AbstractEAIndividual indy) {
|
||||
String str = AbstractEAIndividual.getDefaultStringRepresentation(indy);
|
||||
str += " / Vel: " + BeanInspector.toString(indy.getData(partVelKey));
|
||||
str += " / BestP: " + BeanInspector.toString(indy.getData(partBestPosKey));
|
||||
str += " / BestF: " + BeanInspector.toString(indy.getData(partBestFitKey));
|
||||
str += " / PType: " + indy.getData(partTypeKey);
|
||||
return str;
|
||||
}
|
||||
|
||||
/**
|
||||
* Compare the given attractor fitness value to the one remembered by the neighbour individual
|
||||
* if useHistoric is true, else with the current fitness of the neighbour individual.
|
||||
@ -550,7 +614,7 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se
|
||||
if (checkSpeedLimit) enforceSpeedLimit(curVelocity, range, getSpeedLimit(index));
|
||||
|
||||
// enforce range constraints if necessary
|
||||
if (m_CheckConstraints) ensureConstraints(curPosition, curVelocity, range);
|
||||
if (m_CheckRange) ensureConstraints(curPosition, curVelocity, range);
|
||||
|
||||
plotIndy(curPosition, curVelocity, (Integer)indy.getData(indexKey));
|
||||
// finally update the position
|
||||
@ -603,7 +667,8 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se
|
||||
for (int i=0; i<pop.size(); i++) {
|
||||
AbstractEAIndividual indy = (AbstractEAIndividual)pop.get(i);
|
||||
if (isIndividualToUpdate(indy)) {
|
||||
updateIndProps(indy);
|
||||
updateIndProps(indy, indy);
|
||||
// System.err.println("updated " + i + " - "+ getParticleInfo(indy));
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -622,13 +687,13 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se
|
||||
}
|
||||
|
||||
/**
|
||||
* Write current stats (fitness and position) as best fitness and position into individual properties.
|
||||
* Write current fitness and position as best fitness and position into individual properties.
|
||||
*
|
||||
* @param indy the individual to update
|
||||
* @param srcIndy the individual to update
|
||||
*/
|
||||
protected void updateIndProps(AbstractEAIndividual indy) {
|
||||
indy.putData(partBestFitKey, indy.getFitness().clone());
|
||||
indy.putData(partBestPosKey, ((InterfaceDataTypeDouble)indy).getDoubleData());
|
||||
protected void updateIndProps(AbstractEAIndividual trgIndy, AbstractEAIndividual srcIndy) {
|
||||
trgIndy.putData(partBestFitKey, srcIndy.getFitness().clone());
|
||||
trgIndy.putData(partBestPosKey, ((InterfaceDataTypeDouble)srcIndy).getDoubleData());
|
||||
}
|
||||
|
||||
/**
|
||||
@ -841,7 +906,7 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se
|
||||
double[] localBestPosition = null;
|
||||
double[] localBestFitness = null;
|
||||
int tmpIndex;
|
||||
AbstractEAIndividual bestIndy, indy = (AbstractEAIndividual)pop.get(index);
|
||||
AbstractEAIndividual bestIndy, indy = pop.getEAIndividual(index);
|
||||
boolean useHistoric = true;
|
||||
int sortedIndex=-1;
|
||||
int k;
|
||||
@ -905,13 +970,13 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se
|
||||
sortedIndex = (Integer)((AbstractEAIndividual)sortedPop[index]).getData(sortedIndexKey);
|
||||
|
||||
if (sortedIndex>0) { // its found and its not the root. root has no parent to check for
|
||||
k = getParentIndex(treeBranchDeg, sortedIndex, pop.size());
|
||||
k = getParentIndex(m_TopologyRange, sortedIndex, pop.size());
|
||||
compareAndSetAttractor(localBestFitness, localBestPosition, (AbstractEAIndividual)sortedPop[k], useHistoric);
|
||||
}
|
||||
if (treeStruct == 1) { // loop all children
|
||||
if (isComplete(sortedIndex, pop.size())) { // the node has full degree
|
||||
k = treeBranchDeg*sortedIndex+1; // this is the offset of the nodes children
|
||||
for (int i=0; i<treeBranchDeg; i++) {
|
||||
k = m_TopologyRange*sortedIndex+1; // this is the offset of the nodes children
|
||||
for (int i=0; i<m_TopologyRange; i++) {
|
||||
compareAndSetAttractor(localBestFitness, localBestPosition, (AbstractEAIndividual)sortedPop[k+i], useHistoric);
|
||||
}
|
||||
} else if (isIncomplete(sortedIndex, pop.size())) { // the node does not have full degree but might have orphans
|
||||
@ -935,7 +1000,7 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se
|
||||
break;
|
||||
case hpso: // Hierarchical PSO
|
||||
if (index>=0) {
|
||||
k = getParentIndex(treeBranchDeg, index, pop.size());
|
||||
k = getParentIndex(m_TopologyRange, index, pop.size());
|
||||
// compareAndSet(localBestFitness, localBestPosition, (AbstractEAIndividual)pop.get(k), useHistoric);
|
||||
indy = (AbstractEAIndividual)pop.get(k);
|
||||
System.arraycopy((double[])indy.getData(partBestFitKey), 0, localBestFitness, 0, localBestFitness.length);
|
||||
@ -951,6 +1016,18 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se
|
||||
compareAndSetAttractor(localBestFitness, localBestPosition, indy, useHistoric);
|
||||
}
|
||||
break;
|
||||
case dms:
|
||||
int groupIndex = (Integer)pop.getEAIndividual(index).getData(dmsGroupIndexKey);
|
||||
int[] groupLinks = dmsLinks.get(groupIndex);
|
||||
for (int i=0; i<groupLinks.length; i++) {
|
||||
if (groupLinks[i]!=index) {
|
||||
// select informant
|
||||
indy = pop.getEAIndividual(groupLinks[i]);
|
||||
// set local values
|
||||
compareAndSetAttractor(localBestFitness, localBestPosition, indy, useHistoric);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
return localBestPosition;
|
||||
}
|
||||
@ -1028,7 +1105,7 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se
|
||||
for (int i = 0; i < curPosition.length; i++) {
|
||||
newPosition[i] = curPosition[i] + curVelocity[i];
|
||||
}
|
||||
if (m_CheckConstraints && isOutOfRange(newPosition, range)) {
|
||||
if (m_CheckRange && isOutOfRange(newPosition, range)) {
|
||||
System.err.println("error, individual violates constraints!");
|
||||
}
|
||||
|
||||
@ -1036,7 +1113,7 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se
|
||||
if (indy instanceof InterfaceDataTypeDouble) ((InterfaceDataTypeDouble)indy).SetDoubleGenotype(newPosition);
|
||||
else {
|
||||
((InterfaceDataTypeDouble) indy).SetDoubleGenotype(newPosition); // WARNING, this does a checkBounds in any case!
|
||||
if (!m_CheckConstraints) System.err.println("warning, checkbounds will be forced by InterfaceESIndividual!");
|
||||
if (!m_CheckRange) System.err.println("warning, checkbounds will be forced by InterfaceESIndividual!");
|
||||
}
|
||||
|
||||
indy.putData(partVelKey, curVelocity);
|
||||
@ -1090,44 +1167,36 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se
|
||||
if (isOutOfRange(pos, range)) {
|
||||
System.err.println("warning, ensureConstraints called with already violating position (PSO)... reinitializing particle.");
|
||||
for (int i=0; i<pos.length; i++) {
|
||||
pos[i]=RNG.randomDouble(range[i][0],range[i][1]);
|
||||
newPos[i] = pos[i] + velocity[i];
|
||||
if (!Mathematics.isInRange(pos[i], range[i][0], range[i][1])) pos[i]=RNG.randomDouble(range[i][0],range[i][1]);
|
||||
}
|
||||
} else {
|
||||
for (int i = 0; i < pos.length; i++) {
|
||||
if ((newPos[i] < range[i][0]) || (newPos[i] > range[i][1])) {
|
||||
if ((pos[i] == range[i][0]) || (pos[i] == range[i][1])) {
|
||||
// bounce?
|
||||
velocity[i] *= reduceSpeedOnConstViolation; // bounce velocity and reduce
|
||||
if (((pos[i] == range[i][0]) && (newPos[i] < range[i][0])) || ((pos[i] == range[i][1]) && (newPos[i] > range[i][1]))) {
|
||||
velocity[i] *= -1; // bounce only if leaving in this direction.
|
||||
}
|
||||
newPos[i] = pos[i]+velocity[i];
|
||||
} else {
|
||||
// set vel. to land on the bounds
|
||||
velocity[i] = (newPos[i] < range[i][0]) ? (range[i][0]-pos[i]) : (range[i][1]-pos[i]);
|
||||
newPos[i] = pos[i]+velocity[i];
|
||||
if ((newPos[i] < range[i][0]) || (newPos[i] > range[i][1])) {
|
||||
velocity[i]*=.999; /// beware of floating point errors.
|
||||
newPos[i] = pos[i]+velocity[i];
|
||||
}
|
||||
}
|
||||
for (int i = 0; i < pos.length; i++) {
|
||||
if (!Mathematics.isInRange(newPos[i], range[i][0], range[i][1])) {
|
||||
if ((pos[i] == range[i][0]) || (pos[i] == range[i][1])) {
|
||||
// bounce?
|
||||
velocity[i] *= reduceSpeedOnConstViolation; // bounce velocity and reduce
|
||||
if (((pos[i] == range[i][0]) && (newPos[i] < range[i][0])) || ((pos[i] == range[i][1]) && (newPos[i] > range[i][1]))) {
|
||||
velocity[i] *= -1; // bounce only if leaving in this direction.
|
||||
}
|
||||
while ((newPos[i] < range[i][0]) || (newPos[i] > range[i][1])) {
|
||||
//System.err.println("missed, pos was " + pos[i] + " vel was "+velocity[i]);
|
||||
velocity[i]*=reduceSpeedOnConstViolation;
|
||||
newPos[i] = pos[i]+velocity[i];
|
||||
} else {
|
||||
// set vel. to land on the bounds
|
||||
velocity[i] = (newPos[i] < range[i][0]) ? (range[i][0]-pos[i]) : (range[i][1]-pos[i]);
|
||||
newPos[i] = pos[i]+velocity[i];
|
||||
if ((newPos[i] < range[i][0]) || (newPos[i] > range[i][1])) {
|
||||
velocity[i]*=.999; /// beware of floating point errors.
|
||||
newPos[i] = pos[i]+velocity[i];
|
||||
}
|
||||
}
|
||||
while ((newPos[i] < range[i][0]) || (newPos[i] > range[i][1])) {
|
||||
//System.err.println("missed, pos was " + pos[i] + " vel was "+velocity[i]);
|
||||
velocity[i]*=reduceSpeedOnConstViolation;
|
||||
newPos[i] = pos[i]+velocity[i];
|
||||
}
|
||||
}
|
||||
//for (int i = 0; i < pos.length; i++) newPos[i] = pos[i] + velocity[i];
|
||||
if (isOutOfRange(newPos, range)) {
|
||||
System.err.println("narg, still out of range");
|
||||
}
|
||||
|
||||
// while (isOutOfRange(newPos, range)) {
|
||||
// for (int i = 0; i < velocity.length; i++) velocity[i] *= reduceSpeedOnConstViolation;
|
||||
// for (int i = 0; i < pos.length; i++) newPos[i] = pos[i] + velocity[i];
|
||||
// }
|
||||
}
|
||||
if (isOutOfRange(newPos, range)) {
|
||||
System.err.println("narg, still out of range");
|
||||
}
|
||||
}
|
||||
|
||||
@ -1149,6 +1218,26 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se
|
||||
|
||||
// System.out.println(">>> " + m_Population.getBestEAIndividual().getStringRepresentation());
|
||||
|
||||
// if (doLocalSearch && (m_Population.getGeneration()%localSearchGens==0)) {
|
||||
//// System.out.println("Local search at gen "+m_Population.getGeneration());
|
||||
// Population bestN = m_Population.getBestNIndividuals(Math.max(1,(int)(lsCandidateRatio*m_Population.size())));
|
||||
//// Population bestN = m_Population.getSortedNIndividuals(Math.max(1,(int)(lsCandidateRatio*m_Population.size())), false);
|
||||
// Population cands=(Population)bestN.clone();
|
||||
// int maxSteps=cands.size()*lsStepsPerInd;
|
||||
// int stepsDone = PostProcess.processSingleCandidates(PostProcessMethod.nelderMead, cands, maxSteps, 0.01, (AbstractOptimizationProblem)this.m_Problem, null);
|
||||
// for (int i=0; i<cands.size(); i++) {
|
||||
// if (AbstractEAIndividual.isDominatingFitnessNotEqual(cands.getEAIndividual(i).getFitness(),
|
||||
// (double[])bestN.getEAIndividual(i).getData(partBestFitKey))) {
|
||||
//// System.out.println("Improved to " + BeanInspector.toString(cands.getEAIndividual(i).getFitness()) + " from " + BeanInspector.toString((double[])bestN.getEAIndividual(i).getData(partBestFitKey)));
|
||||
// updateIndProps(bestN.getEAIndividual(i), cands.getEAIndividual(i));
|
||||
// }
|
||||
// }
|
||||
// if (stepsDone>maxSteps) {
|
||||
//// System.err.println("Warning: more steps performed than alloed in PSO LS: " + stepsDone + " vs. " + maxSteps);
|
||||
// m_Population.incrFunctionCallsBy(stepsDone);
|
||||
// } else m_Population.incrFunctionCallsBy(maxSteps);
|
||||
// }
|
||||
|
||||
this.firePropertyChangedEvent(Population.nextGenerationPerformed);
|
||||
|
||||
if (sleepTime > 0 ) try { Thread.sleep(sleepTime); } catch(Exception e) {}
|
||||
@ -1245,7 +1334,11 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se
|
||||
protected void updateTopology(Population pop) {
|
||||
// int topoID = this.m_Topology.getSelectedTag().getID();
|
||||
// this.m_Topology = new SelectedTag( "Linear", "Grid", "Star", "Multi-Swarm", "Tree", "HPSO", "Random" );
|
||||
|
||||
if (topology == PSOTopologyEnum.dms) { // Dynamic multi-swarm after Liang & Suganthan
|
||||
if (pop.getGeneration() % getDmsRegroupGens()==0) {
|
||||
dmsLinks = regroupSwarm(pop, getTopologyRange());
|
||||
}
|
||||
}
|
||||
if ((topology == PSOTopologyEnum.multiSwarm) || (topology == PSOTopologyEnum.tree)) {
|
||||
sortedPop = pop.toArray();
|
||||
if ((topology == PSOTopologyEnum.multiSwarm) || (treeStruct>=2)) Arrays.sort(sortedPop, new AbstractEAIndividualComparator());
|
||||
@ -1312,7 +1405,7 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se
|
||||
AbstractEAIndividualComparator comp = new AbstractEAIndividualComparator(partBestFitKey);
|
||||
for (int i=0; i<pop.size(); i++) {
|
||||
// loop over the part of the tree which is complete (full degree in each level)
|
||||
parentIndex=getParentIndex(treeBranchDeg, i, pop.size());
|
||||
parentIndex=getParentIndex(m_TopologyRange, i, pop.size());
|
||||
if (comp.compare(pop.get(i), pop.get(parentIndex)) < 0) { // sibling is dominant!
|
||||
// so switch them
|
||||
indy = (AbstractEAIndividual)pop.get(i);
|
||||
@ -1349,6 +1442,49 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Randomly assign groups of size groupSize.
|
||||
*
|
||||
* @param links
|
||||
* @param groupSize
|
||||
*/
|
||||
private Vector<int[]> regroupSwarm(Population pop, int groupSize) {
|
||||
int numGroups = pop.size() / groupSize; // truncated integer: last group is larger
|
||||
int[] perm = RNG.randomPerm(pop.size());
|
||||
|
||||
Vector<int[]> links = new Vector<int[]>(numGroups);
|
||||
for (int i=0; i<numGroups; i++) {
|
||||
if (i<numGroups-1) links.add(new int[groupSize]);
|
||||
else links.add(new int[pop.size()-(groupSize*i)]); // the last group is larger
|
||||
int[] group=links.get(i);
|
||||
for (int k=0; k<group.length; k++) {
|
||||
group[k]=perm[groupSize*i+k];
|
||||
pop.getEAIndividual(group[k]).putData(dmsGroupIndexKey, i);
|
||||
}
|
||||
}
|
||||
return links;
|
||||
}
|
||||
|
||||
// /**
|
||||
// * Randomly assign groups of size groupSize.
|
||||
// *
|
||||
// * @param links
|
||||
// * @param groupSize
|
||||
// */
|
||||
// private int[] regroupSwarm(Population pop, int groupSize) {
|
||||
// int groupIndex, numGroups = pop.size() / groupSize; // truncated integer: last group is larger
|
||||
//// int hangover = pop.size()-(numGroups*groupSize); // Ueberhangmandate ... woanders zuteilen um einergruppen zu vermeiden
|
||||
//
|
||||
// int[] perm = RNG.randomPerm(pop.size());
|
||||
//
|
||||
// for (int k=0; k<perm.length; k++) {
|
||||
// groupIndex=k/groupSize;
|
||||
// if (groupIndex>=numGroups) groupIndex--;
|
||||
// pop.getEAIndividual(perm[k]).putData(dmsGroupIndexKey, groupIndex);
|
||||
// }
|
||||
// return perm;
|
||||
// }
|
||||
|
||||
/**
|
||||
* This method is simply for debugging.
|
||||
*/
|
||||
@ -1429,7 +1565,8 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se
|
||||
* @return The name of the algorithm
|
||||
*/
|
||||
public String getName() {
|
||||
return "PSO-"+getPhi1()+"_"+getPhi2();
|
||||
// return "PSO-"+getTopology()+getTopologyRange()+(isDoLocalSearch() ? "-ls_" : "_")+getPhi1()+"_"+getPhi2();
|
||||
return "PSO-"+getTopology()+getTopologyRange()+"_"+getPhi1()+"_"+getPhi2();
|
||||
}
|
||||
|
||||
/** Assuming that all optimizer will store thier data in a population
|
||||
@ -1614,7 +1751,7 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se
|
||||
// this.m_Topology = new SelectedTag( "Linear", "Grid", "Star", "Multi-Swarm", "Tree", "HPSO", "Random" );
|
||||
|
||||
// linear, grid, random
|
||||
GenericObjectEditor.setShowProperty(cls, "topologyRange", (topology==PSOTopologyEnum.linear) || (topology==PSOTopologyEnum.grid) || (topology==PSOTopologyEnum.random));
|
||||
GenericObjectEditor.setShowProperty(cls, "topologyRange", (topology==PSOTopologyEnum.linear) || (topology==PSOTopologyEnum.grid) || (topology==PSOTopologyEnum.random) || (topology==PSOTopologyEnum.tree) || (topology==PSOTopologyEnum.hpso) || (topology==PSOTopologyEnum.dms));
|
||||
// multi swarm
|
||||
GenericObjectEditor.setShowProperty(cls, "subSwarmRadius", (topology==PSOTopologyEnum.multiSwarm));
|
||||
// multi swarm
|
||||
@ -1622,9 +1759,11 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se
|
||||
// tree
|
||||
GenericObjectEditor.setShowProperty(cls, "treeStruct", (topology==PSOTopologyEnum.tree));
|
||||
// tree, hpso
|
||||
GenericObjectEditor.setShowProperty(cls, "treeBranchDegree", (topology==PSOTopologyEnum.tree) || (topology==PSOTopologyEnum.hpso));
|
||||
// GenericObjectEditor.setShowProperty(cls, "treeBranchDegree", (topology==PSOTopologyEnum.tree) || (topology==PSOTopologyEnum.hpso));
|
||||
// linear
|
||||
GenericObjectEditor.setShowProperty(cls, "wrapTopology", (topology==PSOTopologyEnum.linear));
|
||||
// dms
|
||||
GenericObjectEditor.setShowProperty(cls, "dmsRegroupGens", (topology==PSOTopologyEnum.dms));
|
||||
}
|
||||
|
||||
public PSOTopologyEnum getTopology() {
|
||||
@ -1666,14 +1805,14 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se
|
||||
/** Toggle Check Constraints.
|
||||
* @param s Check Constraints.
|
||||
*/
|
||||
public void setCheckConstraints(boolean s) {
|
||||
this.m_CheckConstraints = s;
|
||||
public void setCheckRange(boolean s) {
|
||||
this.m_CheckRange = s;
|
||||
}
|
||||
public boolean isCheckConstraints() {
|
||||
return this.m_CheckConstraints;
|
||||
public boolean isCheckRange() {
|
||||
return this.m_CheckRange;
|
||||
}
|
||||
public String checkConstraintsTipText() {
|
||||
return "Toggle constraints check (whether particles are allowed to leave the range).";
|
||||
public String checkRangeTipText() {
|
||||
return "Toggle whether particles are allowed to leave the range.";
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1773,18 +1912,6 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se
|
||||
// this.useAlternative = useAlternative;
|
||||
// }
|
||||
|
||||
public int getTreeBranchDegree() {
|
||||
return treeBranchDeg;
|
||||
}
|
||||
|
||||
public void setTreeBranchDegree(int branch) {
|
||||
treeBranchDeg = branch;
|
||||
}
|
||||
|
||||
public String treeBranchDegreeTipText() {
|
||||
return "Set the branch degree of the tree topology.";
|
||||
}
|
||||
|
||||
public boolean isWrapTopology() {
|
||||
return wrapTopology;
|
||||
}
|
||||
@ -1829,10 +1956,57 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se
|
||||
for (int i=0; i<population.size(); i++) {
|
||||
double[] personalBestPos = (double[]) population.getEAIndividual(i).getData(partBestPosKey);
|
||||
double[] personalBestfit = (double[]) population.getEAIndividual(i).getData(partBestFitKey);
|
||||
double relDiff = (personalBestfit[0]-((InterfaceProblemDouble)m_Problem).eval(personalBestPos)[0])/personalBestfit[0];
|
||||
// if (personalBestfit[0]!=((InterfaceProblemDouble)m_Problem).eval(personalBestPos)[0]) {
|
||||
if (Math.abs(relDiff)>1e-20) {
|
||||
System.err.println("Warning: mismatching best fitness by " + relDiff);
|
||||
System.err.println("partInfo: " + i + " - " + getParticleInfo(population.getEAIndividual(i)));
|
||||
}
|
||||
if (Math.abs(relDiff)>1e-10) {
|
||||
System.err.println("partInfo: " + i + " - " + getParticleInfo(population.getEAIndividual(i)));
|
||||
throw new RuntimeException("Mismatching best fitness!! " + personalBestfit[0] + " vs. " + ((InterfaceProblemDouble)m_Problem).eval(personalBestPos)[0]);
|
||||
}
|
||||
((InterfaceDataTypeDouble)indy).SetDoubleGenotype(personalBestPos);
|
||||
indy.SetFitness(personalBestfit);
|
||||
bests.add((AbstractEAIndividual)indy.clone());
|
||||
}
|
||||
return bests;
|
||||
}
|
||||
|
||||
public int getDmsRegroupGens() {
|
||||
return dmsRegroupInterval;
|
||||
}
|
||||
|
||||
public void setDmsRegroupGens(int dmsRegroupInterval) {
|
||||
this.dmsRegroupInterval = dmsRegroupInterval;
|
||||
}
|
||||
|
||||
public String dmsRegroupGensTipText() {
|
||||
return "The number of generations after which new subswarms are randomly formed.";
|
||||
}
|
||||
|
||||
// public boolean isDoLocalSearch() {
|
||||
// return doLocalSearch;
|
||||
// }
|
||||
//
|
||||
// public void setDoLocalSearch(boolean doLocalSearch) {
|
||||
// this.doLocalSearch = doLocalSearch;
|
||||
// }
|
||||
|
||||
public String getAdditionalFileStringHeader(PopulationInterface pop) {
|
||||
if (emaPeriods > 0) return " \tMeanCurSpeed \tMeanEMASpeed";
|
||||
else return " \tMeanCurSpeed";
|
||||
}
|
||||
|
||||
public String getAdditionalFileStringValue(PopulationInterface pop) {
|
||||
String res=" \t";
|
||||
AbstractEAIndividual indy = (AbstractEAIndividual)pop.get(0);
|
||||
if (emaPeriods>0) {
|
||||
if (indy instanceof InterfaceDataTypeDouble) {
|
||||
res = getRelativeEMASpeed(((InterfaceDataTypeDouble)indy).getDoubleRange()) + " \t";
|
||||
} else res=Double.NaN + " \t";;
|
||||
}
|
||||
res += getPopulationAvgNormedVelocity((Population) pop);
|
||||
return res;
|
||||
}
|
||||
}
|
@ -5,18 +5,12 @@ import java.io.Serializable;
|
||||
|
||||
import eva2.gui.GenericObjectEditor;
|
||||
import eva2.server.go.InterfaceGOParameters;
|
||||
import eva2.server.go.InterfacePopulationChangedEventListener;
|
||||
import eva2.server.go.InterfaceTerminator;
|
||||
import eva2.server.go.enums.PSOTopologyEnum;
|
||||
import eva2.server.go.operators.selection.InterfaceSelection;
|
||||
import eva2.server.go.operators.terminators.EvaluationTerminator;
|
||||
import eva2.server.go.populations.Population;
|
||||
import eva2.server.go.problems.B1Problem;
|
||||
import eva2.server.go.problems.F1Problem;
|
||||
import eva2.server.go.problems.InterfaceOptimizationProblem;
|
||||
import eva2.server.go.strategies.InterfaceOptimizer;
|
||||
import eva2.server.go.strategies.ParticleSwarmOptimization;
|
||||
import eva2.server.go.strategies.PopulationBasedIncrementalLearning;
|
||||
import eva2.tools.SelectedTag;
|
||||
import eva2.tools.Serializer;
|
||||
|
||||
@ -174,14 +168,14 @@ public class PSOParameters extends AbstractGOParameters implements InterfaceGOPa
|
||||
/** Toggle Check Constraints.
|
||||
* @param s Check Constraints.
|
||||
*/
|
||||
public void setCheckConstraints(boolean s) {
|
||||
((ParticleSwarmOptimization)this.m_Optimizer).setCheckConstraints(s);
|
||||
public void setCheckRange(boolean s) {
|
||||
((ParticleSwarmOptimization)this.m_Optimizer).setCheckRange(s);
|
||||
}
|
||||
public boolean isCheckConstraints() {
|
||||
return ((ParticleSwarmOptimization)this.m_Optimizer).isCheckConstraints();
|
||||
public boolean isCheckRange() {
|
||||
return ((ParticleSwarmOptimization)this.m_Optimizer).isCheckRange();
|
||||
}
|
||||
public String checkConstraintsTipText() {
|
||||
return ((ParticleSwarmOptimization)this.m_Optimizer).checkConstraintsTipText();
|
||||
return ((ParticleSwarmOptimization)this.m_Optimizer).checkRangeTipText();
|
||||
}
|
||||
|
||||
/** This method allows you to choose the topology type.
|
||||
@ -264,23 +258,23 @@ public class PSOParameters extends AbstractGOParameters implements InterfaceGOPa
|
||||
return ((ParticleSwarmOptimization)this.m_Optimizer).algoTypeTipText();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the treeBranchDeg
|
||||
*/
|
||||
public int getTreeBranchDegree() {
|
||||
return ((ParticleSwarmOptimization)this.m_Optimizer).getTreeBranchDegree();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param treeBranchDeg the treeBranchDeg to set
|
||||
*/
|
||||
public void setTreeBranchDegree(int treeBranchDeg) {
|
||||
((ParticleSwarmOptimization)this.m_Optimizer).setTreeBranchDegree(treeBranchDeg);
|
||||
}
|
||||
|
||||
public String treeBranchDegreeTipText() {
|
||||
return ((ParticleSwarmOptimization)this.m_Optimizer).treeBranchDegreeTipText();
|
||||
}
|
||||
// /**
|
||||
// * @return the treeBranchDeg
|
||||
// */
|
||||
// public int getTreeBranchDegree() {
|
||||
// return ((ParticleSwarmOptimization)this.m_Optimizer).getTreeBranchDegree();
|
||||
// }
|
||||
//
|
||||
// /**
|
||||
// * @param treeBranchDeg the treeBranchDeg to set
|
||||
// */
|
||||
// public void setTreeBranchDegree(int treeBranchDeg) {
|
||||
// ((ParticleSwarmOptimization)this.m_Optimizer).setTreeBranchDegree(treeBranchDeg);
|
||||
// }
|
||||
//
|
||||
// public String treeBranchDegreeTipText() {
|
||||
// return ((ParticleSwarmOptimization)this.m_Optimizer).treeBranchDegreeTipText();
|
||||
// }
|
||||
|
||||
/**
|
||||
* @return the wrapTopology
|
||||
|
@ -290,12 +290,14 @@ public class Processor extends Thread implements InterfaceProcessor, InterfacePo
|
||||
else if (terminator instanceof EvaluationTerminator)
|
||||
args = new Object[] {optimizer, optimizer.getPopulation(), optimizer.getPopulation().getFunctionCalls(), ((EvaluationTerminator)terminator).getFitnessCalls()};
|
||||
// ((InterfaceParameterControl)paramCtrl).updateParameters(optimizer, optimizer.getPopulation().getFunctionCalls(), ((EvaluationTerminator)terminator).getFitnessCalls());
|
||||
else args = new Object[]{optimizer, optimizer.getPopulation()};
|
||||
else args = null;//new Object[]{optimizer, optimizer.getPopulation()};
|
||||
// ((InterfaceParameterControl)paramCtrl).updateParameters(optimizer);
|
||||
|
||||
iterateParamCtrl(optimizer, "updateParameters", args);
|
||||
args[0]=goParams.getProblem();
|
||||
iterateParamCtrl(goParams.getProblem(), "updateParameters", args);
|
||||
if (args != null) { // only if iteration counting is available
|
||||
iterateParamCtrl(optimizer, "updateParameters", args);
|
||||
args[0]=goParams.getProblem();
|
||||
iterateParamCtrl(goParams.getProblem(), "updateParameters", args);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -13,9 +13,11 @@ import eva2.gui.BeanInspector;
|
||||
import eva2.server.go.IndividualInterface;
|
||||
import eva2.server.go.PopulationInterface;
|
||||
import eva2.server.go.individuals.AbstractEAIndividual;
|
||||
import eva2.server.go.operators.distancemetric.InterfaceDistanceMetric;
|
||||
import eva2.server.go.populations.Population;
|
||||
import eva2.server.go.problems.InterfaceAdditionalPopulationInformer;
|
||||
import eva2.tools.Mathematics;
|
||||
import eva2.tools.Pair;
|
||||
|
||||
/**
|
||||
* An abstract class handling statistics. Most important stuff happens in startOptPerformed, stopOptPerformed
|
||||
@ -42,7 +44,7 @@ public abstract class AbstractStatistics implements InterfaceTextListener, Inter
|
||||
*/
|
||||
private boolean refineMultiRuns = true;
|
||||
private ArrayList<double[][]> meanCollection;
|
||||
|
||||
private Double[] additionalInfoSums = null, lastAdditionalInfoSums=null;
|
||||
|
||||
// say whether the object should be written to a file every time
|
||||
private boolean saveParams = true;
|
||||
@ -67,13 +69,15 @@ public abstract class AbstractStatistics implements InterfaceTextListener, Inter
|
||||
// protected double[] meanBestOfRunFitness;
|
||||
protected double avgPopDist;
|
||||
protected double maxPopDist;
|
||||
protected IndividualInterface bestCurrentIndividual, bestRunIndividual, bestRunFeasibleIndy, bestFeasibleAllover, bestIndividualAllover;
|
||||
protected IndividualInterface bestCurrentIndy, bestOfRunIndy, bestOfRunFeasibleIndy, bestFeasibleAllRuns, bestIndyAllRuns;
|
||||
|
||||
// collect feasible results of a run
|
||||
private ArrayList<IndividualInterface> runBestFeasibleList;
|
||||
private ArrayList<IndividualInterface> runBestFitList;
|
||||
|
||||
private ArrayList<InterfaceTextListener> textListeners;
|
||||
private List<InterfaceAdditionalPopulationInformer> lastInformerList = null;
|
||||
private PopulationInterface lastPop = null;
|
||||
|
||||
public AbstractStatistics() {
|
||||
firstPlot = true;
|
||||
@ -99,7 +103,7 @@ public abstract class AbstractStatistics implements InterfaceTextListener, Inter
|
||||
* @param infoString
|
||||
*/
|
||||
protected void initOutput(String infoString) {
|
||||
SimpleDateFormat formatter = new SimpleDateFormat("E'_'yyyy.MM.dd'_at_'hh.mm.ss");
|
||||
SimpleDateFormat formatter = new SimpleDateFormat("E'_'yyyy.MM.dd'_at_'HH.mm.ss");
|
||||
String startDate = formatter.format(new Date());
|
||||
// open the result file:
|
||||
if (doFileOutput() // not "text-window only"
|
||||
@ -148,22 +152,26 @@ public abstract class AbstractStatistics implements InterfaceTextListener, Inter
|
||||
convergenceCnt = 0;
|
||||
if (saveParams) m_StatsParams.saveInstance();
|
||||
initOutput(infoString);
|
||||
bestIndividualAllover = null;
|
||||
bestFeasibleAllover = null;
|
||||
bestIndyAllRuns = null;
|
||||
bestFeasibleAllRuns = null;
|
||||
// meanBestOfRunFitness = null;
|
||||
// meanBestFeasibleFit = null;
|
||||
runBestFeasibleList = new ArrayList<IndividualInterface>();
|
||||
runBestFitList = new ArrayList<IndividualInterface>();
|
||||
if (refineMultiRuns) meanCollection = new ArrayList<double[][]>();
|
||||
else meanCollection = null;
|
||||
additionalInfoSums = null;
|
||||
lastAdditionalInfoSums = null;
|
||||
feasibleFoundAfterSum=-1;
|
||||
numOfRunsFeasibleFound=0;
|
||||
}
|
||||
feasibleFoundAfter=-1;
|
||||
bestCurrentIndividual = null;
|
||||
bestRunIndividual = null;
|
||||
bestCurrentIndy = null;
|
||||
bestOfRunIndy = null;
|
||||
currentBestFeasibleFit=null;
|
||||
bestRunFeasibleIndy = null;
|
||||
bestOfRunFeasibleIndy = null;
|
||||
lastInformerList = null;
|
||||
lastPop = null;
|
||||
runIterCnt = 0;
|
||||
if (printRunIntroVerbosity()) printToTextListener("\n****** Multirun "+runNumber);
|
||||
if (params != null) {
|
||||
@ -187,15 +195,15 @@ public abstract class AbstractStatistics implements InterfaceTextListener, Inter
|
||||
if (printRunStoppedVerbosity() && (stopMessage != null)) printToTextListener(" Termination message: " + stopMessage + "\n");
|
||||
if (printRunStoppedVerbosity()) printToTextListener(" Function calls run: " + functionCalls + ", sum: " + functionCallSum + "\n");
|
||||
// check for convergence
|
||||
if (bestCurrentIndividual != null) {
|
||||
if (Mathematics.norm(bestCurrentIndividual.getFitness()) < this.m_StatsParams.getConvergenceRateThreshold()) {
|
||||
if (bestCurrentIndy != null) {
|
||||
if (Mathematics.norm(bestCurrentIndy.getFitness()) < this.m_StatsParams.getConvergenceRateThreshold()) {
|
||||
convergenceCnt++;
|
||||
}
|
||||
if (printRunStoppedVerbosity()) printIndy("Last best", bestCurrentIndividual);
|
||||
if (printRunStoppedVerbosity()) printIndy("Last best", bestCurrentIndy);
|
||||
}
|
||||
if (bestRunIndividual != null) {
|
||||
runBestFitList.add(bestRunIndividual);
|
||||
if (printRunStoppedVerbosity()) printIndy("Run best", bestRunIndividual);
|
||||
if (bestOfRunIndy != null) {
|
||||
runBestFitList.add(bestOfRunIndy);
|
||||
if (printRunStoppedVerbosity()) printIndy("Run best", bestOfRunIndy);
|
||||
// if (meanBestOfRunFitness==null) {
|
||||
// meanBestOfRunFitness=bestRunIndividual.getFitness().clone();
|
||||
// } else addSecond(meanBestOfRunFitness, bestRunIndividual.getFitness());
|
||||
@ -205,31 +213,46 @@ public abstract class AbstractStatistics implements InterfaceTextListener, Inter
|
||||
} else {
|
||||
if (printRunStoppedVerbosity()) printToTextListener(" NO feasible individual found.\n");
|
||||
}
|
||||
if (bestRunFeasibleIndy != null) {
|
||||
runBestFeasibleList.add(bestRunFeasibleIndy);
|
||||
if (bestOfRunFeasibleIndy != null) {
|
||||
runBestFeasibleList.add(bestOfRunFeasibleIndy);
|
||||
// if (meanBestFeasibleFit==null) {
|
||||
// meanBestFeasibleFit=bestRunFeasibleIndy.getFitness().clone();
|
||||
// } else addSecond(meanBestFeasibleFit, bestRunFeasibleIndy.getFitness());
|
||||
if (printRunStoppedVerbosity()) {
|
||||
if ((bestRunFeasibleIndy instanceof AbstractEAIndividual) && ((AbstractEAIndividual)bestRunFeasibleIndy).equalGenotypes((AbstractEAIndividual)bestRunIndividual)) {
|
||||
if ((bestOfRunFeasibleIndy instanceof AbstractEAIndividual) && ((AbstractEAIndividual)bestOfRunFeasibleIndy).equalGenotypes((AbstractEAIndividual)bestOfRunIndy)) {
|
||||
printToTextListener("* Run best feasible individual equals best individual.\n");
|
||||
} else {
|
||||
if (bestRunIndividual instanceof AbstractEAIndividual) {
|
||||
if (((AbstractEAIndividual)bestRunIndividual).violatesConstraint())
|
||||
printToTextListener(" Run best individual violates constraints by " + ((AbstractEAIndividual)bestRunIndividual).getConstraintViolation() + "\n");
|
||||
if (((AbstractEAIndividual)bestRunIndividual).isMarkedPenalized())
|
||||
if (bestOfRunIndy instanceof AbstractEAIndividual) {
|
||||
if (((AbstractEAIndividual)bestOfRunIndy).violatesConstraint())
|
||||
printToTextListener(" Run best individual violates constraints by " + ((AbstractEAIndividual)bestOfRunIndy).getConstraintViolation() + "\n");
|
||||
if (((AbstractEAIndividual)bestOfRunIndy).isMarkedPenalized())
|
||||
printToTextListener(" Run best individual is penalized.\n");
|
||||
}
|
||||
printIndy("Run best feasible", bestRunFeasibleIndy);
|
||||
printIndy("Run best feasible", bestOfRunFeasibleIndy);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (printFinalVerbosity()) printToTextListener(".");
|
||||
if (m_StatsParams.isOutputAdditionalInfo()) updateLastAdditionalInfo();
|
||||
// if (currentBestFit!= null) {
|
||||
// if (printRunStoppedVerbosity()) printToTextListener(" Best Fitness: " + BeanInspector.toString(currentBestFit) + "\n");
|
||||
// }
|
||||
if (optRunsPerformed == m_StatsParams.getMultiRuns()) finalizeOutput();
|
||||
if (optRunsPerformed >= m_StatsParams.getMultiRuns()) {
|
||||
if (printFinalVerbosity()) printToTextListener("\n");
|
||||
finalizeOutput();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private PopulationInterface makeStatsPop() {
|
||||
Population pop = new Population(4);
|
||||
|
||||
if (bestCurrentIndy!=null) pop.add(bestCurrentIndy);
|
||||
if (bestOfRunIndy!=null) pop.add(bestOfRunIndy);
|
||||
if (bestOfRunFeasibleIndy!=null) pop.add(bestOfRunFeasibleIndy);
|
||||
if (bestIndyAllRuns!=null) pop.add(bestIndyAllRuns);
|
||||
return pop;
|
||||
}
|
||||
|
||||
private void printIndy(String prefix, IndividualInterface indy) {
|
||||
printToTextListener("* " + prefix + " ind.: " + BeanInspector.toString(indy) + '\n');
|
||||
printToTextListener(" solution data : " + AbstractEAIndividual.getDefaultDataString(indy) + '\n');
|
||||
@ -251,7 +274,17 @@ public abstract class AbstractStatistics implements InterfaceTextListener, Inter
|
||||
printToTextListener(" Average evaluations until feasible ind. was found in " + numOfRunsFeasibleFound + " runs: " + feasibleFoundAfterSum/numOfRunsFeasibleFound + " evaluations\n");
|
||||
}
|
||||
|
||||
if (printFinalVerbosity() && (bestIndividualAllover != null)) printIndy("Overall best", bestIndividualAllover);
|
||||
if (printFinalVerbosity() && (additionalInfoSums != null)) {
|
||||
printToTextListener(" Averaged additional info: ");
|
||||
for (int i=0; i<additionalInfoSums.length; i++) if (additionalInfoSums[i]!=null) printToTextListener(" \t"+(additionalInfoSums[i]/optRunsPerformed));
|
||||
printToTextListener("\n Averaged last additional info: ");
|
||||
for (int i=0; i<lastAdditionalInfoSums.length; i++) if (lastAdditionalInfoSums[i]!=null) printToTextListener(" \t"+(lastAdditionalInfoSums[i]/optRunsPerformed));
|
||||
printToTextListener("\n");
|
||||
}
|
||||
|
||||
if (printFinalVerbosity() && (bestIndyAllRuns != null)) printIndy("Overall best", bestIndyAllRuns);
|
||||
if (printFinalVerbosity() && (m_StatsParams.isOutputAdditionalInfo())) printToTextListener(getFinalAdditionalInfo()+'\n');
|
||||
|
||||
if (optRunsPerformed>1) {
|
||||
if (runBestFitList.size()>0) {
|
||||
// Mathematics.svDiv((double)optRunsPerformed, meanBestOfRunFitness, meanBestOfRunFitness);
|
||||
@ -262,7 +295,7 @@ public abstract class AbstractStatistics implements InterfaceTextListener, Inter
|
||||
printToTextListener(" MultiRun stats: Median best fitn.: " + BeanInspector.toString(calcMedianFit(runBestFitList))+"\n");
|
||||
}
|
||||
}
|
||||
if (printFinalVerbosity() && (bestFeasibleAllover != null)) printIndy("Overall best feasible", bestFeasibleAllover);
|
||||
if (printFinalVerbosity() && (bestFeasibleAllRuns != null)) printIndy("Overall best feasible", bestFeasibleAllRuns);
|
||||
// if ((runBestFeasibleList.size()>0) && (!equalLists(runBestFeasibleList, runBestFitList))) { // is there a difference between best feasibles and best fit?
|
||||
if (runBestFeasibleList.size()>0) { // always output feasible stats even if theyre equal
|
||||
if (printFinalVerbosity()) {
|
||||
@ -290,6 +323,15 @@ public abstract class AbstractStatistics implements InterfaceTextListener, Inter
|
||||
}
|
||||
}
|
||||
|
||||
private String getFinalAdditionalInfo() {
|
||||
PopulationInterface bestPop = makeStatsPop();
|
||||
StringBuffer sbuf = new StringBuffer("Overall best additional data: "+ getAdditionalInfoHeader(lastInformerList, bestPop));
|
||||
sbuf.append('\n');
|
||||
appendAdditionalInfo(lastInformerList, bestPop, sbuf);
|
||||
// getOutputLine(lastInformerList, makeStatsPop());
|
||||
return sbuf.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Perform a deep equals test on the fitness vectors of both individual lists.
|
||||
* @param l1
|
||||
@ -402,15 +444,21 @@ public abstract class AbstractStatistics implements InterfaceTextListener, Inter
|
||||
if ((informerList == null) || !m_StatsParams.isOutputAdditionalInfo()) {
|
||||
return headline;
|
||||
} else {
|
||||
for (InterfaceAdditionalPopulationInformer informer : informerList) {
|
||||
headline = headline + "\t " + informer.getAdditionalFileStringHeader(pop);
|
||||
}
|
||||
return headline;
|
||||
return headline + getAdditionalInfoHeader(informerList, pop);
|
||||
}
|
||||
}
|
||||
|
||||
protected String getOutputLine(List<InterfaceAdditionalPopulationInformer> informerList, PopulationInterface pop) {
|
||||
protected String getAdditionalInfoHeader(List<InterfaceAdditionalPopulationInformer> informerList, PopulationInterface pop) {
|
||||
String hdr="";
|
||||
for (InterfaceAdditionalPopulationInformer informer : informerList) {
|
||||
hdr = hdr + "\t " + informer.getAdditionalFileStringHeader(pop);
|
||||
}
|
||||
return hdr;
|
||||
}
|
||||
|
||||
protected Pair<String,Double[]> getOutputLine(List<InterfaceAdditionalPopulationInformer> informerList, PopulationInterface pop) {
|
||||
StringBuffer sbuf = new StringBuffer(Integer.toString(functionCalls));
|
||||
Double[] addNums = null;
|
||||
sbuf.append(" \t ");
|
||||
sbuf.append(BeanInspector.toString(currentBestFit));
|
||||
if (meanFitness != null) {
|
||||
@ -421,15 +469,54 @@ public abstract class AbstractStatistics implements InterfaceTextListener, Inter
|
||||
sbuf.append(" \t ");
|
||||
sbuf.append(BeanInspector.toString(currentWorstFit));
|
||||
} else sbuf.append(" # \t");
|
||||
if (informerList != null && m_StatsParams.isOutputAdditionalInfo()) {
|
||||
for (InterfaceAdditionalPopulationInformer informer : informerList) {
|
||||
sbuf.append(" \t ");
|
||||
sbuf.append(informer.getAdditionalFileStringValue(pop));
|
||||
}
|
||||
}
|
||||
return sbuf.toString();
|
||||
if (m_StatsParams.isOutputAdditionalInfo()) addNums = appendAdditionalInfo(informerList, pop, sbuf);
|
||||
return new Pair<String,Double[]>(sbuf.toString(),addNums);
|
||||
}
|
||||
|
||||
/**
|
||||
* Append additional informer informations to the given StringBuffer.
|
||||
*
|
||||
* @param informerList
|
||||
* @param pop
|
||||
* @param sbuf
|
||||
*/
|
||||
protected Double[] appendAdditionalInfo(List<InterfaceAdditionalPopulationInformer> informerList, PopulationInterface pop, StringBuffer sbuf) {
|
||||
if (informerList != null) {
|
||||
StringBuffer addBuffer = new StringBuffer();
|
||||
for (InterfaceAdditionalPopulationInformer informer : informerList) {
|
||||
addBuffer.append(" \t ");
|
||||
addBuffer.append(informer.getAdditionalFileStringValue(pop));
|
||||
}
|
||||
String addInfo = addBuffer.toString();
|
||||
Double[] retVals = parseDoubles(addInfo, "\t");
|
||||
if (sbuf!=null) sbuf.append(addInfo);
|
||||
return retVals;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse Double from a String separated by the given regular expression.
|
||||
* For Substrings which do not convert to Double by Double.parseDouble(String),
|
||||
* a null value is added as representative.
|
||||
*
|
||||
* @param str
|
||||
* @param colSplit
|
||||
* @return
|
||||
*/
|
||||
public static Double[] parseDoubles(String str, String splitRegExp) {
|
||||
ArrayList<Double> vals = new ArrayList<Double>();
|
||||
String[] entries = str.split(splitRegExp);
|
||||
for (int i=0; i<entries.length; i++) {
|
||||
Double d = null;
|
||||
try {
|
||||
d = Double.parseDouble(entries[i]);
|
||||
} catch(Exception e) { }
|
||||
vals.add(d); // null if unsuccessfull
|
||||
}
|
||||
return (Double[])vals.toArray(new Double[vals.size()]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated The method {@link #createNextGenerationPerformed(PopulationInterface, List)} should be used instead.
|
||||
*/
|
||||
@ -448,11 +535,52 @@ public abstract class AbstractStatistics implements InterfaceTextListener, Inter
|
||||
}
|
||||
if ((runIterCnt == 0) && printHeaderByVerbosity()) printToTextListener(getOutputHeader(null, null)+'\n');
|
||||
|
||||
if (doTextOutput() && printLineByVerbosity(calls)) printToTextListener(getOutputLine(null, null)+'\n');
|
||||
if (doTextOutput() && printLineByVerbosity(calls)) {
|
||||
Pair<String,Double[]> addInfo = getOutputLine(null, null);
|
||||
printToTextListener(addInfo.head()+'\n');
|
||||
if (addInfo.tail()!=null) {
|
||||
additionalInfoSums = updateAdditionalInfo(additionalInfoSums, addInfo.tail());
|
||||
}
|
||||
}
|
||||
plotCurrentResults();
|
||||
runIterCnt++;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add the given array to the member array. Do some checks etc.
|
||||
* If a resultSum array is provided, it is used to add the info and returned. Otherwise
|
||||
* a new array is allocated.
|
||||
*
|
||||
* @param curInfo
|
||||
*/
|
||||
private Double[] updateAdditionalInfo(Double[] resultSum, Double[] curInfo) {
|
||||
if (resultSum==null) {
|
||||
resultSum = curInfo.clone();
|
||||
} else {
|
||||
if (curInfo.length != resultSum.length) {
|
||||
System.err.println("Error in AbstractStatistics.updateAdditionalInfo: mismatching info arrays!");
|
||||
} else {
|
||||
for (int i=0; i<curInfo.length; i++) {
|
||||
if (resultSum[i]==null || (curInfo[i]==null)) resultSum[i]=null;
|
||||
else resultSum[i]+=curInfo[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
return resultSum;
|
||||
}
|
||||
|
||||
/**
|
||||
* Re-request the last additional information from the lastInfomerList and update the
|
||||
* Double value sums.
|
||||
*
|
||||
* @param pop
|
||||
*/
|
||||
private void updateLastAdditionalInfo() {
|
||||
// TODO Auto-generated method stub
|
||||
Double[] lastVals = appendAdditionalInfo(lastInformerList, lastPop, null);
|
||||
lastAdditionalInfoSums = updateAdditionalInfo(lastAdditionalInfoSums, lastVals);
|
||||
}
|
||||
|
||||
/**
|
||||
* If the population returns a specific data array, this method is called instead of doing standard output
|
||||
* @param pop
|
||||
@ -473,6 +601,8 @@ public abstract class AbstractStatistics implements InterfaceTextListener, Inter
|
||||
*/
|
||||
public synchronized void createNextGenerationPerformed(PopulationInterface
|
||||
pop, List<InterfaceAdditionalPopulationInformer> informerList) {
|
||||
lastInformerList = informerList;
|
||||
lastPop = pop;
|
||||
if (firstPlot) {
|
||||
initPlots(m_StatsParams.getPlotDescriptions());
|
||||
// if (doTextOutput()) printToTextListener(getOutputHeader(informer, pop)+'\n');
|
||||
@ -486,20 +616,20 @@ public abstract class AbstractStatistics implements InterfaceTextListener, Inter
|
||||
return;
|
||||
}
|
||||
// by default plotting only the best
|
||||
bestCurrentIndividual = pop.getBestIndividual().getClone();
|
||||
if ((bestIndividualAllover == null) || (secondIsBetter(bestIndividualAllover, bestCurrentIndividual))) {
|
||||
bestIndividualAllover = bestCurrentIndividual;
|
||||
bestCurrentIndy = pop.getBestIndividual().getClone();
|
||||
if ((bestIndyAllRuns == null) || (secondIsBetter(bestIndyAllRuns, bestCurrentIndy))) {
|
||||
bestIndyAllRuns = bestCurrentIndy;
|
||||
// printToTextListener("new best found!, last was " + BeanInspector.toString(bestIndividualAllover) + "\n");
|
||||
}
|
||||
if ((bestRunIndividual==null) || (secondIsBetter(bestRunIndividual, bestCurrentIndividual))) {
|
||||
bestRunIndividual=bestCurrentIndividual;
|
||||
if ((bestOfRunIndy==null) || (secondIsBetter(bestOfRunIndy, bestCurrentIndy))) {
|
||||
bestOfRunIndy=bestCurrentIndy;
|
||||
}
|
||||
// IndividualInterface WorstInd = Pop.getWorstIndividual();
|
||||
if (bestCurrentIndividual == null) {
|
||||
if (bestCurrentIndy == null) {
|
||||
System.err.println("createNextGenerationPerformed BestInd==null");
|
||||
}
|
||||
|
||||
currentBestFit = bestCurrentIndividual.getFitness().clone();
|
||||
currentBestFit = bestCurrentIndy.getFitness().clone();
|
||||
if (currentBestFit == null) {
|
||||
System.err.println("BestFitness==null !");
|
||||
}
|
||||
@ -513,12 +643,12 @@ public abstract class AbstractStatistics implements InterfaceTextListener, Inter
|
||||
feasibleFoundAfterSum+=feasibleFoundAfter;
|
||||
}
|
||||
currentBestFeasibleFit = curBestFeasible.getFitness().clone();
|
||||
if ((bestRunFeasibleIndy==null) || (secondIsBetter(bestRunFeasibleIndy, curBestFeasible))) {
|
||||
bestRunFeasibleIndy=(AbstractEAIndividual)curBestFeasible.clone();
|
||||
if ((bestOfRunFeasibleIndy==null) || (secondIsBetter(bestOfRunFeasibleIndy, curBestFeasible))) {
|
||||
bestOfRunFeasibleIndy=(AbstractEAIndividual)curBestFeasible.clone();
|
||||
// System.out.println("New best feasible: " + AbstractEAIndividual.getDefaultStringRepresentation((AbstractEAIndividual)bestRunFeasibleIndy));
|
||||
}
|
||||
if ((bestFeasibleAllover == null) || (secondIsBetter(bestFeasibleAllover, bestRunFeasibleIndy))) {
|
||||
bestFeasibleAllover = bestRunFeasibleIndy;
|
||||
if ((bestFeasibleAllRuns == null) || (secondIsBetter(bestFeasibleAllRuns, bestOfRunFeasibleIndy))) {
|
||||
bestFeasibleAllRuns = bestOfRunFeasibleIndy;
|
||||
}
|
||||
}
|
||||
} else System.err.println("INVALID POPULATION (AbstractStatistics)");
|
||||
@ -528,7 +658,7 @@ public abstract class AbstractStatistics implements InterfaceTextListener, Inter
|
||||
functionCalls = pop.getFunctionCalls();
|
||||
if (GraphSelectionEnum.doPlotAvgDist(m_StatsParams.getGraphSelection())
|
||||
|| GraphSelectionEnum.doPlotMaxPopDist(m_StatsParams.getGraphSelection())) {
|
||||
double[] measures = pop.getPopulationMeasures();
|
||||
double[] measures = ((Population)pop).getPopulationMeasures((InterfaceDistanceMetric)null);
|
||||
if (measures != null) {
|
||||
avgPopDist = measures[0];
|
||||
maxPopDist = measures[2];
|
||||
@ -554,12 +684,26 @@ public abstract class AbstractStatistics implements InterfaceTextListener, Inter
|
||||
}
|
||||
// meanCollection.set(pop.getGenerations()-1, means);
|
||||
|
||||
if (doTextOutput() && printLineByVerbosity(runIterCnt)) printToTextListener(getOutputLine(informerList, pop)+'\n');
|
||||
if (doTextOutput()) {
|
||||
Pair<String,Double[]> addInfo = getOutputLine(informerList, pop);
|
||||
if (printLineByVerbosity(runIterCnt)) printToTextListener(addInfo.head()+'\n');
|
||||
// updateAdditionalInfo(addInfo.tail());
|
||||
if (addInfo.tail()!=null) {
|
||||
additionalInfoSums = updateAdditionalInfo(additionalInfoSums, addInfo.tail());
|
||||
}
|
||||
}
|
||||
plotCurrentResults();
|
||||
|
||||
runIterCnt++;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if the given iteration is a verbose one according to StatsParameter - meaning
|
||||
* that full iteration data should be plotted.
|
||||
*
|
||||
* @param iteration
|
||||
* @return
|
||||
*/
|
||||
private boolean printLineByVerbosity(int iteration) {
|
||||
return (m_StatsParams.getOutputVerbosity().getSelectedTagID() > StatsParameter.VERBOSITY_KTH_IT)
|
||||
|| ((m_StatsParams.getOutputVerbosity().getSelectedTagID() == StatsParameter.VERBOSITY_KTH_IT)
|
||||
@ -567,7 +711,8 @@ public abstract class AbstractStatistics implements InterfaceTextListener, Inter
|
||||
}
|
||||
|
||||
private boolean printRunIntroVerbosity() {
|
||||
return (m_StatsParams.getOutputVerbosity().getSelectedTagID() >= StatsParameter.VERBOSITY_KTH_IT);
|
||||
return (m_StatsParams.getOutputVerbosity().getSelectedTagID() >= StatsParameter.VERBOSITY_KTH_IT)
|
||||
|| (optRunsPerformed==0 && (m_StatsParams.getOutputVerbosity().getSelectedTagID() >= StatsParameter.VERBOSITY_FINAL));
|
||||
}
|
||||
|
||||
private boolean printRunStoppedVerbosity() {
|
||||
@ -622,11 +767,11 @@ public abstract class AbstractStatistics implements InterfaceTextListener, Inter
|
||||
}
|
||||
|
||||
public IndividualInterface getBestSolution() {
|
||||
return bestIndividualAllover;
|
||||
return bestIndyAllRuns;
|
||||
}
|
||||
|
||||
public IndividualInterface getRunBestSolution() {
|
||||
return bestRunIndividual;
|
||||
return bestOfRunIndy;
|
||||
}
|
||||
|
||||
public int getFitnessCalls() {
|
||||
|
@ -60,17 +60,16 @@ public class StatisticsStandalone extends AbstractStatistics implements Interfac
|
||||
}
|
||||
|
||||
public StatisticsStandalone(String resultFileName) {
|
||||
this(StatsParameter.getInstance());
|
||||
m_StatsParams.SetResultFilePrefix(resultFileName);
|
||||
m_StatsParams.setOutputTo(m_StatsParams.getOutputTo().setSelectedTag(StatsParameter.OUTPUT_FILE));
|
||||
this(resultFileName, 1, resultFileName==null ? StatsParameter.VERBOSITY_NONE : StatsParameter.VERBOSITY_FINAL, false);
|
||||
}
|
||||
|
||||
public StatisticsStandalone(String resultFileName, int multiRuns, int verbosity) {
|
||||
this(StatsParameter.getInstance());
|
||||
public StatisticsStandalone(String resultFileName, int multiRuns, int verbosity, boolean showAdditionalInfo) {
|
||||
this(StatsParameter.getInstance(false));
|
||||
m_StatsParams.setMultiRuns(multiRuns);
|
||||
m_StatsParams.setOutputVerbosity(m_StatsParams.getOutputVerbosity().setSelectedTag(verbosity));
|
||||
m_StatsParams.SetResultFilePrefix(resultFileName);
|
||||
m_StatsParams.setOutputTo(m_StatsParams.getOutputTo().setSelectedTag(StatsParameter.OUTPUT_FILE));
|
||||
if (resultFileName==null) m_StatsParams.getOutputTo().setSelectedTag(StatsParameter.OUTPUT_WINDOW);
|
||||
else m_StatsParams.setOutputTo(m_StatsParams.getOutputTo().setSelectedTag(StatsParameter.OUTPUT_FILE));
|
||||
}
|
||||
|
||||
public StatisticsStandalone() {
|
||||
@ -120,9 +119,9 @@ public class StatisticsStandalone extends AbstractStatistics implements Interfac
|
||||
|
||||
public void stopOptPerformed(boolean normal, String stopMessage) {
|
||||
super.stopOptPerformed(normal, stopMessage);
|
||||
if (bestCurrentIndividual != null) {
|
||||
m_SumOfBestFit = m_SumOfBestFit + bestCurrentIndividual.getFitness()[0];
|
||||
m_BestFitnessAtEnd[optRunsPerformed-1] = bestCurrentIndividual.getFitness()[0];
|
||||
if (bestCurrentIndy != null) {
|
||||
m_SumOfBestFit = m_SumOfBestFit + bestCurrentIndy.getFitness()[0];
|
||||
m_BestFitnessAtEnd[optRunsPerformed-1] = bestCurrentIndy.getFitness()[0];
|
||||
}
|
||||
|
||||
//System.out.println("stopOptPerformed :"+m_OptRunsPerformed);
|
||||
|
@ -86,11 +86,11 @@ public class StatisticsWithGUI extends AbstractStatistics implements Serializabl
|
||||
|
||||
|
||||
if ((Client == null) || Client.getHostName().equals(m_MyHostName)) {
|
||||
m_StatsParams = StatsParameter.getInstance();
|
||||
m_StatsParams = StatsParameter.getInstance(true);
|
||||
m_ProxyPrinter = new JTextoutputFrame("TextOutput of " + m_MyHostName);
|
||||
} else { // we use RMI
|
||||
m_StatsParams = (InterfaceStatisticsParameter)RMIProxyLocal.newInstance(
|
||||
StatsParameter.getInstance());
|
||||
StatsParameter.getInstance(true));
|
||||
m_ProxyPrinter = (JTextoutputFrameInterface) RMIProxyRemote.newInstance(new
|
||||
JTextoutputFrame("TextOutput " + m_MyHostName),
|
||||
m_MainAdapterClient);
|
||||
@ -246,7 +246,7 @@ public class StatisticsWithGUI extends AbstractStatistics implements Serializabl
|
||||
|
||||
int subGraph=0;
|
||||
if (doPlotCurrentBest) plotFitnessPoint(0, subGraph++, functionCalls, currentBestFit[0]);
|
||||
if (doPlotRunBest) plotFitnessPoint(0, subGraph++, functionCalls, bestRunIndividual.getFitness()[0]);
|
||||
if (doPlotRunBest) plotFitnessPoint(0, subGraph++, functionCalls, bestOfRunIndy.getFitness()[0]);
|
||||
|
||||
if (doPlotWorst) {// schlechteste Fitness plotten
|
||||
if (currentWorstFit == null) {
|
||||
@ -261,8 +261,8 @@ public class StatisticsWithGUI extends AbstractStatistics implements Serializabl
|
||||
if (doPlotCurBestFeasible && currentBestFeasibleFit!=null) {
|
||||
plotFitnessPoint(0, subGraph++, functionCalls, currentBestFeasibleFit[0]);
|
||||
}
|
||||
if (doPlotRunBestFeasible && bestRunFeasibleIndy!=null) {
|
||||
plotFitnessPoint(0, subGraph++, functionCalls, bestRunFeasibleIndy.getFitness()[0]);
|
||||
if (doPlotRunBestFeasible && bestOfRunFeasibleIndy!=null) {
|
||||
plotFitnessPoint(0, subGraph++, functionCalls, bestOfRunFeasibleIndy.getFitness()[0]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -64,9 +64,17 @@ public class StatsParameter implements InterfaceStatisticsParameter, Serializabl
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public static StatsParameter getInstance() {
|
||||
public static StatsParameter getInstance(boolean loadDefaultSerFile) {
|
||||
if (loadDefaultSerFile) return getInstance("Statistics.ser");
|
||||
else return new StatsParameter();
|
||||
}
|
||||
|
||||
/**
|
||||
* Try to load instance from serialized file. If impossible, instantiate a new one.
|
||||
*/
|
||||
public static StatsParameter getInstance(String serFileName) {
|
||||
if (TRACE ) System.out.println("Loading serialized stats..");
|
||||
StatsParameter Instance = (StatsParameter) Serializer.loadObject("Statistics.ser");
|
||||
StatsParameter Instance = (StatsParameter) Serializer.loadObject(serFileName);
|
||||
if (Instance == null) {
|
||||
Instance = new StatsParameter();
|
||||
if (TRACE) System.out.println("Loading failed!");
|
||||
@ -79,7 +87,7 @@ public class StatsParameter implements InterfaceStatisticsParameter, Serializabl
|
||||
*/
|
||||
public StatsParameter() {
|
||||
m_Name = "Statistics";
|
||||
outputVerbosity.setSelectedTag(2);
|
||||
outputVerbosity.setSelectedTag(VERBOSITY_KTH_IT);
|
||||
outputTo.setSelectedTag(1);
|
||||
}
|
||||
|
||||
|
@ -36,9 +36,13 @@ public class Mathematics {
|
||||
if (cloneX) in = (double[]) x.clone();
|
||||
else in = x;
|
||||
|
||||
Arrays.sort(in);
|
||||
if (in.length % 2 != 0) return in[(in.length-1) / 2];
|
||||
else return (in[in.length/2] + in[(in.length/2)+1]) / 2.;
|
||||
if (in.length==1) return in[0];
|
||||
else if (in.length==2) return (in[0]+in[1])/2.;
|
||||
else {
|
||||
Arrays.sort(in);
|
||||
if (in.length % 2 != 0) return in[(in.length-1) / 2];
|
||||
else return (in[in.length/2] + in[(in.length/2)+1]) / 2.;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@ -892,6 +896,24 @@ public class Mathematics {
|
||||
return viols;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Scale a range by the given factor, meaning that the interval in each dimension is
|
||||
* extended (fact>1) or reduced (fact<1) by the defined ratio around the center.
|
||||
*
|
||||
* @param rangeScaleFact
|
||||
* @param range
|
||||
*/
|
||||
public static void scaleRange(double rangeScaleFact, double[][] range) {
|
||||
double[] intervalLengths=Mathematics.shiftRange(range);
|
||||
double[] tmpInts=Mathematics.svMult(rangeScaleFact, intervalLengths);
|
||||
Mathematics.vvSub(tmpInts, intervalLengths, tmpInts); // this is what must be added to range interval
|
||||
for (int i=0; i<range.length; i++) {
|
||||
range[i][0]-=tmpInts[i]/2;
|
||||
range[i][1]+=tmpInts[i]/2;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Project the value to the range given.
|
||||
*
|
||||
@ -933,7 +955,7 @@ public class Mathematics {
|
||||
double d = 0.;
|
||||
for (int i=0; i<x.length; i++) {
|
||||
double dimLen = range[i][1]-range[i][0];
|
||||
if (dimLen <= 0.) System.err.println("Error in reflectBounds: empty range!");
|
||||
if (dimLen <= 0.) EVAERROR.errorMsgOnce("Error in reflectBounds: empty range! (possibly multiple errors)");
|
||||
if (x[i]<range[i][0]) {
|
||||
viols++;
|
||||
d = range[i][0]-x[i];
|
||||
@ -999,4 +1021,18 @@ public class Mathematics {
|
||||
}
|
||||
return prod;
|
||||
}
|
||||
|
||||
/**
|
||||
* Intersect two ranges resulting in the maximum range contained in both.
|
||||
*
|
||||
* @param modRange
|
||||
* @param makeRange
|
||||
* @param destRange
|
||||
*/
|
||||
public static void intersectRange(double[][] r1, double[][] r2, double[][] destRange) {
|
||||
for (int i=0; i<r1.length && i<r2.length; i++) {
|
||||
destRange[i][0] = Math.max(r1[i][0], r2[i][0]);
|
||||
destRange[i][1] = Math.min(r1[i][1], r2[i][1]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
40
src/eva2/tools/PairComparator.java
Normal file
40
src/eva2/tools/PairComparator.java
Normal file
@ -0,0 +1,40 @@
|
||||
package eva2.tools;
|
||||
|
||||
import java.util.Comparator;
|
||||
|
||||
import eva2.gui.BeanInspector;
|
||||
|
||||
public class PairComparator implements Comparator<Pair<?,?>> {
|
||||
boolean useHead = true;
|
||||
|
||||
/**
|
||||
* A constructor. Set useHd to true to compare based on the head, otherwise
|
||||
* based on the tail.
|
||||
*/
|
||||
public PairComparator(boolean useHd) {
|
||||
useHead = useHead;
|
||||
}
|
||||
|
||||
/**
|
||||
* Compare two Pairs of which head or tail is a primitive type that
|
||||
* can be converted to double.
|
||||
* Return 1 if the first is larger, -1 if the second is larger, 0 if they
|
||||
* are equal or not comparable.
|
||||
*/
|
||||
public int compare(Pair<?,?> o1, Pair<?,?> o2) {
|
||||
Pair<?,?> p1=(Pair<?,?>)o1;
|
||||
Pair<?,?> p2=(Pair<?,?>)o2;
|
||||
double d1, d2;
|
||||
try {
|
||||
d1=BeanInspector.toDouble(useHead ? p1.head() : p1.tail());
|
||||
d2=BeanInspector.toDouble(useHead ? p2.head() : p2.tail());
|
||||
} catch (IllegalArgumentException e) {
|
||||
System.err.println("Error, mismatching types, thus uncomparable Pairs: " + p1.toString() + " / " + p2.toString());
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (d1==d2) return 0;
|
||||
else if (d1 > d2) return 1;
|
||||
else return -1;
|
||||
}
|
||||
}
|
@ -311,6 +311,7 @@ public class DMeasures implements Serializable
|
||||
}
|
||||
}
|
||||
catch( IllegalArgumentException nde ){ return null; }
|
||||
catch( NullPointerException npe) {return null;}
|
||||
return new SlimRect( x1, y1, x2 - x1, y2 - y1 );
|
||||
}
|
||||
// SlimRect getSourceOf( double xpos, double ypos, double width, double height){
|
||||
|
@ -114,16 +114,22 @@ public class Matrix implements Cloneable, java.io.Serializable {
|
||||
*/
|
||||
|
||||
public Matrix (double[][] A) {
|
||||
m = A.length;
|
||||
n = A[0].length;
|
||||
for (int i = 0; i < m; i++) {
|
||||
if (A[i].length != n) {
|
||||
throw new IllegalArgumentException("All rows must have the same length.");
|
||||
}
|
||||
}
|
||||
this.A = A;
|
||||
this(A, true);
|
||||
}
|
||||
|
||||
public Matrix (double[][] A, boolean checkDims) {
|
||||
m = A.length;
|
||||
n = A[0].length;
|
||||
if (checkDims) {
|
||||
for (int i = 0; i < m; i++) {
|
||||
if (A[i].length != n) {
|
||||
throw new IllegalArgumentException("All rows must have the same length.");
|
||||
}
|
||||
}
|
||||
}
|
||||
this.A = A;
|
||||
}
|
||||
|
||||
/** Construct a matrix quickly without checking arguments.
|
||||
@param A Two-dimensional array of doubles.
|
||||
@param m Number of rows.
|
||||
@ -660,7 +666,24 @@ public class Matrix implements Cloneable, java.io.Serializable {
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
/** A = A + B
|
||||
@param B another matrix
|
||||
@return A + B
|
||||
*/
|
||||
|
||||
public Matrix plusEqualsArrayAsMatrix(double[][] B) {
|
||||
if ((B.length!=m) || (B[0].length!=n)) {
|
||||
throw new IllegalArgumentException("Matrix dimensions must agree.");
|
||||
}
|
||||
for (int i = 0; i < m; i++) {
|
||||
for (int j = 0; j < n; j++) {
|
||||
A[i][j] = A[i][j] + B[i][j];
|
||||
}
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
/** C = A - B
|
||||
@param B another matrix
|
||||
@return A - B
|
||||
@ -805,6 +828,19 @@ public class Matrix implements Cloneable, java.io.Serializable {
|
||||
return X;
|
||||
}
|
||||
|
||||
/** Multiply a matrix in place by a scalar, A = s*A. Returns A.
|
||||
* @param s scalar
|
||||
* @return s*A
|
||||
*/
|
||||
public Matrix timesInplace(double s) {
|
||||
for (int i = 0; i < m; i++) {
|
||||
for (int j = 0; j < n; j++) {
|
||||
A[i][j] = s*A[i][j];
|
||||
}
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
/** Multiply a matrix by a vector, returning A*v.
|
||||
*
|
||||
@param v vector
|
||||
|
@ -8,395 +8,422 @@ import eva2.tools.EVAHELP;
|
||||
import eva2.tools.Mathematics;
|
||||
|
||||
public class RNG extends Random {
|
||||
private static Random random;
|
||||
private static long randomSeed;
|
||||
/**
|
||||
*
|
||||
*/
|
||||
static {
|
||||
randomSeed=System.currentTimeMillis();
|
||||
random=new Random(randomSeed);
|
||||
}
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public static void setRandomSeed(long new_seed){
|
||||
//counter++;
|
||||
randomSeed=new_seed;
|
||||
if (randomSeed == 0) setRandomSeed();
|
||||
else random.setSeed(randomSeed);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the random seed without replacing zero with current system time.
|
||||
*/
|
||||
public static void setRandomSeedStrict(long new_seed){
|
||||
randomSeed=new_seed;
|
||||
random.setSeed(randomSeed);
|
||||
}
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public static void setRandomSeed() {
|
||||
randomSeed=System.currentTimeMillis();
|
||||
random=new Random(randomSeed);
|
||||
}
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public static void setRandom(Random base_random) {
|
||||
random=base_random;
|
||||
}
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public static long getRandomSeed() {
|
||||
return randomSeed;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns 0 or 1 evenly distributed.
|
||||
*/
|
||||
public static int randomInt() {
|
||||
return randomInt(0,1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an evenly distributes int value between zero and
|
||||
* upperLim-1.
|
||||
* @param upperLim upper exclusive limit of the random int
|
||||
*/
|
||||
public static int randomInt(int upperLim) {
|
||||
return randomInt(0,upperLim-1);
|
||||
}
|
||||
|
||||
/** This method returns a evenly distributed int value.
|
||||
* The boundarys are included.
|
||||
* @param lo Lower bound.
|
||||
* @param hi Upper bound.
|
||||
* @return int
|
||||
*/
|
||||
public static int randomInt(int lo,int hi) {
|
||||
if (hi<lo) {
|
||||
System.err.println("Invalid boundary values! Returning zero.");
|
||||
return -1;
|
||||
private static Random random;
|
||||
private static long randomSeed;
|
||||
/**
|
||||
*
|
||||
*/
|
||||
static {
|
||||
randomSeed=System.currentTimeMillis();
|
||||
random=new Random(randomSeed);
|
||||
}
|
||||
int result = (Math.abs(random.nextInt())%(hi-lo+1))+lo;
|
||||
if ((result < lo) || (result > hi)) {
|
||||
System.err.println("Error in RNG.randomInt!");
|
||||
result = Math.abs(random.nextInt()%(hi-lo+1))+lo;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/** This method returns a random permutation of n int values
|
||||
* @param length The number of int values
|
||||
* @return The permutation [0-length-1]
|
||||
*/
|
||||
public static int[] randomPermutation(int length) {
|
||||
boolean[] validList = new boolean[length];
|
||||
int[] result = new int[length];
|
||||
int index;
|
||||
for (int i = 0; i < validList.length; i++) validList[i] = true;
|
||||
for (int i = 0; i < result.length; i++) {
|
||||
index = randomInt(0, length-1);
|
||||
while (!validList[index]) {
|
||||
index++;
|
||||
if (index == length) index = 0;
|
||||
}
|
||||
validList[index] = false;
|
||||
result[i] = index;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/** This method returns a random permutation of n int values
|
||||
* @param length The number of int values
|
||||
* @return The permutation [0-length-1]
|
||||
*/
|
||||
public static int[] randomPerm(int length) {
|
||||
ArrayList<Integer> intList = new ArrayList<Integer>(length);
|
||||
int[] result = new int[length];
|
||||
for (int i = 0; i < length; i++) {
|
||||
intList.add(new Integer(i));
|
||||
}
|
||||
for (int i = 0; i < length-1; i++) {
|
||||
int index = randomInt(intList.size());
|
||||
result[i] = intList.get(index);
|
||||
intList.remove(index);
|
||||
|
||||
}
|
||||
if (intList.size()>1) System.err.println("Error in randomPerm!");
|
||||
result[length-1] = intList.get(0);
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public static long randomLong() {
|
||||
return randomLong(0,1);
|
||||
}
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public static long randomLong(long lo,long hi) {
|
||||
return (Math.abs(random.nextLong())%(hi-lo+1))+lo;
|
||||
}
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public static float randomFloat() {
|
||||
return random.nextFloat();
|
||||
}
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public static float randomFloat(float lo,float hi) {
|
||||
return (hi-lo)*random.nextFloat()+lo;
|
||||
}
|
||||
/**
|
||||
* A random double value between 0 and 1.
|
||||
*/
|
||||
public static double randomDouble() {
|
||||
return random.nextDouble();
|
||||
}
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public static double randomDouble(double lo,double hi) {
|
||||
return (hi-lo)*random.nextDouble()+lo;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a uniform random vector within the given bounds.
|
||||
*/
|
||||
public static double[] randomDoubleArray(double[] lo,double[] hi) {
|
||||
double[] xin = new double[lo.length];
|
||||
for (int i=0;i<lo.length;i++)
|
||||
xin[i] = (hi[i]-lo[i])*random.nextDouble()+lo[i];
|
||||
return xin;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a uniform random vector within the given bounds.
|
||||
*/
|
||||
public static double[] randomDoubleArray(double[][] range) {
|
||||
double[] xin = new double[range.length];
|
||||
for (int i=0;i<xin.length;i++)
|
||||
xin[i] = (range[i][1]-range[i][0])*random.nextDouble()+range[i][0];
|
||||
return xin;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a uniform random double vector within the given bounds (inclusive) in every dimension.
|
||||
*
|
||||
* @param lower
|
||||
* @param upper
|
||||
* @param size
|
||||
* @return
|
||||
*/
|
||||
public static double[] randomDoubleArray(double lower, double upper, int size) {
|
||||
double[] result = new double[size];
|
||||
for (int i = 0; i < result.length; i++) {
|
||||
result[i] = RNG.randomDouble(lower, upper);
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public static void setRandomSeed(long new_seed){
|
||||
//counter++;
|
||||
randomSeed=new_seed;
|
||||
if (randomSeed == 0) setRandomSeed();
|
||||
else random = new Random(randomSeed);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the random seed without replacing zero with current system time.
|
||||
*/
|
||||
public static void setRandomSeedStrict(long new_seed){
|
||||
randomSeed=new_seed;
|
||||
random.setSeed(randomSeed);
|
||||
}
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public static void setRandomSeed() {
|
||||
randomSeed=System.currentTimeMillis();
|
||||
random=new Random(randomSeed);
|
||||
}
|
||||
return result;
|
||||
// double[] xin = new double[size];
|
||||
// for (int i=0;i<size;i++)
|
||||
// xin[i] = (hi-lo)*random.nextDouble()+lo;
|
||||
// return xin;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public static double[] randomDoubleArray(double[] lo,double[] hi,double[] xin) {
|
||||
//counter++;
|
||||
for (int i=0;i<lo.length;i++)
|
||||
xin[i] = (hi[i]-lo[i])*random.nextDouble()+lo[i];
|
||||
return xin;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a uniform random integer vector within the given bounds (inclusive) in every dimension.
|
||||
*
|
||||
* @param n
|
||||
* @param lower
|
||||
* @param upper
|
||||
* @return
|
||||
*/
|
||||
public static int[] randomIntArray(int lower, int upper, int size) {
|
||||
int[] result = new int[size];
|
||||
for (int i = 0; i < result.length; i++) {
|
||||
result[i] = RNG.randomInt(lower, upper);
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public static void setRandom(Random base_random) {
|
||||
random=base_random;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public static boolean randomBoolean() {
|
||||
//counter++;
|
||||
return (randomInt()==1);
|
||||
}
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public static int randomBit() {
|
||||
//counter++;
|
||||
return randomInt();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true with probability p.
|
||||
*
|
||||
* @param p
|
||||
* @return true with probability p, else false
|
||||
*/
|
||||
public static boolean flipCoin(double p) {
|
||||
//counter++;
|
||||
return (randomDouble()<p ? true : false);
|
||||
}
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public static float gaussianFloat(float dev) {
|
||||
//counter++;
|
||||
return (float)random.nextGaussian()*dev;
|
||||
}
|
||||
/**
|
||||
* Return a Gaussian double with mean 0 and deviation dev.
|
||||
*
|
||||
* @param dev the deviation of the distribution.
|
||||
* @return a Gaussian double with mean 0 and given deviation.
|
||||
*/
|
||||
public static double gaussianDouble(double dev) {
|
||||
//counter++;
|
||||
return random.nextGaussian()*dev;
|
||||
}
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public static float exponentialFloat(float mean) {
|
||||
//counter++;
|
||||
return (float)(-mean*Math.log(randomDouble()));
|
||||
}
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public static double exponentialDouble(double mean) {
|
||||
//counter++;
|
||||
return -mean*Math.log(randomDouble());
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a vector denoting a random point around the center
|
||||
* - inside a hypersphere of uniform distribution if nonUnif=0,
|
||||
* - inside a hypersphere of non-uniform distribution if nonUnif > 0,
|
||||
* - inside a D-Gaussian if nonUnif < 0.
|
||||
* For case 2, the nonUnif parameter is used as standard deviation (instead of 1/D), the parameter
|
||||
* is not further used in the other two cases.
|
||||
* Original code by Maurice Clerc, from the TRIBES package
|
||||
*
|
||||
* @param center center point of the distribution
|
||||
* @param radius radius of the distribution
|
||||
* @param nonUnif kind of distribution
|
||||
*
|
||||
**/
|
||||
public static double[] randHypersphere(double[] center, double radius, double nonUnif) {
|
||||
double[] x = new double[center.length];
|
||||
int j;
|
||||
double xLen, r;
|
||||
int D=center.length;
|
||||
|
||||
// ----------------------------------- Step 1. Direction
|
||||
xLen = 0;
|
||||
for (j=0; j<D; j++) {
|
||||
r = gaussianDouble(1);
|
||||
x[j] = r;
|
||||
xLen += x[j]*x[j];
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public static long getRandomSeed() {
|
||||
return randomSeed;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns 0 or 1 evenly distributed.
|
||||
*/
|
||||
public static int randomInt() {
|
||||
return randomInt(0,1);
|
||||
}
|
||||
|
||||
xLen=Math.sqrt(xLen);
|
||||
|
||||
//----------------------------------- Step 2. Random radius
|
||||
|
||||
r=randomDouble();
|
||||
if (nonUnif < 0) r = gaussianDouble(r/2); // D-Gaussian
|
||||
else if (nonUnif > 0) r = Math.pow(r,nonUnif); // non-uniform hypersphere
|
||||
else r=Math.pow(r,1./D); // Real hypersphere
|
||||
|
||||
for (j=0;j<D;j++) {
|
||||
x[j] = center[j]+radius*r*x[j]/xLen;
|
||||
/**
|
||||
* Returns an evenly distributes int value between zero and
|
||||
* upperLim-1.
|
||||
* @param upperLim upper exclusive limit of the random int
|
||||
*/
|
||||
public static int randomInt(int upperLim) {
|
||||
return randomInt(0,upperLim-1);
|
||||
}
|
||||
|
||||
/** This method returns a evenly distributed int value.
|
||||
* The boundarys are included.
|
||||
* @param lo Lower bound.
|
||||
* @param hi Upper bound.
|
||||
* @return int
|
||||
*/
|
||||
public static int randomInt(int lo,int hi) {
|
||||
if (hi<lo) {
|
||||
System.err.println("Invalid boundary values! Returning zero.");
|
||||
return -1;
|
||||
}
|
||||
int result = (Math.abs(random.nextInt())%(hi-lo+1))+lo;
|
||||
if ((result < lo) || (result > hi)) {
|
||||
System.err.println("Error, invalid value " + result + " in RNG.randomInt! boundaries were lo/hi: " + lo + " / " + hi);
|
||||
result = Math.abs(random.nextInt()%(hi-lo+1))+lo;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
return x;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds Gaussian noise to a double vector
|
||||
* @param v the double vector
|
||||
* @param dev the Gaussian deviation
|
||||
*/
|
||||
public static void addNoise(double[] v, double dev) {
|
||||
for (int i=0; i<v.length; i++) {
|
||||
// add noise to the value
|
||||
v[i] += gaussianDouble(dev);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a normalized random vector with gaussian random double entries.
|
||||
*
|
||||
* @param n
|
||||
* @param dev
|
||||
* @return
|
||||
*/
|
||||
public static double[] gaussianVector(int n, double dev, boolean normalize) {
|
||||
double[] result = new double[n];
|
||||
gaussianVector(dev, result, normalize);
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a normalized random vector with gaussian random double entries.
|
||||
*
|
||||
* @param n
|
||||
* @return
|
||||
*/
|
||||
public static double[] gaussianVector(double dev, double[] result, boolean normalize) {
|
||||
for (int i = 0; i < result.length; i++) {
|
||||
result[i] = RNG.gaussianDouble(dev);
|
||||
}
|
||||
if (normalize) Mathematics.normVect(result, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
double[] v = new double[2];
|
||||
for (int i=0; i<1000; i++) {
|
||||
gaussianVector(1., v, false);
|
||||
EVAHELP.logString(Arrays.toString(v)+"\n", "randtest.dat");
|
||||
// System.out.println(Arrays.toString(v));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a uniform random double vector within the given bounds (inclusive) in every dimension.
|
||||
*
|
||||
* @param n
|
||||
* @param lower
|
||||
* @param upper
|
||||
* @return
|
||||
*/
|
||||
// public static double[] randomVector(int n, double lower, double upper) {
|
||||
// double[] result = new double[n];
|
||||
// for (int i = 0; i < result.length; i++) {
|
||||
// result[i] = RNG.randomDouble(lower, upper);
|
||||
// }
|
||||
// return result;
|
||||
// }
|
||||
|
||||
}
|
||||
|
||||
/** This method returns a random permutation of n int values
|
||||
* @param length The number of int values
|
||||
* @return The permutation [0-length-1]
|
||||
*/
|
||||
public static int[] randomPermutation(int length) {
|
||||
boolean[] validList = new boolean[length];
|
||||
int[] result = new int[length];
|
||||
int index;
|
||||
for (int i = 0; i < validList.length; i++) validList[i] = true;
|
||||
for (int i = 0; i < result.length; i++) {
|
||||
index = randomInt(0, length-1);
|
||||
while (!validList[index]) {
|
||||
index++;
|
||||
if (index == length) index = 0;
|
||||
}
|
||||
validList[index] = false;
|
||||
result[i] = index;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/** This method returns a random permutation of n int values
|
||||
* @param length The number of int values
|
||||
* @return The permutation [0-length-1]
|
||||
*/
|
||||
public static int[] randomPerm(int length) {
|
||||
ArrayList<Integer> intList = new ArrayList<Integer>(length);
|
||||
int[] result = new int[length];
|
||||
for (int i = 0; i < length; i++) {
|
||||
intList.add(new Integer(i));
|
||||
}
|
||||
for (int i = 0; i < length-1; i++) {
|
||||
int index = randomInt(intList.size());
|
||||
result[i] = intList.get(index);
|
||||
intList.remove(index);
|
||||
|
||||
}
|
||||
if (intList.size()>1) System.err.println("Error in randomPerm!");
|
||||
result[length-1] = intList.get(0);
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a random long between 0 and Long.MAX_VALUE-1 (inclusively).
|
||||
*/
|
||||
public static long randomLong() {
|
||||
return randomLong(0,Long.MAX_VALUE-1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a random long between the given values (inclusively).
|
||||
*/
|
||||
public static long randomLong(long lo,long hi) {
|
||||
return (Math.abs(random.nextLong())%(hi-lo+1))+lo;
|
||||
}
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public static float randomFloat() {
|
||||
return random.nextFloat();
|
||||
}
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public static float randomFloat(float lo,float hi) {
|
||||
return (hi-lo)*random.nextFloat()+lo;
|
||||
}
|
||||
/**
|
||||
* A random double value between 0 and 1.
|
||||
*/
|
||||
public static double randomDouble() {
|
||||
return random.nextDouble();
|
||||
}
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public static double randomDouble(double lo,double hi) {
|
||||
return (hi-lo)*random.nextDouble()+lo;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a uniform random vector within the given bounds.
|
||||
*/
|
||||
public static double[] randomDoubleArray(double[] lo,double[] hi) {
|
||||
double[] xin = new double[lo.length];
|
||||
for (int i=0;i<lo.length;i++)
|
||||
xin[i] = (hi[i]-lo[i])*random.nextDouble()+lo[i];
|
||||
return xin;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a uniform random vector within the given bounds.
|
||||
*/
|
||||
public static double[] randomDoubleArray(double[][] range) {
|
||||
double[] xin = new double[range.length];
|
||||
for (int i=0;i<xin.length;i++)
|
||||
xin[i] = (range[i][1]-range[i][0])*random.nextDouble()+range[i][0];
|
||||
return xin;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a uniform random double vector within the given bounds (inclusive) in every dimension.
|
||||
*
|
||||
* @param lower
|
||||
* @param upper
|
||||
* @param size
|
||||
* @return
|
||||
*/
|
||||
public static double[] randomDoubleArray(double lower, double upper, int size) {
|
||||
double[] result = new double[size];
|
||||
for (int i = 0; i < result.length; i++) {
|
||||
result[i] = RNG.randomDouble(lower, upper);
|
||||
}
|
||||
return result;
|
||||
// double[] xin = new double[size];
|
||||
// for (int i=0;i<size;i++)
|
||||
// xin[i] = (hi-lo)*random.nextDouble()+lo;
|
||||
// return xin;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public static double[] randomDoubleArray(double[] lo,double[] hi,double[] xin) {
|
||||
//counter++;
|
||||
for (int i=0;i<lo.length;i++)
|
||||
xin[i] = (hi[i]-lo[i])*random.nextDouble()+lo[i];
|
||||
return xin;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a uniform random integer vector within the given bounds (inclusive) in every dimension.
|
||||
*
|
||||
* @param n
|
||||
* @param lower
|
||||
* @param upper
|
||||
* @return
|
||||
*/
|
||||
public static int[] randomIntArray(int lower, int upper, int size) {
|
||||
int[] result = new int[size];
|
||||
for (int i = 0; i < result.length; i++) {
|
||||
result[i] = RNG.randomInt(lower, upper);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public static boolean randomBoolean() {
|
||||
//counter++;
|
||||
return (randomInt()==1);
|
||||
}
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public static int randomBit() {
|
||||
//counter++;
|
||||
return randomInt();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true with probability p.
|
||||
*
|
||||
* @param p
|
||||
* @return true with probability p, else false
|
||||
*/
|
||||
public static boolean flipCoin(double p) {
|
||||
//counter++;
|
||||
return (randomDouble()<p ? true : false);
|
||||
}
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public static float gaussianFloat(float dev) {
|
||||
//counter++;
|
||||
return (float)random.nextGaussian()*dev;
|
||||
}
|
||||
/**
|
||||
* Return a Gaussian double with mean 0 and deviation dev.
|
||||
*
|
||||
* @param dev the deviation of the distribution.
|
||||
* @return a Gaussian double with mean 0 and given deviation.
|
||||
*/
|
||||
public static double gaussianDouble(double dev) {
|
||||
//counter++;
|
||||
return random.nextGaussian()*dev;
|
||||
}
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public static float exponentialFloat(float mean) {
|
||||
//counter++;
|
||||
return (float)(-mean*Math.log(randomDouble()));
|
||||
}
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public static double exponentialDouble(double mean) {
|
||||
//counter++;
|
||||
return -mean*Math.log(randomDouble());
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a vector denoting a random point around the center
|
||||
* - inside a hypersphere of uniform distribution if nonUnif=0,
|
||||
* - inside a hypersphere of non-uniform distribution if nonUnif > 0,
|
||||
* - inside a D-Gaussian if nonUnif < 0.
|
||||
* For case 2, the nonUnif parameter is used as standard deviation (instead of 1/D), the parameter
|
||||
* is not further used in the other two cases.
|
||||
* Original code by Maurice Clerc, from the TRIBES package
|
||||
*
|
||||
* @param center center point of the distribution
|
||||
* @param radius radius of the distribution
|
||||
* @param nonUnif kind of distribution
|
||||
*
|
||||
**/
|
||||
public static double[] randHypersphere(double[] center, double radius, double nonUnif) {
|
||||
double[] x = new double[center.length];
|
||||
int j;
|
||||
double xLen, r;
|
||||
int D=center.length;
|
||||
|
||||
// ----------------------------------- Step 1. Direction
|
||||
xLen = 0;
|
||||
for (j=0; j<D; j++) {
|
||||
r = gaussianDouble(1);
|
||||
x[j] = r;
|
||||
xLen += x[j]*x[j];
|
||||
}
|
||||
|
||||
xLen=Math.sqrt(xLen);
|
||||
|
||||
//----------------------------------- Step 2. Random radius
|
||||
|
||||
r=randomDouble();
|
||||
if (nonUnif < 0) r = gaussianDouble(r/2); // D-Gaussian
|
||||
else if (nonUnif > 0) r = Math.pow(r,nonUnif); // non-uniform hypersphere
|
||||
else r=Math.pow(r,1./D); // Real hypersphere
|
||||
|
||||
for (j=0;j<D;j++) {
|
||||
x[j] = center[j]+radius*r*x[j]/xLen;
|
||||
}
|
||||
return x;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds Gaussian noise to a double vector
|
||||
* @param v the double vector
|
||||
* @param dev the Gaussian deviation
|
||||
*/
|
||||
public static void addNoise(double[] v, double dev) {
|
||||
for (int i=0; i<v.length; i++) {
|
||||
// add noise to the value
|
||||
v[i] += gaussianDouble(dev);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a normalized random vector with gaussian random double entries.
|
||||
*
|
||||
* @param n
|
||||
* @param dev
|
||||
* @return
|
||||
*/
|
||||
public static double[] gaussianVector(int n, double dev, boolean normalize) {
|
||||
double[] result = new double[n];
|
||||
gaussianVector(dev, result, normalize);
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a normalized random vector with gaussian random double entries.
|
||||
*
|
||||
* @param n
|
||||
* @return
|
||||
*/
|
||||
public static double[] gaussianVector(double dev, double[] result, boolean normalize) {
|
||||
for (int i = 0; i < result.length; i++) {
|
||||
result[i] = RNG.gaussianDouble(dev);
|
||||
}
|
||||
if (normalize) Mathematics.normVect(result, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
// public static int testRndInt(long seed, int bits) {
|
||||
// return (int)(seed >>> (48 - bits));
|
||||
// }
|
||||
//
|
||||
// public static int testRandomInt(int lo, int hi, long seed) {
|
||||
// if (hi<lo) {
|
||||
// System.err.println("Invalid boundary values! Returning zero.");
|
||||
// return -1;
|
||||
// }
|
||||
// int result = (Math.abs(testRndInt(seed,32))%(hi-lo+1))+lo;
|
||||
// if ((result < lo) || (result > hi)) {
|
||||
// System.err.println("Error, invalid value " + result + " in RNG.randomInt! boundaries were lo/hi: " + lo + " / " + hi);
|
||||
// System.out.println("Error, invalid value " + result + " in RNG.randomInt! boundaries were lo/hi: " + lo + " / " + hi);
|
||||
// }
|
||||
// return result;
|
||||
// }
|
||||
//
|
||||
// public static void testRand(long initSeed) {
|
||||
// for (long seed=initSeed; seed<=Long.MAX_VALUE; seed++) {
|
||||
// int rnd = testRandomInt(0,8,seed);
|
||||
// if (seed % 100000000 == 0) System.out.println("Seed at " + seed);
|
||||
// }
|
||||
// }
|
||||
|
||||
// public static void main(String[] args) {
|
||||
// testRand(24000000000l);
|
||||
// System.out.println("RNG Done");
|
||||
// double[] v = new double[2];
|
||||
// for (int i=0; i<1000; i++) {
|
||||
// gaussianVector(1., v, false);
|
||||
// EVAHELP.logString(Arrays.toString(v)+"\n", "randtest.dat");
|
||||
//// System.out.println(Arrays.toString(v));
|
||||
// }
|
||||
// }
|
||||
|
||||
/**
|
||||
* Create a uniform random double vector within the given bounds (inclusive) in every dimension.
|
||||
*
|
||||
* @param n
|
||||
* @param lower
|
||||
* @param upper
|
||||
* @return
|
||||
*/
|
||||
// public static double[] randomVector(int n, double lower, double upper) {
|
||||
// double[] result = new double[n];
|
||||
// for (int i = 0; i < result.length; i++) {
|
||||
// result[i] = RNG.randomDouble(lower, upper);
|
||||
// }
|
||||
// return result;
|
||||
// }
|
||||
|
||||
}
|
@ -256,7 +256,7 @@ public class BasicResourceLoader implements ResourceLoader
|
||||
|
||||
/**
|
||||
* Fill a line of an array with double values parsed from a String array. A subset of
|
||||
* Columns may be selected by giving their indeces in an integer array cols. If cols
|
||||
* Columns may be selected by giving their indices in an integer array cols. If cols
|
||||
* is null, all are converted.
|
||||
*
|
||||
* @param dest
|
||||
@ -288,7 +288,8 @@ public class BasicResourceLoader implements ResourceLoader
|
||||
}
|
||||
|
||||
/**
|
||||
* Test a string for prefixes. If a prefix matches, return its index, else return -1.
|
||||
* Test a string for prefixes. For the first matching prefix, the index
|
||||
* of the prefix within the prefix array is returned. If there is no match -1 is returned.
|
||||
* @param str
|
||||
* @param pref
|
||||
* @return
|
||||
@ -627,23 +628,23 @@ public class BasicResourceLoader implements ResourceLoader
|
||||
if (bytes != null) {
|
||||
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
|
||||
prop.load(bais);
|
||||
if (prop != null) return prop;
|
||||
}
|
||||
if (prop != null)
|
||||
return prop;
|
||||
/////////////
|
||||
|
||||
int slInd = resourceName.lastIndexOf('/');
|
||||
if (slInd != -1)
|
||||
resourceName = resourceName.substring(slInd + 1);
|
||||
String planBResName;
|
||||
if (slInd != -1) planBResName = resourceName.substring(slInd + 1);
|
||||
else planBResName = resourceName;
|
||||
Properties userProps = new Properties();
|
||||
File propFile = new File(File.separatorChar + "resources" + File.separatorChar + resourceName);
|
||||
File propFile = new File(File.separatorChar + "resources" + File.separatorChar + planBResName);
|
||||
if (propFile.exists()) {
|
||||
try {
|
||||
userProps.load(new FileInputStream(propFile));
|
||||
} catch (Exception ex) {
|
||||
System.out.println("Problem reading user properties: " + propFile);
|
||||
System.err.println("Problem reading user properties: " + propFile);
|
||||
}
|
||||
}
|
||||
} else System.err.println("Warning in readProperties: neither " + resourceName + " nor " + planBResName + " could be read.");
|
||||
return userProps;
|
||||
}
|
||||
|
||||
|
@ -14,419 +14,423 @@
|
||||
|
||||
package eva2.tools.tool;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
|
||||
import eva2.tools.math.Jama.Matrix;
|
||||
|
||||
/**
|
||||
* Statistic utils.
|
||||
*/
|
||||
public class StatisticUtils
|
||||
{
|
||||
/** The natural logarithm of 2. */
|
||||
public static double log2 = Math.log(2);
|
||||
/** The natural logarithm of 2. */
|
||||
public static double log2 = Math.log(2);
|
||||
|
||||
/** The small deviation allowed in double comparisons */
|
||||
public static double SMALL = 1e-6;
|
||||
/** The small deviation allowed in double comparisons */
|
||||
public static double SMALL = 1e-6;
|
||||
|
||||
/**
|
||||
* Returns the correlation coefficient of two double vectors.
|
||||
*
|
||||
* @param y1 double vector 1
|
||||
* @param y2 double vector 2
|
||||
* @param n the length of two double vectors
|
||||
* @return the correlation coefficient
|
||||
*/
|
||||
public final static double correlation(double y1[],double y2[],int n) {
|
||||
/**
|
||||
* Returns the correlation coefficient of two double vectors.
|
||||
*
|
||||
* @param y1 double vector 1
|
||||
* @param y2 double vector 2
|
||||
* @param n the length of two double vectors
|
||||
* @return the correlation coefficient
|
||||
*/
|
||||
public final static double correlation(double y1[],double y2[],int n) {
|
||||
|
||||
int i;
|
||||
double av1 = 0.0, av2 = 0.0, y11 = 0.0, y22 = 0.0, y12 = 0.0, c;
|
||||
int i;
|
||||
double av1 = 0.0, av2 = 0.0, y11 = 0.0, y22 = 0.0, y12 = 0.0, c;
|
||||
|
||||
if (n <= 1) {
|
||||
return 1.0;
|
||||
}
|
||||
for (i = 0; i < n; i++) {
|
||||
av1 += y1[i];
|
||||
av2 += y2[i];
|
||||
}
|
||||
av1 /= (double) n;
|
||||
av2 /= (double) n;
|
||||
for (i = 0; i < n; i++) {
|
||||
y11 += (y1[i] - av1) * (y1[i] - av1);
|
||||
y22 += (y2[i] - av2) * (y2[i] - av2);
|
||||
y12 += (y1[i] - av1) * (y2[i] - av2);
|
||||
}
|
||||
if (y11 * y22 == 0.0) {
|
||||
c=1.0;
|
||||
} else {
|
||||
c = y12 / Math.sqrt(Math.abs(y11 * y22));
|
||||
}
|
||||
if (n <= 1) {
|
||||
return 1.0;
|
||||
}
|
||||
for (i = 0; i < n; i++) {
|
||||
av1 += y1[i];
|
||||
av2 += y2[i];
|
||||
}
|
||||
av1 /= (double) n;
|
||||
av2 /= (double) n;
|
||||
for (i = 0; i < n; i++) {
|
||||
y11 += (y1[i] - av1) * (y1[i] - av1);
|
||||
y22 += (y2[i] - av2) * (y2[i] - av2);
|
||||
y12 += (y1[i] - av1) * (y2[i] - av2);
|
||||
}
|
||||
if (y11 * y22 == 0.0) {
|
||||
c=1.0;
|
||||
} else {
|
||||
c = y12 / Math.sqrt(Math.abs(y11 * y22));
|
||||
}
|
||||
|
||||
return c;
|
||||
}
|
||||
return c;
|
||||
}
|
||||
|
||||
/**
|
||||
* Computes differential shannon entropy
|
||||
*
|
||||
* @return DSE=SE(AB)-0.5*[SE(A)+SE(B)]
|
||||
*/
|
||||
public static double differentialShannon(int counts1[],int counts2[], int n, int countsSum1, int countsSum2)
|
||||
{
|
||||
double seA=0.0;
|
||||
double seB=0.0;
|
||||
double seAB=0.0;
|
||||
double c=0.0;
|
||||
int AB;
|
||||
int allSum = countsSum1+countsSum2;
|
||||
for(int i=0;i<n;i++)
|
||||
{
|
||||
AB = counts1[i] + counts2[i];
|
||||
seA -= xlogx(((double)counts1[i])/((double)countsSum1));
|
||||
seB -= xlogx(((double)counts2[i])/((double)countsSum2));
|
||||
seAB -= xlogx(((double)AB)/((double)allSum));
|
||||
}
|
||||
/**
|
||||
* Computes differential shannon entropy
|
||||
*
|
||||
* @return DSE=SE(AB)-0.5*[SE(A)+SE(B)]
|
||||
*/
|
||||
public static double differentialShannon(int counts1[],int counts2[], int n, int countsSum1, int countsSum2)
|
||||
{
|
||||
double seA=0.0;
|
||||
double seB=0.0;
|
||||
double seAB=0.0;
|
||||
double c=0.0;
|
||||
int AB;
|
||||
int allSum = countsSum1+countsSum2;
|
||||
for(int i=0;i<n;i++)
|
||||
{
|
||||
AB = counts1[i] + counts2[i];
|
||||
seA -= xlogx(((double)counts1[i])/((double)countsSum1));
|
||||
seB -= xlogx(((double)counts2[i])/((double)countsSum2));
|
||||
seAB -= xlogx(((double)AB)/((double)allSum));
|
||||
}
|
||||
|
||||
c= seAB - 0.5*(seA+seB);
|
||||
c= seAB - 0.5*(seA+seB);
|
||||
|
||||
return c;
|
||||
}
|
||||
return c;
|
||||
}
|
||||
|
||||
/**
|
||||
* Computes entropy for an array of integers.
|
||||
*
|
||||
* @param counts array of counts
|
||||
* @return - a log2 a - b log2 b - c log2 c + (a+b+c) log2 (a+b+c)
|
||||
* when given array [a b c]
|
||||
*/
|
||||
public static double info(int counts[]) {
|
||||
/**
|
||||
* Computes entropy for an array of integers.
|
||||
*
|
||||
* @param counts array of counts
|
||||
* @return - a log2 a - b log2 b - c log2 c + (a+b+c) log2 (a+b+c)
|
||||
* when given array [a b c]
|
||||
*/
|
||||
public static double info(int counts[]) {
|
||||
|
||||
int total = 0;
|
||||
int c;
|
||||
double x = 0;
|
||||
for (int j = 0; j < counts.length; j++) {
|
||||
x -= xlogx(counts[j]);
|
||||
total += counts[j];
|
||||
}
|
||||
return x + xlogx(total);
|
||||
}
|
||||
int total = 0;
|
||||
int c;
|
||||
double x = 0;
|
||||
for (int j = 0; j < counts.length; j++) {
|
||||
x -= xlogx(counts[j]);
|
||||
total += counts[j];
|
||||
}
|
||||
return x + xlogx(total);
|
||||
}
|
||||
|
||||
/**
|
||||
* Computes shannon entropy for an array of integers.
|
||||
*
|
||||
* @param counts array of counts
|
||||
* @return - a log2 a - b log2 b - c log2 c
|
||||
* when given array [a b c]
|
||||
*/
|
||||
public static double shannon(int counts[], int countsSum) {
|
||||
/**
|
||||
* Computes shannon entropy for an array of integers.
|
||||
*
|
||||
* @param counts array of counts
|
||||
* @return - a log2 a - b log2 b - c log2 c
|
||||
* when given array [a b c]
|
||||
*/
|
||||
public static double shannon(int counts[], int countsSum) {
|
||||
|
||||
double x = 0;
|
||||
for (int j = 0; j < counts.length; j++) {
|
||||
x -= xlogx( ((double)counts[j])/ ((double)countsSum));
|
||||
}
|
||||
return x;
|
||||
}
|
||||
double x = 0;
|
||||
for (int j = 0; j < counts.length; j++) {
|
||||
x -= xlogx( ((double)counts[j])/ ((double)countsSum));
|
||||
}
|
||||
return x;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the logarithm of a for base 2.
|
||||
*
|
||||
* @param a a double
|
||||
*/
|
||||
public static final double log2(double a) {
|
||||
/**
|
||||
* Returns the logarithm of a for base 2.
|
||||
*
|
||||
* @param a a double
|
||||
*/
|
||||
public static final double log2(double a) {
|
||||
|
||||
return Math.log(a) / log2;
|
||||
}
|
||||
return Math.log(a) / log2;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns index of maximum element in a given
|
||||
* array of doubles. First maximum is returned.
|
||||
*
|
||||
* @param doubles the array of doubles
|
||||
* @return the index of the maximum element
|
||||
*/
|
||||
public static int maxIndex(double [] doubles) {
|
||||
/**
|
||||
* Returns index of maximum element in a given
|
||||
* array of doubles. First maximum is returned.
|
||||
*
|
||||
* @param doubles the array of doubles
|
||||
* @return the index of the maximum element
|
||||
*/
|
||||
public static int maxIndex(double [] doubles) {
|
||||
|
||||
double maximum = 0;
|
||||
int maxIndex = 0;
|
||||
double maximum = 0;
|
||||
int maxIndex = 0;
|
||||
|
||||
for (int i = 0; i < doubles.length; i++) {
|
||||
if ((i == 0) || (doubles[i] > maximum)) {
|
||||
maxIndex = i;
|
||||
maximum = doubles[i];
|
||||
}
|
||||
}
|
||||
for (int i = 0; i < doubles.length; i++) {
|
||||
if ((i == 0) || (doubles[i] > maximum)) {
|
||||
maxIndex = i;
|
||||
maximum = doubles[i];
|
||||
}
|
||||
}
|
||||
|
||||
return maxIndex;
|
||||
}
|
||||
return maxIndex;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns index of maximum element in a given
|
||||
* array of integers. First maximum is returned.
|
||||
*
|
||||
* @param ints the array of integers
|
||||
* @return the index of the maximum element
|
||||
*/
|
||||
public static int maxIndex(int [] ints) {
|
||||
/**
|
||||
* Returns index of maximum element in a given
|
||||
* array of integers. First maximum is returned.
|
||||
*
|
||||
* @param ints the array of integers
|
||||
* @return the index of the maximum element
|
||||
*/
|
||||
public static int maxIndex(int [] ints) {
|
||||
|
||||
int maximum = 0;
|
||||
int maxIndex = 0;
|
||||
int maximum = 0;
|
||||
int maxIndex = 0;
|
||||
|
||||
for (int i = 0; i < ints.length; i++) {
|
||||
if ((i == 0) || (ints[i] > maximum)) {
|
||||
maxIndex = i;
|
||||
maximum = ints[i];
|
||||
}
|
||||
}
|
||||
for (int i = 0; i < ints.length; i++) {
|
||||
if ((i == 0) || (ints[i] > maximum)) {
|
||||
maxIndex = i;
|
||||
maximum = ints[i];
|
||||
}
|
||||
}
|
||||
|
||||
return maxIndex;
|
||||
}
|
||||
return maxIndex;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns index of minimum element in a given
|
||||
* array of integers. First minimum is returned.
|
||||
*
|
||||
* @param ints the array of integers
|
||||
* @return the index of the minimum element
|
||||
*/
|
||||
public static int minIndex(int [] ints) {
|
||||
/**
|
||||
* Returns index of minimum element in a given
|
||||
* array of integers. First minimum is returned.
|
||||
*
|
||||
* @param ints the array of integers
|
||||
* @return the index of the minimum element
|
||||
*/
|
||||
public static int minIndex(int [] ints) {
|
||||
|
||||
int minimum = 0;
|
||||
int minIndex = 0;
|
||||
int minimum = 0;
|
||||
int minIndex = 0;
|
||||
|
||||
for (int i = 0; i < ints.length; i++) {
|
||||
if ((i == 0) || (ints[i] < minimum)) {
|
||||
minIndex = i;
|
||||
minimum = ints[i];
|
||||
}
|
||||
}
|
||||
for (int i = 0; i < ints.length; i++) {
|
||||
if ((i == 0) || (ints[i] < minimum)) {
|
||||
minIndex = i;
|
||||
minimum = ints[i];
|
||||
}
|
||||
}
|
||||
|
||||
return minIndex;
|
||||
}
|
||||
return minIndex;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns index of minimum element in a given
|
||||
* array of doubles. First minimum is returned.
|
||||
*
|
||||
* @param doubles the array of doubles
|
||||
* @return the index of the minimum element
|
||||
*/
|
||||
public static int minIndex(double [] doubles) {
|
||||
/**
|
||||
* Returns index of minimum element in a given
|
||||
* array of doubles. First minimum is returned.
|
||||
*
|
||||
* @param doubles the array of doubles
|
||||
* @return the index of the minimum element
|
||||
*/
|
||||
public static int minIndex(double [] doubles) {
|
||||
|
||||
double minimum = 0;
|
||||
int minIndex = 0;
|
||||
double minimum = 0;
|
||||
int minIndex = 0;
|
||||
|
||||
for (int i = 0; i < doubles.length; i++) {
|
||||
if ((i == 0) || (doubles[i] < minimum)) {
|
||||
minIndex = i;
|
||||
minimum = doubles[i];
|
||||
}
|
||||
}
|
||||
for (int i = 0; i < doubles.length; i++) {
|
||||
if ((i == 0) || (doubles[i] < minimum)) {
|
||||
minIndex = i;
|
||||
minimum = doubles[i];
|
||||
}
|
||||
}
|
||||
|
||||
return minIndex;
|
||||
}
|
||||
return minIndex;
|
||||
}
|
||||
|
||||
/**
|
||||
* Computes the variance for an array of doubles.
|
||||
*
|
||||
* @param vector the array
|
||||
* @return the variance
|
||||
*/
|
||||
public static double variance(double[] vector) {
|
||||
/**
|
||||
* Computes the variance for an array of doubles.
|
||||
*
|
||||
* @param vector the array
|
||||
* @return the variance
|
||||
*/
|
||||
public static double variance(double[] vector) {
|
||||
|
||||
double sum = 0, sumSquared = 0;
|
||||
double sum = 0, sumSquared = 0;
|
||||
|
||||
if (vector.length <= 1) {
|
||||
return 0;
|
||||
}
|
||||
for (int i = 0; i < vector.length; i++) {
|
||||
sum += vector[i];
|
||||
sumSquared += (vector[i] * vector[i]);
|
||||
}
|
||||
double result = (sumSquared - (sum * sum / (double) vector.length)) /
|
||||
(double) (vector.length - 1);
|
||||
if (vector.length <= 1) {
|
||||
return 0;
|
||||
}
|
||||
for (int i = 0; i < vector.length; i++) {
|
||||
sum += vector[i];
|
||||
sumSquared += (vector[i] * vector[i]);
|
||||
}
|
||||
double result = (sumSquared - (sum * sum / (double) vector.length)) /
|
||||
(double) (vector.length - 1);
|
||||
|
||||
// We don't like negative variance
|
||||
if (result < 0) {
|
||||
return 0;
|
||||
} else {
|
||||
return result;
|
||||
}
|
||||
}
|
||||
// We don't like negative variance
|
||||
if (result < 0) {
|
||||
return 0;
|
||||
} else {
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns c*log2(c) for a given integer value c.
|
||||
*
|
||||
* @param c an integer value
|
||||
* @return c*log2(c) (but is careful to return 0 if c is 0)
|
||||
*/
|
||||
public static final double xlogx(int c) {
|
||||
/**
|
||||
* Returns c*log2(c) for a given integer value c.
|
||||
*
|
||||
* @param c an integer value
|
||||
* @return c*log2(c) (but is careful to return 0 if c is 0)
|
||||
*/
|
||||
public static final double xlogx(int c) {
|
||||
|
||||
if (c == 0) {
|
||||
return 0.0;
|
||||
}
|
||||
return c * StatisticUtils.log2((double) c);
|
||||
}
|
||||
if (c == 0) {
|
||||
return 0.0;
|
||||
}
|
||||
return c * StatisticUtils.log2((double) c);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns c*log2(c) for a given value c.
|
||||
*
|
||||
* @param c an integer value
|
||||
* @return c*log2(c) (but is careful to return 0 if c is 0)
|
||||
*/
|
||||
public static final double xlogx(double c) {
|
||||
/**
|
||||
* Returns c*log2(c) for a given value c.
|
||||
*
|
||||
* @param c an integer value
|
||||
* @return c*log2(c) (but is careful to return 0 if c is 0)
|
||||
*/
|
||||
public static final double xlogx(double c) {
|
||||
|
||||
if (c == 0) {
|
||||
return 0.0;
|
||||
}
|
||||
return c * StatisticUtils.log2( c);
|
||||
}
|
||||
if (c == 0) {
|
||||
return 0.0;
|
||||
}
|
||||
return c * StatisticUtils.log2( c);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests if a is equal to b.
|
||||
*
|
||||
* @param a a double
|
||||
* @param b a double
|
||||
*/
|
||||
public static final boolean eq(double a, double b){
|
||||
/**
|
||||
* Tests if a is equal to b.
|
||||
*
|
||||
* @param a a double
|
||||
* @param b a double
|
||||
*/
|
||||
public static final boolean eq(double a, double b){
|
||||
|
||||
return (a - b < SMALL) && (b - a < SMALL);
|
||||
}
|
||||
return (a - b < SMALL) && (b - a < SMALL);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests if a is smaller or equal to b.
|
||||
*
|
||||
* @param a a double
|
||||
* @param b a double
|
||||
*/
|
||||
public static final boolean smOrEq(double a,double b) {
|
||||
/**
|
||||
* Tests if a is smaller or equal to b.
|
||||
*
|
||||
* @param a a double
|
||||
* @param b a double
|
||||
*/
|
||||
public static final boolean smOrEq(double a,double b) {
|
||||
|
||||
return (a-b < SMALL);
|
||||
}
|
||||
return (a-b < SMALL);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests if a is greater or equal to b.
|
||||
*
|
||||
* @param a a double
|
||||
* @param b a double
|
||||
*/
|
||||
public static final boolean grOrEq(double a,double b) {
|
||||
/**
|
||||
* Tests if a is greater or equal to b.
|
||||
*
|
||||
* @param a a double
|
||||
* @param b a double
|
||||
*/
|
||||
public static final boolean grOrEq(double a,double b) {
|
||||
|
||||
return (b-a < SMALL);
|
||||
}
|
||||
return (b-a < SMALL);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests if a is smaller than b.
|
||||
*
|
||||
* @param a a double
|
||||
* @param b a double
|
||||
*/
|
||||
public static final boolean sm(double a,double b) {
|
||||
/**
|
||||
* Tests if a is smaller than b.
|
||||
*
|
||||
* @param a a double
|
||||
* @param b a double
|
||||
*/
|
||||
public static final boolean sm(double a,double b) {
|
||||
|
||||
return (b-a > SMALL);
|
||||
}
|
||||
return (b-a > SMALL);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests if a is greater than b.
|
||||
*
|
||||
* @param a a double
|
||||
* @param b a double
|
||||
*/
|
||||
public static final boolean gr(double a,double b) {
|
||||
/**
|
||||
* Tests if a is greater than b.
|
||||
*
|
||||
* @param a a double
|
||||
* @param b a double
|
||||
*/
|
||||
public static final boolean gr(double a,double b) {
|
||||
|
||||
return (a-b > SMALL);
|
||||
}
|
||||
return (a-b > SMALL);
|
||||
}
|
||||
|
||||
/**
|
||||
* returns root mean square error.
|
||||
*/
|
||||
public static final double rmsError(double array1[], double array2[])
|
||||
{
|
||||
if ((array1 == null) || (array2 == null)) { return -1.0; }
|
||||
/**
|
||||
* returns root mean square error.
|
||||
*/
|
||||
public static final double rmsError(double array1[], double array2[])
|
||||
{
|
||||
if ((array1 == null) || (array2 == null)) { return -1.0; }
|
||||
|
||||
double errorValueRMS = 0;
|
||||
for (int i=0; i<array1.length; i++)
|
||||
{
|
||||
// add squared error value
|
||||
errorValueRMS += (array1[i] - array2[i]) * (array1[i] - array2[i]);
|
||||
}
|
||||
// calculate mean and root of the sum of the squared error values
|
||||
errorValueRMS = Math.sqrt(errorValueRMS / (double) array1.length);
|
||||
double errorValueRMS = 0;
|
||||
for (int i=0; i<array1.length; i++)
|
||||
{
|
||||
// add squared error value
|
||||
errorValueRMS += (array1[i] - array2[i]) * (array1[i] - array2[i]);
|
||||
}
|
||||
// calculate mean and root of the sum of the squared error values
|
||||
errorValueRMS = Math.sqrt(errorValueRMS / (double) array1.length);
|
||||
|
||||
return errorValueRMS;
|
||||
}
|
||||
return errorValueRMS;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the correlation coefficient r^2.
|
||||
*
|
||||
* Correlation ("Statistik", 7 Aufl., Hartung, 1989, Kapitel 9 und 10, S.546-608):
|
||||
* a=yMess[i];
|
||||
* b=yWahr[i];
|
||||
* aa=a*a;
|
||||
* bb=b*b;
|
||||
* ab=a*b;
|
||||
* numerator=sumAB-(sumA*sumB/n);
|
||||
* denominator=sqrt[(sumAA-(sumA*sumA/n))*(sumBB-(sumB*sumB/n))];
|
||||
* R=correlationcoefficient=numerator/denominator;
|
||||
*
|
||||
* @author Joerg K. Wegner
|
||||
*/
|
||||
public static double getCorrelationCoefficient(double array1[], double array2[])
|
||||
{
|
||||
if ((array1 == null) || (array2 == null)) { return -2.0; }
|
||||
/**
|
||||
* Returns the correlation coefficient r^2.
|
||||
*
|
||||
* Correlation ("Statistik", 7 Aufl., Hartung, 1989, Kapitel 9 und 10, S.546-608):
|
||||
* a=yMess[i];
|
||||
* b=yWahr[i];
|
||||
* aa=a*a;
|
||||
* bb=b*b;
|
||||
* ab=a*b;
|
||||
* numerator=sumAB-(sumA*sumB/n);
|
||||
* denominator=sqrt[(sumAA-(sumA*sumA/n))*(sumBB-(sumB*sumB/n))];
|
||||
* R=correlationcoefficient=numerator/denominator;
|
||||
*
|
||||
* @author Joerg K. Wegner
|
||||
*/
|
||||
public static double getCorrelationCoefficient(double array1[], double array2[])
|
||||
{
|
||||
if ((array1 == null) || (array2 == null)) { return -2.0; }
|
||||
|
||||
double sumA = 0;
|
||||
double sumB = 0;
|
||||
double sumAB = 0;
|
||||
double sumAA = 0;
|
||||
double sumBB = 0;
|
||||
double sumA = 0;
|
||||
double sumB = 0;
|
||||
double sumAB = 0;
|
||||
double sumAA = 0;
|
||||
double sumBB = 0;
|
||||
|
||||
for (int i=0; i<array1.length; i++)
|
||||
{
|
||||
double a = array1[i];
|
||||
double b = array2[i];
|
||||
for (int i=0; i<array1.length; i++)
|
||||
{
|
||||
double a = array1[i];
|
||||
double b = array2[i];
|
||||
|
||||
sumA += a;
|
||||
sumB += b;
|
||||
sumAA += a*a;
|
||||
sumBB += b*b;
|
||||
sumAB += a*b;
|
||||
}
|
||||
sumA += a;
|
||||
sumB += b;
|
||||
sumAA += a*a;
|
||||
sumBB += b*b;
|
||||
sumAB += a*b;
|
||||
}
|
||||
|
||||
double n = (double) array1.length;
|
||||
double numerator = sumAB - (sumA*sumB/n);
|
||||
double denominator = Math.sqrt((sumAA - (sumA*sumA/n)) * (sumBB - (sumB*sumB/n)));
|
||||
double corrCoefficient = numerator / denominator;
|
||||
corrCoefficient *= corrCoefficient;
|
||||
double n = (double) array1.length;
|
||||
double numerator = sumAB - (sumA*sumB/n);
|
||||
double denominator = Math.sqrt((sumAA - (sumA*sumA/n)) * (sumBB - (sumB*sumB/n)));
|
||||
double corrCoefficient = numerator / denominator;
|
||||
corrCoefficient *= corrCoefficient;
|
||||
|
||||
return corrCoefficient;
|
||||
}
|
||||
return corrCoefficient;
|
||||
}
|
||||
|
||||
/**
|
||||
* Main method for testing this class.
|
||||
*/
|
||||
public static void main(String[] ops) {
|
||||
/**
|
||||
* Main method for testing this class.
|
||||
*/
|
||||
public static void main(String[] ops) {
|
||||
|
||||
// System.out.println("test (0.5, 100): " +
|
||||
// StatisticUtils.test(100));
|
||||
}
|
||||
// System.out.println("test (0.5, 100): " +
|
||||
// StatisticUtils.test(100));
|
||||
}
|
||||
|
||||
// The following methods got mysteriously lost maybe during cvs-svn refactoring.
|
||||
// For the time being I add method thunks which give a warning when called. (mkron)
|
||||
public static double quadratic_entropy(double[] ds) {
|
||||
// TODO Auto-generated method stub
|
||||
System.err.println("warning, not implemented!");
|
||||
return 0;
|
||||
}
|
||||
// The following methods got mysteriously lost maybe during cvs-svn refactoring.
|
||||
// For the time being I add method thunks which give a warning when called. (mkron)
|
||||
public static double quadratic_entropy(double[] ds) {
|
||||
// TODO Auto-generated method stub
|
||||
System.err.println("warning, not implemented!");
|
||||
return 0;
|
||||
}
|
||||
|
||||
public static double mutual_information(double[] ds, double[] ds2, int nbins) {
|
||||
// TODO Auto-generated method stub
|
||||
System.err.println("warning, not implemented!");
|
||||
return 0;
|
||||
}
|
||||
public static double mutual_information(double[] ds, double[] ds2, int nbins) {
|
||||
// TODO Auto-generated method stub
|
||||
System.err.println("warning, not implemented!");
|
||||
return 0;
|
||||
}
|
||||
|
||||
public static double quadratic_mutinf(double[] feature, double[] labels) {
|
||||
// TODO Auto-generated method stub
|
||||
System.err.println("warning, not implemented!");
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
public static double quadratic_mutinf(double[] feature, double[] labels, int[] classes) {
|
||||
// TODO Auto-generated method stub
|
||||
System.err.println("warning, not implemented!");
|
||||
@ -444,4 +448,148 @@ public class StatisticUtils
|
||||
System.err.println("warning, not implemented!");
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Random Latin Hypercube Sampling within a given double range.
|
||||
*
|
||||
* @see #rlh(int, int, double, double, boolean)
|
||||
*
|
||||
* @param samples
|
||||
* @param range
|
||||
* @param edges
|
||||
* @return
|
||||
*/
|
||||
public static Matrix rlh( int samples, double[][] range, boolean edges) {
|
||||
Matrix rlhM = rlh(samples, range.length, 0., 1., edges);
|
||||
for( int j=0; j<samples; ++j ) {
|
||||
for( int i=0; i<range.length;++i ) {
|
||||
// carsten hatte nen bug im RLH - zählweise der indices beginnt bei 0, nicht bei 1
|
||||
rlhM.set(j, i, range[i][0]+rlhM.get(j,i)*(range[i][1]-range[i][0]));
|
||||
}
|
||||
}
|
||||
return rlhM;
|
||||
}
|
||||
|
||||
/**
|
||||
* Random Latin Hypercube Sampling, from "Engineering Design via Surrogate Modelling", p.17.
|
||||
* The returned matrix is of dimension Matrix(samples,dim). If edges is true, the boundary values
|
||||
* are included. Initial version by C. Henneges.
|
||||
*
|
||||
* @param samples
|
||||
* @param dim
|
||||
* @param lb
|
||||
* @param ub
|
||||
* @param edges
|
||||
* @return
|
||||
*/
|
||||
public static Matrix rlh( int samples, int dim, double lb, double ub, boolean edges) {
|
||||
// System.out.println( "Latin Hypercube sampling" );
|
||||
// ++rlhsamplings;
|
||||
|
||||
// perform Latin-Hypercube-Sampling to obtain a stratified sample of
|
||||
// function values over the optimization domain
|
||||
|
||||
// Pre-allocate memory
|
||||
Matrix X = new Matrix( samples,dim );
|
||||
|
||||
ArrayList<Integer> indices = new ArrayList<Integer>( samples );
|
||||
for( int i=0; i<samples; ++i ) { indices.add( i ); }
|
||||
|
||||
// for i = 1:k
|
||||
for( int i=0; i<dim; ++i ) {
|
||||
|
||||
// X(:,i) = randperm(n)';
|
||||
Collections.shuffle( indices );
|
||||
for( int j=0; j<indices.size(); ++j ) {
|
||||
X.set( j,i,indices.get(j) );
|
||||
}
|
||||
// end
|
||||
}
|
||||
|
||||
// if edges==1
|
||||
if( edges ) {
|
||||
// X = (X-1)/(n-1);
|
||||
for( int i=0; i<X.getRowDimension(); ++i ) {
|
||||
for( int j=0; j<X.getColumnDimension(); ++j ) {
|
||||
double v = X.get(i,j);
|
||||
v = (v)/(samples-1);
|
||||
X.set( i,j,v );
|
||||
}
|
||||
}
|
||||
// else
|
||||
} else {
|
||||
// X = (X-0.5)/n;
|
||||
for( int i=0; i<X.getRowDimension(); ++i ) {
|
||||
for( int j=0; j<X.getColumnDimension(); ++j ) {
|
||||
double v = X.get(i,j);
|
||||
v = (v + 0.5)/samples;
|
||||
X.set( i,j,v );
|
||||
}
|
||||
}
|
||||
}
|
||||
// end
|
||||
|
||||
// ------
|
||||
|
||||
// Transform and Scale random values to [lb,ub]
|
||||
for( int i=0; i<X.getRowDimension(); ++i ) {
|
||||
for( int j=0; j<X.getColumnDimension(); ++j ) {
|
||||
double v = X.get(i,j);
|
||||
v = (ub-lb)*v + lb;
|
||||
X.set( i,j,v );
|
||||
}
|
||||
}
|
||||
|
||||
return X;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a list of point matrices which form a latin hypercube sampling of the given space.
|
||||
* Each entry is a Matrix(dim,1).
|
||||
*
|
||||
* @param samples
|
||||
* @param dim
|
||||
* @param lb
|
||||
* @param ub
|
||||
* @param edges
|
||||
* @return
|
||||
*/
|
||||
public static ArrayList<Matrix> rlhPoints(int samples, int dim, double lb, double ub, boolean edges)
|
||||
{
|
||||
ArrayList<Matrix> samplePoints = new ArrayList<Matrix>(samples);
|
||||
Matrix p = rlh( samples,dim,lb,ub,edges );
|
||||
|
||||
for( int i=0; i<samples;++i ) {
|
||||
|
||||
Matrix x = new Matrix(dim,1);
|
||||
for( int j=0; j<dim; ++j ) {
|
||||
x.set( j,0,p.get( i,j ) );
|
||||
}
|
||||
samplePoints.add( x );
|
||||
|
||||
}
|
||||
return samplePoints;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a list of point matrices which form a latin hypercube sampling of the given space.
|
||||
* @param samples
|
||||
* @param dim
|
||||
* @param lb
|
||||
* @param ub
|
||||
* @param edges
|
||||
* @return
|
||||
*/
|
||||
public static ArrayList<Matrix> rlhPoints(int samples, double[][] range, boolean edges)
|
||||
{
|
||||
ArrayList<Matrix> rlhM = rlhPoints(samples, range.length, 0, 1, edges);
|
||||
for( int i=0; i<rlhM.size();++i ) {
|
||||
Matrix p = rlhM.get(i);
|
||||
for( int j=0; j<range.length; ++j ) {
|
||||
// carsten hatte nen bug im RLH - zählweise der indices beginnt bei 0, nicht bei 1
|
||||
p.set(j, 0, range[j][0]+p.get(j,0)*(range[j][1]-range[j][0]));
|
||||
}
|
||||
}
|
||||
return rlhM;
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user