Minor updates, merging MK branch revs. 511:515
This commit is contained in:
parent
b6e13e3b60
commit
372e0cf5e9
@ -320,9 +320,8 @@ public class GenericObjectEditor implements PropertyEditor {
|
|||||||
*/
|
*/
|
||||||
private void setObject(Object c) {
|
private void setObject(Object c) {
|
||||||
// This should really call equals() for comparison.
|
// This should really call equals() for comparison.
|
||||||
if (TRACE) System.out.println("setObject "+ c.getClass().getName());
|
if (TRACE) System.out.println("setObject "+ c.getClass().getName() + " " + c);
|
||||||
boolean trueChange = (c != getValue());
|
boolean trueChange = (c != getValue());
|
||||||
//System.err.println("Didn't even try to make a Object copy!! "+ "(using original)");
|
|
||||||
|
|
||||||
m_Backup = m_Object;
|
m_Backup = m_Object;
|
||||||
m_Object = c;
|
m_Object = c;
|
||||||
|
@ -153,7 +153,6 @@ Serializable {
|
|||||||
try {
|
try {
|
||||||
Thread.sleep(100);
|
Thread.sleep(100);
|
||||||
} catch (InterruptedException e) {
|
} catch (InterruptedException e) {
|
||||||
// TODO Auto-generated catch block
|
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -33,6 +33,8 @@ import java.io.IOException;
|
|||||||
import java.io.ObjectInputStream;
|
import java.io.ObjectInputStream;
|
||||||
import java.io.ObjectOutputStream;
|
import java.io.ObjectOutputStream;
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
import java.util.Formatter;
|
||||||
|
import java.util.Locale;
|
||||||
|
|
||||||
import javax.imageio.ImageIO;
|
import javax.imageio.ImageIO;
|
||||||
import javax.swing.JButton;
|
import javax.swing.JButton;
|
||||||
@ -260,22 +262,24 @@ public class Plot implements PlotInterface, Serializable {
|
|||||||
*/
|
*/
|
||||||
public void drawPopulation(String prefix, Population pop) {
|
public void drawPopulation(String prefix, Population pop) {
|
||||||
for (int i = 0; i < pop.size(); i++) {
|
for (int i = 0; i < pop.size(); i++) {
|
||||||
drawIndividual(1, 2, prefix, pop.getEAIndividual(i));
|
drawIndividual(0, 2, prefix, pop.getEAIndividual(i));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Draw an individual to the Plot instance. It is annotated with the given
|
* Draw an individual to the Plot instance. It is annotated with the
|
||||||
* prefix and its fitness.
|
* given prefix and its fitness with short scientific notation.
|
||||||
*
|
*
|
||||||
* @param prefix
|
* @param prefix
|
||||||
* @param pop
|
* @param pop
|
||||||
* @see FunctionArea.drawIcon
|
* @see FunctionArea.drawIcon
|
||||||
*/
|
*/
|
||||||
public void drawIndividual(int iconType, int graphID, String prefix,
|
public void drawIndividual(int iconType, int graphID, String prefix, AbstractEAIndividual indy) {
|
||||||
AbstractEAIndividual indy) {
|
StringBuffer sb = new StringBuffer();
|
||||||
getFunctionArea().drawIcon(iconType, prefix + " " + indy.getFitness(0),
|
Formatter formatter = new Formatter(sb, Locale.US);
|
||||||
indy.getDoublePosition(), graphID);
|
formatter.format("%s %.3e", prefix, indy.getFitness(0));
|
||||||
|
|
||||||
|
getFunctionArea().drawIcon(iconType, sb.toString(), indy.getDoublePosition(), graphID);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setPreferredSize(Dimension prefSize) {
|
public void setPreferredSize(Dimension prefSize) {
|
||||||
|
@ -912,7 +912,6 @@ public class PropertySheetPanel extends JPanel implements PropertyChangeListener
|
|||||||
try {
|
try {
|
||||||
val = getter.invoke(m_Target, (Object[])null);
|
val = getter.invoke(m_Target, (Object[])null);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
// TODO Auto-generated catch block
|
|
||||||
val = null;
|
val = null;
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
5
src/eva2/server/go/enums/MutateESCrossoverTypeEnum.java
Normal file
5
src/eva2/server/go/enums/MutateESCrossoverTypeEnum.java
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
package eva2.server.go.enums;
|
||||||
|
|
||||||
|
public enum MutateESCrossoverTypeEnum {
|
||||||
|
none, intermediate, discrete;
|
||||||
|
}
|
@ -3,6 +3,7 @@ package eva2.server.go.individuals;
|
|||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.BitSet;
|
import java.util.BitSet;
|
||||||
|
import java.util.Formatter;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@ -805,7 +806,7 @@ public abstract class AbstractEAIndividual implements IndividualInterface, java.
|
|||||||
public double getCrossoverProbability() {
|
public double getCrossoverProbability() {
|
||||||
return this.m_CrossoverProbability;
|
return this.m_CrossoverProbability;
|
||||||
}
|
}
|
||||||
public String crossoverProbalilityTipText() {
|
public String crossoverProbabilityTipText() {
|
||||||
return "The chance that crossover occurs.";
|
return "The chance that crossover occurs.";
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -876,13 +877,13 @@ public abstract class AbstractEAIndividual implements IndividualInterface, java.
|
|||||||
public static String getDefaultStringRepresentation(AbstractEAIndividual individual) {
|
public static String getDefaultStringRepresentation(AbstractEAIndividual individual) {
|
||||||
// Note that changing this method might change the hashcode of an individual
|
// Note that changing this method might change the hashcode of an individual
|
||||||
// which might interfere with some functionality.
|
// which might interfere with some functionality.
|
||||||
StringBuffer sb = new StringBuffer("Fit.: ");
|
StringBuffer sb = new StringBuffer("Fit.:\t");
|
||||||
sb.append(BeanInspector.toString(individual.getFitness()));
|
sb.append(BeanInspector.toString(individual.getFitness()));
|
||||||
if (individual.isMarkedPenalized() || individual.violatesConstraint())
|
if (individual.isMarkedPenalized() || individual.violatesConstraint())
|
||||||
sb.append(", X");
|
sb.append(", X");
|
||||||
sb.append(", ID: ");
|
sb.append(", ID: ");
|
||||||
sb.append(individual.getIndyID());
|
sb.append(individual.getIndyID());
|
||||||
sb.append(", ");
|
sb.append(",\t");
|
||||||
sb.append(getDefaultDataString(individual));
|
sb.append(getDefaultDataString(individual));
|
||||||
|
|
||||||
if (individual.getParentIDs()!=null) {
|
if (individual.getParentIDs()!=null) {
|
||||||
@ -902,7 +903,7 @@ public abstract class AbstractEAIndividual implements IndividualInterface, java.
|
|||||||
public static String getDefaultDataString(IndividualInterface individual) {
|
public static String getDefaultDataString(IndividualInterface individual) {
|
||||||
// Note that changing this method might change the hashcode of an individual
|
// Note that changing this method might change the hashcode of an individual
|
||||||
// which might interfere with some functionality.
|
// which might interfere with some functionality.
|
||||||
return getDefaultDataString(individual, ", ");
|
return getDefaultDataString(individual, ",");
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -917,6 +918,7 @@ public abstract class AbstractEAIndividual implements IndividualInterface, java.
|
|||||||
// which might interfere with some functionality.
|
// which might interfere with some functionality.
|
||||||
if (individual == null) return "null";
|
if (individual == null) return "null";
|
||||||
StringBuffer sb = new StringBuffer("");
|
StringBuffer sb = new StringBuffer("");
|
||||||
|
Formatter fm = new Formatter(sb);
|
||||||
char left = '{';
|
char left = '{';
|
||||||
char right = '}';
|
char right = '}';
|
||||||
sb.append(left);
|
sb.append(left);
|
||||||
@ -933,10 +935,12 @@ public abstract class AbstractEAIndividual implements IndividualInterface, java.
|
|||||||
if ((i+1) < b.length) sb.append(separator);
|
if ((i+1) < b.length) sb.append(separator);
|
||||||
}
|
}
|
||||||
} else if (individual instanceof InterfaceDataTypeDouble) {
|
} else if (individual instanceof InterfaceDataTypeDouble) {
|
||||||
double[] b = ((InterfaceDataTypeDouble)individual).getDoubleData();
|
double[] d = ((InterfaceDataTypeDouble)individual).getDoubleData();
|
||||||
for (int i = 0; i < b.length; i++) {
|
for (int i = 0; i < d.length; i++) {
|
||||||
sb.append(b[i]);
|
// sb.append(d[i]);
|
||||||
if ((i+1) < b.length) sb.append(separator);
|
// if ((i+1) < d.length) sb.append(separator);
|
||||||
|
fm.format("% .3f", d[i]);
|
||||||
|
if ((i+1) < d.length) sb.append(separator);
|
||||||
}
|
}
|
||||||
} else if (individual instanceof InterfaceDataTypePermutation) {
|
} else if (individual instanceof InterfaceDataTypePermutation) {
|
||||||
int[] b = ((InterfaceDataTypePermutation)individual).getPermutationData()[0];
|
int[] b = ((InterfaceDataTypePermutation)individual).getPermutationData()[0];
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package eva2.server.go.individuals;
|
package eva2.server.go.individuals;
|
||||||
|
|
||||||
|
|
||||||
|
import eva2.server.go.enums.MutateESCrossoverTypeEnum;
|
||||||
import eva2.server.go.operators.crossover.CrossoverESDefault;
|
import eva2.server.go.operators.crossover.CrossoverESDefault;
|
||||||
import eva2.server.go.operators.mutation.InterfaceMutation;
|
import eva2.server.go.operators.mutation.InterfaceMutation;
|
||||||
import eva2.server.go.operators.mutation.MutateESGlobal;
|
import eva2.server.go.operators.mutation.MutateESGlobal;
|
||||||
@ -25,7 +26,7 @@ public class ESIndividualDoubleData extends AbstractEAIndividual implements Inte
|
|||||||
|
|
||||||
public ESIndividualDoubleData() {
|
public ESIndividualDoubleData() {
|
||||||
this.m_MutationProbability = 1.0;
|
this.m_MutationProbability = 1.0;
|
||||||
this.m_MutationOperator = new MutateESGlobal();
|
this.m_MutationOperator = new MutateESGlobal(0.2, MutateESCrossoverTypeEnum.intermediate);
|
||||||
this.m_CrossoverProbability = 0.5;
|
this.m_CrossoverProbability = 0.5;
|
||||||
this.m_CrossoverOperator = new CrossoverESDefault();
|
this.m_CrossoverOperator = new CrossoverESDefault();
|
||||||
this.m_Genotype = new double[1];
|
this.m_Genotype = new double[1];
|
||||||
|
@ -0,0 +1,40 @@
|
|||||||
|
package eva2.server.go.individuals;
|
||||||
|
|
||||||
|
import java.util.Comparator;
|
||||||
|
|
||||||
|
import eva2.server.go.operators.distancemetric.InterfaceDistanceMetric;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compare two AbstractEAIndividuals by their distance to a reference individual.
|
||||||
|
* Usable to sort by a distance.
|
||||||
|
**/
|
||||||
|
public class IndividualDistanceComparator implements Comparator<Object> {
|
||||||
|
|
||||||
|
private AbstractEAIndividual refIndy=null;
|
||||||
|
private InterfaceDistanceMetric distMetric = null;
|
||||||
|
private boolean closerMeansLess = true;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor with a reference individual to which the distance is measured and the corresponding desired metric.
|
||||||
|
* Using closerIsLess it can be switched between increasing and decreasing order.
|
||||||
|
*
|
||||||
|
* @param referenceIndy
|
||||||
|
* @param metric
|
||||||
|
* @param closerIsLess
|
||||||
|
*/
|
||||||
|
public IndividualDistanceComparator(AbstractEAIndividual referenceIndy, InterfaceDistanceMetric metric, boolean closerIsLess) {
|
||||||
|
refIndy = referenceIndy;
|
||||||
|
distMetric = metric;
|
||||||
|
closerMeansLess = closerIsLess;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int compare(Object o1, Object o2) {
|
||||||
|
double d1 = distMetric.distance((AbstractEAIndividual)o1, refIndy);
|
||||||
|
double d2 = distMetric.distance((AbstractEAIndividual)o2, refIndy);
|
||||||
|
|
||||||
|
if (d1==d2) return 0;
|
||||||
|
if (closerMeansLess) return ((d1<d2) ? -1 : 1);
|
||||||
|
else return ((d1<d2) ? 1 : -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -60,7 +60,6 @@ public class MOCCOProblemInitialization extends MOCCOPhase implements InterfaceP
|
|||||||
try {
|
try {
|
||||||
altern = ReflectPackage.getAssignableClassesInPackage("eva2.server.go.problems", Class.forName("eva2.server.go.problems.InterfaceMultiObjectiveDeNovoProblem"), true, true);
|
altern = ReflectPackage.getAssignableClassesInPackage("eva2.server.go.problems", Class.forName("eva2.server.go.problems.InterfaceMultiObjectiveDeNovoProblem"), true, true);
|
||||||
} catch (ClassNotFoundException e) {
|
} catch (ClassNotFoundException e) {
|
||||||
// TODO Auto-generated catch block
|
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
this.m_ProblemChooser.setModel(new DefaultComboBoxModel(altern));
|
this.m_ProblemChooser.setModel(new DefaultComboBoxModel(altern));
|
||||||
|
@ -53,7 +53,7 @@ public class ArchivingMaxiMin implements InterfaceArchiving, java.io.Serializabl
|
|||||||
Population tmpPop = new Population();
|
Population tmpPop = new Population();
|
||||||
tmpPop.addPopulation((Population)pop.getClone());
|
tmpPop.addPopulation((Population)pop.getClone());
|
||||||
tmpPop.addPopulation((Population)pop.getArchive().getClone());
|
tmpPop.addPopulation((Population)pop.getArchive().getClone());
|
||||||
tmpPop.removeDoubleInstancesUsingFitness();
|
tmpPop.removeRedundantIndiesUsingFitness();
|
||||||
|
|
||||||
// Now calculate the MaxiMin Criterium
|
// Now calculate the MaxiMin Criterium
|
||||||
this.m_MaxiMin.convertMultiObjective2SingleObjective(tmpPop);
|
this.m_MaxiMin.convertMultiObjective2SingleObjective(tmpPop);
|
||||||
|
@ -65,7 +65,7 @@ public class ArchivingNSGAII extends ArchivingNSGA implements java.io.Serializab
|
|||||||
Population tmpPop = new Population();
|
Population tmpPop = new Population();
|
||||||
tmpPop.addPopulation((Population)pop.getClone());
|
tmpPop.addPopulation((Population)pop.getClone());
|
||||||
tmpPop.addPopulation((Population)pop.getArchive().getClone());
|
tmpPop.addPopulation((Population)pop.getArchive().getClone());
|
||||||
tmpPop.removeDoubleInstancesUsingFitness();
|
tmpPop.removeRedundantIndiesUsingFitness();
|
||||||
|
|
||||||
// Now fetch the n pareto-fronts
|
// Now fetch the n pareto-fronts
|
||||||
Population[] fronts = this.getNonDomiatedSortedFronts(tmpPop);
|
Population[] fronts = this.getNonDomiatedSortedFronts(tmpPop);
|
||||||
|
@ -63,7 +63,7 @@ public class ArchivingSPEAII extends AbstractArchiving implements java.io.Serial
|
|||||||
Population tmpPop = new Population();
|
Population tmpPop = new Population();
|
||||||
tmpPop.addPopulation((Population)pop.getClone());
|
tmpPop.addPopulation((Population)pop.getClone());
|
||||||
tmpPop.addPopulation((Population)pop.getArchive().getClone());
|
tmpPop.addPopulation((Population)pop.getArchive().getClone());
|
||||||
tmpPop.removeDoubleInstancesUsingFitness();
|
tmpPop.removeRedundantIndiesUsingFitness();
|
||||||
// double[][] d = this.showMay(tmpPop);
|
// double[][] d = this.showMay(tmpPop);
|
||||||
|
|
||||||
double[] RawFitness = this.calculateRawFitness(tmpPop);
|
double[] RawFitness = this.calculateRawFitness(tmpPop);
|
||||||
|
@ -84,10 +84,6 @@ public class GenericConstraint extends AbstractConstraint implements InterfaceDo
|
|||||||
return 0.;
|
return 0.;
|
||||||
}
|
}
|
||||||
|
|
||||||
// private double evalLinearConstr(AbstractEAIndividual indy) {
|
|
||||||
// // TODO Auto-generated method stub
|
|
||||||
// return null;
|
|
||||||
// }
|
|
||||||
public String getConstraintString() {
|
public String getConstraintString() {
|
||||||
return constraintString;
|
return constraintString;
|
||||||
}
|
}
|
||||||
|
@ -48,6 +48,9 @@ public class CrossoverESDefault implements InterfaceCrossover, java.io.Serializa
|
|||||||
}
|
}
|
||||||
//for (int i = 0; i < result.length; i++) System.out.println("Before Crossover: " +result[i].getSolutionRepresentationFor());
|
//for (int i = 0; i < result.length; i++) System.out.println("Before Crossover: " +result[i].getSolutionRepresentationFor());
|
||||||
|
|
||||||
|
if (partners==null || (partners.size()==0)) {
|
||||||
|
throw new RuntimeException("Error, empty partner population for crossover!");
|
||||||
|
}
|
||||||
if ((indy1 instanceof InterfaceESIndividual) && (partners.get(0) instanceof InterfaceESIndividual)) {
|
if ((indy1 instanceof InterfaceESIndividual) && (partners.get(0) instanceof InterfaceESIndividual)) {
|
||||||
int crossoverpoint = RNG.randomInt(0,((InterfaceESIndividual)indy1).getDGenotype().length-1);
|
int crossoverpoint = RNG.randomInt(0,((InterfaceESIndividual)indy1).getDGenotype().length-1);
|
||||||
boolean switcher = RNG.randomBoolean();
|
boolean switcher = RNG.randomBoolean();
|
||||||
@ -75,7 +78,7 @@ public class CrossoverESDefault implements InterfaceCrossover, java.io.Serializa
|
|||||||
// write the result back
|
// write the result back
|
||||||
for (int i = 0; i < result.length; i++) ((InterfaceESIndividual)result[i]).SetDGenotype(children[i]);
|
for (int i = 0; i < result.length; i++) ((InterfaceESIndividual)result[i]).SetDGenotype(children[i]);
|
||||||
}
|
}
|
||||||
//in case the crossover was successfull lets give the mutation operators a chance to mate the strategy parameters
|
//in case the crossover was successful lets give the mutation operators a chance to mate the strategy parameters
|
||||||
for (int i = 0; i < result.length; i++) result[i].getMutationOperator().crossoverOnStrategyParameters(indy1, partners);
|
for (int i = 0; i < result.length; i++) result[i].getMutationOperator().crossoverOnStrategyParameters(indy1, partners);
|
||||||
//for (int i = 0; i < result.length; i++) System.out.println("After Crossover: " +result[i].getSolutionRepresentationFor());
|
//for (int i = 0; i < result.length; i++) System.out.println("After Crossover: " +result[i].getSolutionRepresentationFor());
|
||||||
return result;
|
return result;
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
package eva2.server.go.operators.distancemetric;
|
package eva2.server.go.operators.distancemetric;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
import eva2.server.go.individuals.AbstractEAIndividual;
|
import eva2.server.go.individuals.AbstractEAIndividual;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -10,7 +12,7 @@ import eva2.server.go.individuals.AbstractEAIndividual;
|
|||||||
* @author mkron
|
* @author mkron
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public class EuclideanMetric implements InterfaceDistanceMetric {
|
public class EuclideanMetric implements InterfaceDistanceMetric, Serializable {
|
||||||
|
|
||||||
public Object clone() {
|
public Object clone() {
|
||||||
return (Object) new EuclideanMetric(this);
|
return (Object) new EuclideanMetric(this);
|
||||||
|
@ -24,7 +24,6 @@ public class IndividualDataMetric implements InterfaceDistanceMetric, Serializab
|
|||||||
}
|
}
|
||||||
|
|
||||||
public IndividualDataMetric(IndividualDataMetric pBestMetric) {
|
public IndividualDataMetric(IndividualDataMetric pBestMetric) {
|
||||||
// TODO Auto-generated constructor stub
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** This method allows you to make a deep clone of
|
/** This method allows you to make a deep clone of
|
||||||
|
@ -390,12 +390,12 @@ public class MOClusteringSeparation implements InterfaceMigration, java.io.Seria
|
|||||||
* @return The distance type to use.
|
* @return The distance type to use.
|
||||||
*/
|
*/
|
||||||
public boolean getReuseC() {
|
public boolean getReuseC() {
|
||||||
this.m_ReuseC = this.m_KMeans.m_ReuseC;
|
this.m_ReuseC = this.m_KMeans.getReuseC();
|
||||||
return this.m_ReuseC;
|
return this.m_ReuseC;
|
||||||
}
|
}
|
||||||
public void setReuseC(boolean m){
|
public void setReuseC(boolean m){
|
||||||
this.m_ReuseC = m;
|
this.m_ReuseC = m;
|
||||||
this.m_KMeans.m_ReuseC = this.m_ReuseC;
|
this.m_KMeans.setReuseC(this.m_ReuseC);
|
||||||
}
|
}
|
||||||
public String reuseCTipText() {
|
public String reuseCTipText() {
|
||||||
return "Toggel reuse of previously found cluster centroids.";
|
return "Toggel reuse of previously found cluster centroids.";
|
||||||
|
@ -108,7 +108,7 @@ public class MOSOMaxiMin implements InterfaceMOSOConverter, java.io.Serializable
|
|||||||
|
|
||||||
tmpFit = indy.getFitness();
|
tmpFit = indy.getFitness();
|
||||||
indy.putData("MOFitness", tmpFit);
|
indy.putData("MOFitness", tmpFit);
|
||||||
System.out.println("The MaxiMin MOSO can not be applied to single individuals! I default to random criterion.");
|
System.err.println("The MaxiMin MOSO can not be applied to single individuals! I default to random criterion.");
|
||||||
resultFit[0] = tmpFit[RNG.randomInt(0, tmpFit.length)];
|
resultFit[0] = tmpFit[RNG.randomInt(0, tmpFit.length)];
|
||||||
indy.SetFitness(resultFit);
|
indy.SetFitness(resultFit);
|
||||||
}
|
}
|
||||||
|
@ -2,6 +2,7 @@ package eva2.server.go.operators.mutation;
|
|||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
import eva2.server.go.enums.MutateESCrossoverTypeEnum;
|
||||||
import eva2.server.go.individuals.AbstractEAIndividual;
|
import eva2.server.go.individuals.AbstractEAIndividual;
|
||||||
import eva2.server.go.individuals.InterfaceESIndividual;
|
import eva2.server.go.individuals.InterfaceESIndividual;
|
||||||
import eva2.server.go.populations.Population;
|
import eva2.server.go.populations.Population;
|
||||||
@ -21,26 +22,35 @@ public class MutateESGlobal implements InterfaceMutation, java.io.Serializable {
|
|||||||
protected double m_MutationStepSize = 0.2;
|
protected double m_MutationStepSize = 0.2;
|
||||||
protected double m_Tau1 = 0.15;
|
protected double m_Tau1 = 0.15;
|
||||||
protected double m_LowerLimitStepSize = 0.0000005;
|
protected double m_LowerLimitStepSize = 0.0000005;
|
||||||
protected SelectedTag m_CrossoverType;
|
protected MutateESCrossoverTypeEnum m_CrossoverType = MutateESCrossoverTypeEnum.none;
|
||||||
|
|
||||||
public MutateESGlobal() {
|
public MutateESGlobal() {
|
||||||
initTags();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Use given mutation step size and no crossover on strategy params.
|
||||||
|
*
|
||||||
|
* @param mutationStepSize
|
||||||
|
*/
|
||||||
public MutateESGlobal(double mutationStepSize) {
|
public MutateESGlobal(double mutationStepSize) {
|
||||||
initTags();
|
this(mutationStepSize, MutateESCrossoverTypeEnum.none);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Use given mutation step size and given crossover type on strategy params.
|
||||||
|
*
|
||||||
|
* @param mutationStepSize
|
||||||
|
*/
|
||||||
|
public MutateESGlobal(double mutationStepSize, MutateESCrossoverTypeEnum coType) {
|
||||||
setMutationStepSize(mutationStepSize);
|
setMutationStepSize(mutationStepSize);
|
||||||
|
setCrossoverType(coType);
|
||||||
}
|
}
|
||||||
|
|
||||||
public MutateESGlobal(MutateESGlobal mutator) {
|
public MutateESGlobal(MutateESGlobal mutator) {
|
||||||
this.m_MutationStepSize = mutator.m_MutationStepSize;
|
this.m_MutationStepSize = mutator.m_MutationStepSize;
|
||||||
this.m_Tau1 = mutator.m_Tau1;
|
this.m_Tau1 = mutator.m_Tau1;
|
||||||
this.m_LowerLimitStepSize = mutator.m_LowerLimitStepSize;
|
this.m_LowerLimitStepSize = mutator.m_LowerLimitStepSize;
|
||||||
this.m_CrossoverType = (SelectedTag)mutator.m_CrossoverType.clone();
|
this.m_CrossoverType = mutator.m_CrossoverType;
|
||||||
}
|
|
||||||
|
|
||||||
protected void initTags() {
|
|
||||||
this.m_CrossoverType = new SelectedTag(new String[]{"None", "Intermediate", "Discrete"});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** This method will enable you to clone a given mutation operator
|
/** This method will enable you to clone a given mutation operator
|
||||||
@ -100,29 +110,29 @@ public class MutateESGlobal implements InterfaceMutation, java.io.Serializable {
|
|||||||
* @param partners The original partners
|
* @param partners The original partners
|
||||||
*/
|
*/
|
||||||
public void crossoverOnStrategyParameters(AbstractEAIndividual indy1, Population partners) {
|
public void crossoverOnStrategyParameters(AbstractEAIndividual indy1, Population partners) {
|
||||||
ArrayList<Double> tmpList = new ArrayList<Double>();
|
if (m_CrossoverType!=MutateESCrossoverTypeEnum.none) {
|
||||||
if (indy1.getMutationOperator() instanceof MutateESGlobal) tmpList.add(new Double(((MutateESGlobal)indy1.getMutationOperator()).m_MutationStepSize));
|
ArrayList<Double> tmpList = new ArrayList<Double>();
|
||||||
for (int i = 0; i < partners.size(); i++) {
|
if (indy1.getMutationOperator() instanceof MutateESGlobal) tmpList.add(new Double(((MutateESGlobal)indy1.getMutationOperator()).m_MutationStepSize));
|
||||||
if (((AbstractEAIndividual)partners.get(i)).getMutationOperator() instanceof MutateESGlobal) tmpList.add(new Double(((MutateESGlobal)((AbstractEAIndividual)partners.get(i)).getMutationOperator()).m_MutationStepSize));
|
for (int i = 0; i < partners.size(); i++) {
|
||||||
}
|
if (((AbstractEAIndividual)partners.get(i)).getMutationOperator() instanceof MutateESGlobal) tmpList.add(new Double(((MutateESGlobal)((AbstractEAIndividual)partners.get(i)).getMutationOperator()).m_MutationStepSize));
|
||||||
double[] list = new double[tmpList.size()];
|
}
|
||||||
for (int i = 0; i < tmpList.size(); i++) list[i] = ((Double)tmpList.get(i)).doubleValue();
|
double[] list = new double[tmpList.size()];
|
||||||
if (list.length <= 1) return;
|
for (int i = 0; i < tmpList.size(); i++) list[i] = ((Double)tmpList.get(i)).doubleValue();
|
||||||
switch (this.m_CrossoverType.getSelectedTag().getID()) {
|
if (list.length <= 1) return;
|
||||||
case 1 : {
|
|
||||||
this.m_MutationStepSize = 0;
|
switch (this.m_CrossoverType) {
|
||||||
for (int i = 0; i < list.length; i++) this.m_MutationStepSize += list[i];
|
case intermediate :
|
||||||
this.m_MutationStepSize = this.m_MutationStepSize/(double)list.length;
|
this.m_MutationStepSize = 0;
|
||||||
break;
|
for (int i = 0; i < list.length; i++) this.m_MutationStepSize += list[i];
|
||||||
}
|
this.m_MutationStepSize = this.m_MutationStepSize/(double)list.length;
|
||||||
case 2 : {
|
break;
|
||||||
this.m_MutationStepSize = list[RNG.randomInt(0, list.length-1)];
|
case discrete :
|
||||||
break;
|
this.m_MutationStepSize = list[RNG.randomInt(0, list.length-1)];
|
||||||
}
|
break;
|
||||||
default : {
|
case none : // do nothing
|
||||||
// do nothing
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** This method allows you to get a string representation of the mutation
|
/** This method allows you to get a string representation of the mutation
|
||||||
@ -195,10 +205,10 @@ public class MutateESGlobal implements InterfaceMutation, java.io.Serializable {
|
|||||||
/** Set the value for tau1 with this method.
|
/** Set the value for tau1 with this method.
|
||||||
* @param d The mutation operator.
|
* @param d The mutation operator.
|
||||||
*/
|
*/
|
||||||
public void setCrossoverType(SelectedTag d) {
|
public void setCrossoverType(MutateESCrossoverTypeEnum d) {
|
||||||
this.m_CrossoverType = d;
|
this.m_CrossoverType = d;
|
||||||
}
|
}
|
||||||
public SelectedTag getCrossoverType() {
|
public MutateESCrossoverTypeEnum getCrossoverType() {
|
||||||
return this.m_CrossoverType;
|
return this.m_CrossoverType;
|
||||||
}
|
}
|
||||||
public String crossoverTypeTipText() {
|
public String crossoverTypeTipText() {
|
||||||
|
@ -41,7 +41,8 @@ public class SelectBestIndividuals implements InterfaceSelection, java.io.Serial
|
|||||||
// nothing to prepare here
|
// nothing to prepare here
|
||||||
}
|
}
|
||||||
|
|
||||||
/** This method will select one Individual from the given
|
/**
|
||||||
|
* This method will select n best individuals from the given
|
||||||
* Population.
|
* Population.
|
||||||
* @param population The source population where to select from
|
* @param population The source population where to select from
|
||||||
* @param size The number of Individuals to select
|
* @param size The number of Individuals to select
|
||||||
|
@ -56,6 +56,7 @@ public class SelectBestSingle implements InterfaceSelection, java.io.Serializabl
|
|||||||
int currentCriteria = 0, critSize;
|
int currentCriteria = 0, critSize;
|
||||||
double currentBestValue;
|
double currentBestValue;
|
||||||
|
|
||||||
|
if (population.size()==0) return population; // trivial
|
||||||
critSize = ((AbstractEAIndividual)population.get(0)).getFitness().length;
|
critSize = ((AbstractEAIndividual)population.get(0)).getFitness().length;
|
||||||
result.setTargetSize(size);
|
result.setTargetSize(size);
|
||||||
if (this.m_ObeyDebsConstViolationPrinciple) {
|
if (this.m_ObeyDebsConstViolationPrinciple) {
|
||||||
@ -99,13 +100,21 @@ public class SelectBestSingle implements InterfaceSelection, java.io.Serializabl
|
|||||||
|
|
||||||
/** This method allows you to select >size< partners for a given Individual
|
/** This method allows you to select >size< partners for a given Individual
|
||||||
* @param dad The already selected parent
|
* @param dad The already selected parent
|
||||||
* @param avaiablePartners The mating pool.
|
* @param availablePartners The mating pool.
|
||||||
* @param size The number of partners needed.
|
* @param size The number of partners needed.
|
||||||
* @return The selected partners.
|
* @return The selected partners.
|
||||||
*/
|
*/
|
||||||
public Population findPartnerFor(AbstractEAIndividual dad, Population avaiablePartners, int size) {
|
public Population findPartnerFor(AbstractEAIndividual dad, Population availablePartners, int size) {
|
||||||
if (excludeSelfAsPartner) return this.selectFrom(avaiablePartners.filter(new Population().addToPop(dad)), size);
|
if (excludeSelfAsPartner) {
|
||||||
else return this.selectFrom(avaiablePartners, size);
|
Population newPartners = availablePartners.filter(new Population().addToPop(dad));
|
||||||
|
if (newPartners.size()==0) {
|
||||||
|
// no problem if crossover is deactivated
|
||||||
|
// EVAERROR.errorMsgOnce("Warning, no partners available when excluding self (SelectBestSingle.findPartnerFor)");
|
||||||
|
// EVAERROR.errorMsgOnce("Partners where: " + availablePartners.getStringRepresentation());
|
||||||
|
return newPartners;
|
||||||
|
}
|
||||||
|
return this.selectFrom(newPartners, size);
|
||||||
|
} else return this.selectFrom(availablePartners, size);
|
||||||
}
|
}
|
||||||
/**********************************************************************************************************************
|
/**********************************************************************************************************************
|
||||||
* These are for GUI
|
* These are for GUI
|
||||||
|
@ -73,6 +73,8 @@ public class HistoryConvergenceTerminator implements InterfaceTerminator, Serial
|
|||||||
msg = "History did not improve" + (convergenceThreshold>0 ? (" by more than " + convergenceThreshold) : "") + " for " + haltingWindowLen + " iterations.";
|
msg = "History did not improve" + (convergenceThreshold>0 ? (" by more than " + convergenceThreshold) : "") + " for " + haltingWindowLen + " iterations.";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
if (haltingWindowLen > ((Population)pop).getMaxHistLength()) System.err.println("Warning, population history length not long enough for window length " + haltingWindowLen + " (HistoryConvergenceTerminator)");
|
||||||
}
|
}
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
@ -2,8 +2,10 @@ package eva2.server.go.populations;
|
|||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
import java.util.Comparator;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.PriorityQueue;
|
import java.util.PriorityQueue;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
@ -22,6 +24,7 @@ import eva2.server.go.operators.postprocess.PostProcess;
|
|||||||
import eva2.server.go.operators.selection.probability.AbstractSelProb;
|
import eva2.server.go.operators.selection.probability.AbstractSelProb;
|
||||||
import eva2.tools.EVAERROR;
|
import eva2.tools.EVAERROR;
|
||||||
import eva2.tools.Pair;
|
import eva2.tools.Pair;
|
||||||
|
import eva2.tools.Serializer;
|
||||||
import eva2.tools.math.Mathematics;
|
import eva2.tools.math.Mathematics;
|
||||||
import eva2.tools.math.RNG;
|
import eva2.tools.math.RNG;
|
||||||
import eva2.tools.math.StatisticUtils;
|
import eva2.tools.math.StatisticUtils;
|
||||||
@ -58,9 +61,10 @@ public class Population extends ArrayList implements PopulationInterface, Clonea
|
|||||||
protected int notifyEvalInterval = 0;
|
protected int notifyEvalInterval = 0;
|
||||||
// additional data connected to the population
|
// additional data connected to the population
|
||||||
protected HashMap<String, Object> additionalPopData = null;
|
protected HashMap<String, Object> additionalPopData = null;
|
||||||
// historical best indidivuals may be traced
|
// historical best indidivuals may be traced for a given number of generations. Set to -1 to trace all, set to 0 to not trace at all
|
||||||
boolean useHistory = false;
|
int historyMaxLen = 0;
|
||||||
private transient ArrayList<AbstractEAIndividual> m_History = new ArrayList<AbstractEAIndividual>();
|
// boolean useHistory = false;
|
||||||
|
private transient LinkedList<AbstractEAIndividual> m_History = new LinkedList<AbstractEAIndividual>();
|
||||||
|
|
||||||
// remember when the last sorted queue was prepared
|
// remember when the last sorted queue was prepared
|
||||||
private int lastQModCount = -1;
|
private int lastQModCount = -1;
|
||||||
@ -78,7 +82,7 @@ public class Population extends ArrayList implements PopulationInterface, Clonea
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor setting initial capacity and population size to the given
|
* Constructor setting initial capacity and target population size to the given
|
||||||
* integer value.
|
* integer value.
|
||||||
*
|
*
|
||||||
* @param initialCapacity initial capacity and population size of the instance
|
* @param initialCapacity initial capacity and population size of the instance
|
||||||
@ -123,7 +127,7 @@ public class Population extends ArrayList implements PopulationInterface, Clonea
|
|||||||
public Population(InterfaceSolutionSet allSolutions) {
|
public Population(InterfaceSolutionSet allSolutions) {
|
||||||
this(allSolutions.getCurrentPopulation().size()+allSolutions.getSolutions().size());
|
this(allSolutions.getCurrentPopulation().size()+allSolutions.getSolutions().size());
|
||||||
if (TRACE) System.err.println("TRACING POP");
|
if (TRACE) System.err.println("TRACING POP");
|
||||||
addPopulation(allSolutions.getCurrentPopulation());
|
addPopulation(allSolutions.getCurrentPopulation(), false);
|
||||||
HashMap<Long, Integer> checkCols = new HashMap<Long, Integer>(size());
|
HashMap<Long, Integer> checkCols = new HashMap<Long, Integer>(size());
|
||||||
for (int i=0; i<size(); i++) {
|
for (int i=0; i<size(); i++) {
|
||||||
checkCols.put(getEAIndividual(i).getIndyID(), 1);
|
checkCols.put(getEAIndividual(i).getIndyID(), 1);
|
||||||
@ -139,9 +143,13 @@ public class Population extends ArrayList implements PopulationInterface, Clonea
|
|||||||
setInitMethod(getInitMethod());
|
setInitMethod(getInitMethod());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Make (shallow) copies of the given instance within the current instance.
|
||||||
|
* @param population
|
||||||
|
*/
|
||||||
public void copyHistAndArchive(Population population) {
|
public void copyHistAndArchive(Population population) {
|
||||||
if (population.m_Archive != null) this.m_Archive = (Population)population.m_Archive.clone();
|
if (population.m_Archive != null) this.m_Archive = (Population)population.m_Archive.clone();
|
||||||
if (population.m_History != null) this.m_History = (ArrayList<AbstractEAIndividual>)population.m_History.clone();
|
if (population.m_History != null) this.m_History = (LinkedList<AbstractEAIndividual>)population.m_History.clone();
|
||||||
if (population.additionalPopData!=null) {
|
if (population.additionalPopData!=null) {
|
||||||
this.additionalPopData = (HashMap<String, Object>)additionalPopData.clone();
|
this.additionalPopData = (HashMap<String, Object>)additionalPopData.clone();
|
||||||
if (population.additionalPopData.size()>0) {
|
if (population.additionalPopData.size()>0) {
|
||||||
@ -161,7 +169,7 @@ public class Population extends ArrayList implements PopulationInterface, Clonea
|
|||||||
this.m_Generation = population.m_Generation;
|
this.m_Generation = population.m_Generation;
|
||||||
this.m_FunctionCalls = population.m_FunctionCalls;
|
this.m_FunctionCalls = population.m_FunctionCalls;
|
||||||
this.m_TargetSize = population.m_TargetSize;
|
this.m_TargetSize = population.m_TargetSize;
|
||||||
this.useHistory = population.useHistory;
|
this.historyMaxLen = population.historyMaxLen;
|
||||||
this.notifyEvalInterval = population.notifyEvalInterval;
|
this.notifyEvalInterval = population.notifyEvalInterval;
|
||||||
this.initMethod = population.initMethod;
|
this.initMethod = population.initMethod;
|
||||||
this.aroundDist = population.aroundDist;
|
this.aroundDist = population.aroundDist;
|
||||||
@ -190,7 +198,7 @@ public class Population extends ArrayList implements PopulationInterface, Clonea
|
|||||||
if (this.m_Generation != opop.m_Generation) return false;
|
if (this.m_Generation != opop.m_Generation) return false;
|
||||||
if (this.m_FunctionCalls != opop.m_FunctionCalls) return false;
|
if (this.m_FunctionCalls != opop.m_FunctionCalls) return false;
|
||||||
if (this.m_TargetSize != opop.m_TargetSize) return false;
|
if (this.m_TargetSize != opop.m_TargetSize) return false;
|
||||||
if (this.useHistory != opop.useHistory) return false;
|
if (this.historyMaxLen != opop.historyMaxLen) return false;
|
||||||
if (this.notifyEvalInterval != opop.notifyEvalInterval) return false;
|
if (this.notifyEvalInterval != opop.notifyEvalInterval) return false;
|
||||||
if (this.initMethod != opop.initMethod) return false;
|
if (this.initMethod != opop.initMethod) return false;
|
||||||
if (this.aroundDist != opop.aroundDist) return false;
|
if (this.aroundDist != opop.aroundDist) return false;
|
||||||
@ -253,7 +261,7 @@ public class Population extends ArrayList implements PopulationInterface, Clonea
|
|||||||
* have been inited by a problem
|
* have been inited by a problem
|
||||||
*/
|
*/
|
||||||
public void init() {
|
public void init() {
|
||||||
this.m_History = new ArrayList<AbstractEAIndividual>();
|
this.m_History = new LinkedList<AbstractEAIndividual>();
|
||||||
this.m_Generation = 0;
|
this.m_Generation = 0;
|
||||||
this.m_FunctionCalls = 0;
|
this.m_FunctionCalls = 0;
|
||||||
// evaluationTimeHashes = null;
|
// evaluationTimeHashes = null;
|
||||||
@ -371,10 +379,19 @@ public class Population extends ArrayList implements PopulationInterface, Clonea
|
|||||||
* @param useHist
|
* @param useHist
|
||||||
*/
|
*/
|
||||||
public void setUseHistory(boolean useHist) {
|
public void setUseHistory(boolean useHist) {
|
||||||
useHistory = useHist;
|
if (useHist) setMaxHistoryLength(-1); // trace full history!
|
||||||
|
else setMaxHistoryLength(0); // dont trace at all!
|
||||||
// this.setUseHistory(useHist, (useHist ? (new AbstractEAIndividualComparator()) : null));
|
// this.setUseHistory(useHist, (useHist ? (new AbstractEAIndividualComparator()) : null));
|
||||||
}
|
}
|
||||||
|
public boolean isUsingHistory() {
|
||||||
|
return historyMaxLen!=0;
|
||||||
|
}
|
||||||
|
public void setMaxHistoryLength(int len) {
|
||||||
|
historyMaxLen = len;
|
||||||
|
}
|
||||||
|
public int getMaxHistLength() {
|
||||||
|
return historyMaxLen;
|
||||||
|
}
|
||||||
// /**
|
// /**
|
||||||
// * Activate or deactivate the history tracking, which stores the best individual in every
|
// * Activate or deactivate the history tracking, which stores the best individual in every
|
||||||
// * generation in the incrGeneration() method.
|
// * generation in the incrGeneration() method.
|
||||||
@ -388,15 +405,15 @@ public class Population extends ArrayList implements PopulationInterface, Clonea
|
|||||||
// }
|
// }
|
||||||
|
|
||||||
public int getHistoryLength() {
|
public int getHistoryLength() {
|
||||||
if (useHistory) return m_History.size();
|
if (historyMaxLen!=0) return m_History.size();
|
||||||
else return 0;
|
else return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ArrayList<AbstractEAIndividual> getHistory() {
|
public LinkedList<AbstractEAIndividual> getHistory() {
|
||||||
return m_History;
|
return m_History;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SetHistory(ArrayList<AbstractEAIndividual> theHist) {
|
public void SetHistory(LinkedList<AbstractEAIndividual> theHist) {
|
||||||
m_History = theHist;
|
m_History = theHist;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -485,8 +502,12 @@ public class Population extends ArrayList implements PopulationInterface, Clonea
|
|||||||
* Stagnation measured etc. pp.
|
* Stagnation measured etc. pp.
|
||||||
*/
|
*/
|
||||||
public void incrGeneration() {
|
public void incrGeneration() {
|
||||||
if (useHistory && (this.size() >= 1)) {
|
if (isUsingHistory() && (this.size() >= 1)) {
|
||||||
this.m_History.add((AbstractEAIndividual)this.getBestEAIndividual().clone());// TODO
|
if (historyMaxLen>0 && (m_History.size()>=historyMaxLen)) {
|
||||||
|
// oldest one must be replaced.. should be the one in front
|
||||||
|
m_History.removeFirst();
|
||||||
|
}
|
||||||
|
this.m_History.add((AbstractEAIndividual)this.getBestEAIndividual().clone());
|
||||||
}
|
}
|
||||||
for (int i=0; i<size(); i++) ((AbstractEAIndividual)get(i)).incrAge();
|
for (int i=0; i<size(); i++) ((AbstractEAIndividual)get(i)).incrAge();
|
||||||
this.m_Generation++;
|
this.m_Generation++;
|
||||||
@ -527,14 +548,32 @@ public class Population extends ArrayList implements PopulationInterface, Clonea
|
|||||||
|
|
||||||
/** This method allows you to add a complete population to the current population.
|
/** This method allows you to add a complete population to the current population.
|
||||||
* Note: After this operation the target population size may be exceeded.
|
* Note: After this operation the target population size may be exceeded.
|
||||||
|
* This method does not check for duplicate object pointers.
|
||||||
|
*
|
||||||
* @param pop The population that is to be added.
|
* @param pop The population that is to be added.
|
||||||
*/
|
*/
|
||||||
public Population addPopulation(Population pop) {
|
public Population addPopulation(Population pop) {
|
||||||
|
return this.addPopulation(pop, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method allows you to add a complete population to the current population.
|
||||||
|
* Note: After this operation the target population size may be exceeded.
|
||||||
|
* If indicated, this method checks for and avoids duplicate object pointers.
|
||||||
|
*
|
||||||
|
* @param pop The population that is to be added.
|
||||||
|
* @param avoidDuplicatePointers if true, duplicate object pointers are forbidden
|
||||||
|
*/
|
||||||
|
public Population addPopulation(Population pop, boolean avoidDuplicatePointers) {
|
||||||
if (pop != null) {
|
if (pop != null) {
|
||||||
for (int i = 0; i < pop.size(); i++) {
|
for (int i = 0; i < pop.size(); i++) {
|
||||||
AbstractEAIndividual indy = (AbstractEAIndividual)pop.get(i);
|
AbstractEAIndividual indy = (AbstractEAIndividual)pop.get(i);
|
||||||
if (indy != null) {
|
if (avoidDuplicatePointers && this.contains(indy)) {
|
||||||
this.add(indy);
|
System.err.println("Warning, duplicate indy avoided in Population.addPopulation! Index of " + this.indexOf(indy));
|
||||||
|
} else {
|
||||||
|
if (indy != null) {
|
||||||
|
this.add(indy);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1058,10 +1097,10 @@ public class Population extends ArrayList implements PopulationInterface, Clonea
|
|||||||
* Sort the population returning a new ArrayList.
|
* Sort the population returning a new ArrayList.
|
||||||
* The returned array should not be modified!
|
* The returned array should not be modified!
|
||||||
*
|
*
|
||||||
* @param comp A comparator by which sorting is performed
|
* @param comp A comparator by which sorting is performed - it should work on AbstractEAIndividual instances.
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
public ArrayList<AbstractEAIndividual> getSorted(AbstractEAIndividualComparator comp) {
|
public ArrayList<AbstractEAIndividual> getSorted(Comparator<Object> comp) {
|
||||||
if (super.size()==0) return new ArrayList<AbstractEAIndividual>();
|
if (super.size()==0) return new ArrayList<AbstractEAIndividual>();
|
||||||
PriorityQueue<AbstractEAIndividual> sQueue = new PriorityQueue<AbstractEAIndividual>(super.size(), comp);
|
PriorityQueue<AbstractEAIndividual> sQueue = new PriorityQueue<AbstractEAIndividual>(super.size(), comp);
|
||||||
for (int i = 0; i < super.size(); i++) {
|
for (int i = 0; i < super.size(); i++) {
|
||||||
@ -1206,7 +1245,7 @@ public class Population extends ArrayList implements PopulationInterface, Clonea
|
|||||||
* This method relies on the implementation of the equals method
|
* This method relies on the implementation of the equals method
|
||||||
* in the individuals.
|
* in the individuals.
|
||||||
*/
|
*/
|
||||||
public void removeDoubleInstances() {
|
public void removeRedundantIndies() {
|
||||||
for (int i = 0; i < this.size(); i++) {
|
for (int i = 0; i < this.size(); i++) {
|
||||||
for (int j = i+1; j < this.size(); j++) {
|
for (int j = i+1; j < this.size(); j++) {
|
||||||
if (((AbstractEAIndividual)this.get(i)).equals(this.get(j))) {
|
if (((AbstractEAIndividual)this.get(i)).equals(this.get(j))) {
|
||||||
@ -1217,9 +1256,34 @@ public class Population extends ArrayList implements PopulationInterface, Clonea
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Population removeRedundantIndiesAsNew() {
|
||||||
|
Population pop = this.cloneShallowInds();
|
||||||
|
pop.removeRedundantIndies();
|
||||||
|
return pop;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Return the number of individuals within this instance that are
|
||||||
|
* seen as being equal by the equals relation of the individual.
|
||||||
|
*
|
||||||
|
* @return the number of equal individuals
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public int getRedundancyCount() {
|
||||||
|
int redund = 0;
|
||||||
|
for (int i=0; i<size()-1; i++) {
|
||||||
|
for (int j=i+1; j<size(); j++) {
|
||||||
|
if (getEAIndividual(i).equals(getEAIndividual(j))) {
|
||||||
|
redund++;
|
||||||
|
break; // jump because the i-th is redundant and we dont want to count all redundant pairs
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return redund;
|
||||||
|
}
|
||||||
|
|
||||||
/** This method will remove instances with equal fitness from the population.
|
/** This method will remove instances with equal fitness from the population.
|
||||||
*/
|
*/
|
||||||
public void removeDoubleInstancesUsingFitness() {
|
public void removeRedundantIndiesUsingFitness() {
|
||||||
for (int i = 0; i < this.size(); i++) {
|
for (int i = 0; i < this.size(); i++) {
|
||||||
for (int j = i+1; j < this.size(); j++) {
|
for (int j = i+1; j < this.size(); j++) {
|
||||||
if (((AbstractEAIndividual)this.get(i)).equalFitness((AbstractEAIndividual)this.get(j))) {
|
if (((AbstractEAIndividual)this.get(i)).equalFitness((AbstractEAIndividual)this.get(j))) {
|
||||||
@ -1477,9 +1541,17 @@ public class Population extends ArrayList implements PopulationInterface, Clonea
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void removeMembers(Population tmpPop, boolean errorOnMissing) {
|
/**
|
||||||
for (int i=0; i<tmpPop.size(); i++) {
|
* Remove a set of individuals from the instance. If indicated by the errorOnMissing-flag
|
||||||
if (!removeMember(tmpPop.getEAIndividual(i))) {
|
* a RuntimeException is thrown as soon as one individual to be removed is not contained
|
||||||
|
* in the instance. Otherwise, this is ignored.
|
||||||
|
*
|
||||||
|
* @param tmpPop
|
||||||
|
* @param errorOnMissing
|
||||||
|
*/
|
||||||
|
public void removeMembers(Population popToRemove, boolean errorOnMissing) {
|
||||||
|
for (int i=0; i<popToRemove.size(); i++) {
|
||||||
|
if (!removeMember(popToRemove.getEAIndividual(i))) {
|
||||||
if (errorOnMissing) throw new RuntimeException("Error, member to be removed was missing (Population.removeMembers)!");
|
if (errorOnMissing) throw new RuntimeException("Error, member to be removed was missing (Population.removeMembers)!");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1584,6 +1656,42 @@ public class Population extends ArrayList implements PopulationInterface, Clonea
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the minimal, maximal, average, median, and variance of correlations between any two solutions.
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public double[] getCorrelations() {
|
||||||
|
return Population.getCorrelations(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the minimal, maximal, average, median, and variance of correlations between any two solutions.
|
||||||
|
*
|
||||||
|
* @param pop the population instance to look at
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static double[] getCorrelations(Population pop) {
|
||||||
|
double[] cors = new double[pop.size()*(pop.size()-1)/2];
|
||||||
|
|
||||||
|
if (pop.size()<2) {
|
||||||
|
return new double[]{1.,1.,1.,1.};
|
||||||
|
}
|
||||||
|
int index=0;
|
||||||
|
double corsSum=0, minCor = 10., maxCor=-10.;
|
||||||
|
for (int i = 0; i < pop.size()-1; i++) {
|
||||||
|
for (int j = i+1; j < pop.size(); j++) {
|
||||||
|
double cor = StatisticUtils.correlation(pop.getEAIndividual(i).getDoublePosition(), pop.getEAIndividual(j).getDoublePosition());
|
||||||
|
cors[index++] = cor;
|
||||||
|
corsSum += cor;
|
||||||
|
if (cor>maxCor) maxCor=cor;
|
||||||
|
if (cor<minCor) minCor=cor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
double var = StatisticUtils.variance(cors, true);
|
||||||
|
double[] res = new double[] {minCor, maxCor, corsSum/cors.length, Mathematics.median(cors, false), var};
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the average, minimal and maximal individual fitness and std dev. for the population in the given criterion.
|
* Returns the average, minimal and maximal individual fitness and std dev. for the population in the given criterion.
|
||||||
*
|
*
|
||||||
@ -1673,11 +1781,13 @@ public class Population extends ArrayList implements PopulationInterface, Clonea
|
|||||||
double dist = -1.;
|
double dist = -1.;
|
||||||
int sel=-1;
|
int sel=-1;
|
||||||
for (int i = 0; i < pop.size(); i++) {
|
for (int i = 0; i < pop.size(); i++) {
|
||||||
double curDist = metric.distance(refIndy, pop.getEAIndividual(i));
|
if (pop.getEAIndividual(i)!=null) {
|
||||||
if ((dist<0) || (!closestOrFarthest && (dist < curDist))
|
double curDist = metric.distance(refIndy, pop.getEAIndividual(i));
|
||||||
|| (closestOrFarthest && (dist > curDist))) {
|
if ((dist<0) || (!closestOrFarthest && (dist < curDist))
|
||||||
dist = curDist;
|
|| (closestOrFarthest && (dist > curDist))) {
|
||||||
sel = i;
|
dist = curDist;
|
||||||
|
sel = i;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return new Pair<Integer,Double>(sel,dist);
|
return new Pair<Integer,Double>(sel,dist);
|
||||||
@ -1693,7 +1803,14 @@ public class Population extends ArrayList implements PopulationInterface, Clonea
|
|||||||
*/
|
*/
|
||||||
public boolean isWithinPopDist(AbstractEAIndividual indy, double d, InterfaceDistanceMetric metric) {
|
public boolean isWithinPopDist(AbstractEAIndividual indy, double d, InterfaceDistanceMetric metric) {
|
||||||
Pair<Integer,Double> closest = Population.getClosestFarthestIndy(indy, this, metric, true);
|
Pair<Integer,Double> closest = Population.getClosestFarthestIndy(indy, this, metric, true);
|
||||||
return (closest.tail()<=d);
|
if (closest.tail()<=d) {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
// if (size()==1) {
|
||||||
|
// System.out.println("dist is " + metric.distance(getEAIndividual(0), indy));
|
||||||
|
// }
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -1711,13 +1828,29 @@ public class Population extends ArrayList implements PopulationInterface, Clonea
|
|||||||
return centerPos;
|
return centerPos;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return an individual which is located at the center of the population.
|
||||||
|
* The fitness will be invalid.
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public IndividualInterface getCenterIndy() {
|
||||||
|
AbstractEAIndividual indy = (AbstractEAIndividual)getEAIndividual(0).clone();
|
||||||
|
double[] center = getCenter();
|
||||||
|
indy.setDoublePosition(indy, center);
|
||||||
|
indy.SetFitness(null);
|
||||||
|
return indy;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Calculate the weighted center position of the population. Weights must add up to one!
|
* Calculate the weighted center position of the population. Weights must add up to one!
|
||||||
*
|
*
|
||||||
* @return the average position of the population
|
* @return the average position of the population
|
||||||
*/
|
*/
|
||||||
public double[] getCenterWeighted(double[] weights) {
|
public double[] getCenterWeighted(double[] weights) {
|
||||||
if (size()==0 || (weights.length > size())) EVAERROR.errorMsgOnce("Invalid pop size in DistractingPopulation:getCenterWeighted!");
|
if (size()==0 || (weights.length > size()) || (weights.length==0)) {
|
||||||
|
EVAERROR.errorMsgOnce("Invalid pop size in DistractingPopulation:getCenterWeighted!");
|
||||||
|
}
|
||||||
double[] centerPos = AbstractEAIndividual.getDoublePosition(getEAIndividual(0));
|
double[] centerPos = AbstractEAIndividual.getDoublePosition(getEAIndividual(0));
|
||||||
Mathematics.svMult(weights[0], centerPos, centerPos);
|
Mathematics.svMult(weights[0], centerPos, centerPos);
|
||||||
for (int i=1; i<weights.length; i++) {
|
for (int i=1; i<weights.length; i++) {
|
||||||
@ -2005,6 +2138,56 @@ public class Population extends ArrayList implements PopulationInterface, Clonea
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return true if the current instance is a subset of the given population, otherwise false.
|
||||||
|
*
|
||||||
|
* @param offspring
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public boolean isSubSet(Population set) {
|
||||||
|
Population filtered = this.filter(set); // if this is a subset of s, filtered must be empty.
|
||||||
|
return (filtered.size()==0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the set of individuals which are members of both this and the other population.
|
||||||
|
* Uses the individuals equals predicate.
|
||||||
|
*
|
||||||
|
* @param other
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public Population setCut(Population other) {
|
||||||
|
Population cut = new Population();
|
||||||
|
for (int i=0; i<size(); i++) {
|
||||||
|
if (other.indexOf(getEAIndividual(i))>=0) cut.add(getEAIndividual(i));
|
||||||
|
}
|
||||||
|
return cut;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Copy all additional population data of the given instance
|
||||||
|
* into the current instance (by references only).
|
||||||
|
*
|
||||||
|
* @param pop
|
||||||
|
*/
|
||||||
|
public void copyHashData(Population pop) {
|
||||||
|
if (pop!=null && (pop.additionalPopData!=null)) {
|
||||||
|
for (String key : pop.additionalPopData.keySet()) {
|
||||||
|
Object origData = pop.getData(key);
|
||||||
|
Object maybeClone = Serializer.deepClone(origData);
|
||||||
|
if (maybeClone!=null) putData(key, maybeClone);
|
||||||
|
else {
|
||||||
|
System.err.println("Warning, additional pop data could not be cloned!");
|
||||||
|
putData(key, origData);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void clearHistory() {
|
||||||
|
m_History.clear();
|
||||||
|
}
|
||||||
|
|
||||||
// /**
|
// /**
|
||||||
// * Mark the population at the current state as evaluated. Changes to the modCount or hashes of individuals
|
// * Mark the population at the current state as evaluated. Changes to the modCount or hashes of individuals
|
||||||
// * will invalidate the mark.
|
// * will invalidate the mark.
|
||||||
|
@ -240,7 +240,7 @@ implements InterfaceOptimizationProblem /*, InterfaceParamControllable*/, Serial
|
|||||||
* @return String
|
* @return String
|
||||||
*/
|
*/
|
||||||
public String[] getAdditionalFileStringHeader(PopulationInterface pop) {
|
public String[] getAdditionalFileStringHeader(PopulationInterface pop) {
|
||||||
if (this instanceof InterfaceInterestingHistogram) return new String[]{"Solution","Histogram(c0)","Score"};
|
if (this instanceof InterfaceInterestingHistogram) return new String[]{"Solution","Histogram","Score"};
|
||||||
else return new String[]{"Solution"};
|
else return new String[]{"Solution"};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -494,7 +494,7 @@ public abstract class AbstractProblemDouble extends AbstractOptimizationProblem
|
|||||||
@Override
|
@Override
|
||||||
public String[] getAdditionalFileStringHeader(PopulationInterface pop) {
|
public String[] getAdditionalFileStringHeader(PopulationInterface pop) {
|
||||||
String[] superHeader = super.getAdditionalFileStringHeader(pop);
|
String[] superHeader = super.getAdditionalFileStringHeader(pop);
|
||||||
if (isWithConstraints()) return ToolBox.appendArrays(superHeader, new String[]{"RawFit.","Num.Viol.","Sum.Viol."});
|
if (isWithConstraints()) return ToolBox.appendArrays(superHeader, new String[]{"rawFit","numViol","sumViol"});
|
||||||
else return superHeader;
|
else return superHeader;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,6 +2,8 @@ package eva2.server.go.strategies;
|
|||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.List;
|
||||||
import java.util.PriorityQueue;
|
import java.util.PriorityQueue;
|
||||||
|
|
||||||
import eva2.gui.BeanInspector;
|
import eva2.gui.BeanInspector;
|
||||||
@ -17,7 +19,6 @@ import eva2.server.go.individuals.InterfaceDataTypeDouble;
|
|||||||
import eva2.server.go.operators.cluster.ClusteringDensityBased;
|
import eva2.server.go.operators.cluster.ClusteringDensityBased;
|
||||||
import eva2.server.go.operators.cluster.InterfaceClustering;
|
import eva2.server.go.operators.cluster.InterfaceClustering;
|
||||||
import eva2.server.go.operators.distancemetric.ObjectiveSpaceMetric;
|
import eva2.server.go.operators.distancemetric.ObjectiveSpaceMetric;
|
||||||
//import eva2.server.go.populations.Distraction;
|
|
||||||
import eva2.server.go.populations.Population;
|
import eva2.server.go.populations.Population;
|
||||||
import eva2.server.go.populations.SolutionSet;
|
import eva2.server.go.populations.SolutionSet;
|
||||||
import eva2.server.go.problems.B1Problem;
|
import eva2.server.go.problems.B1Problem;
|
||||||
@ -327,7 +328,7 @@ public class ClusterBasedNichingEA implements InterfacePopulationChangedEventLis
|
|||||||
* @return True if converged.
|
* @return True if converged.
|
||||||
*/
|
*/
|
||||||
private boolean testSpeciesForConvergence(Population pop) {
|
private boolean testSpeciesForConvergence(Population pop) {
|
||||||
ArrayList<AbstractEAIndividual> speciesHistory = pop.getHistory();
|
List<AbstractEAIndividual> speciesHistory = pop.getHistory();
|
||||||
int histLen = speciesHistory.size();
|
int histLen = speciesHistory.size();
|
||||||
|
|
||||||
if (histLen <= haltingWindow) {
|
if (histLen <= haltingWindow) {
|
||||||
@ -780,10 +781,10 @@ public class ClusterBasedNichingEA implements InterfacePopulationChangedEventLis
|
|||||||
newSp.setUseHistory(true);
|
newSp.setUseHistory(true);
|
||||||
if (startAtP1Gen) { // start explicitely as a child population of p1
|
if (startAtP1Gen) { // start explicitely as a child population of p1
|
||||||
newSp.setGenerationTo(parentSp.getGeneration());
|
newSp.setGenerationTo(parentSp.getGeneration());
|
||||||
newSp.SetHistory((ArrayList<AbstractEAIndividual>) parentSp.getHistory().clone());
|
newSp.SetHistory((LinkedList<AbstractEAIndividual>) parentSp.getHistory().clone());
|
||||||
} else { // start anew (from undiff)
|
} else { // start anew (from undiff)
|
||||||
newSp.setGenerationTo(0);
|
newSp.setGenerationTo(0);
|
||||||
newSp.SetHistory(new ArrayList<AbstractEAIndividual>());
|
newSp.SetHistory(new LinkedList<AbstractEAIndividual>());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_Optimizer instanceof InterfaceSpeciesAware) ((InterfaceSpeciesAware)m_Optimizer).splitFromFirst(parentSp, newSp);
|
if (m_Optimizer instanceof InterfaceSpeciesAware) ((InterfaceSpeciesAware)m_Optimizer).splitFromFirst(parentSp, newSp);
|
||||||
|
@ -310,7 +310,7 @@ public class Processor extends Thread implements InterfaceProcessor, InterfacePo
|
|||||||
else if (terminator instanceof EvaluationTerminator)
|
else if (terminator instanceof EvaluationTerminator)
|
||||||
args = new Object[] {optimizer, optimizer.getPopulation(), optimizer.getPopulation().getFunctionCalls(), ((EvaluationTerminator)terminator).getFitnessCalls()};
|
args = new Object[] {optimizer, optimizer.getPopulation(), optimizer.getPopulation().getFunctionCalls(), ((EvaluationTerminator)terminator).getFitnessCalls()};
|
||||||
// ((InterfaceParameterControl)paramCtrl).updateParameters(optimizer, optimizer.getPopulation().getFunctionCalls(), ((EvaluationTerminator)terminator).getFitnessCalls());
|
// ((InterfaceParameterControl)paramCtrl).updateParameters(optimizer, optimizer.getPopulation().getFunctionCalls(), ((EvaluationTerminator)terminator).getFitnessCalls());
|
||||||
else args = null;//new Object[]{optimizer, optimizer.getPopulation()};
|
else args = new Object[]{optimizer, optimizer.getPopulation()};
|
||||||
// ((InterfaceParameterControl)paramCtrl).updateParameters(optimizer);
|
// ((InterfaceParameterControl)paramCtrl).updateParameters(optimizer);
|
||||||
|
|
||||||
if (args != null) { // only if iteration counting is available
|
if (args != null) { // only if iteration counting is available
|
||||||
|
@ -305,6 +305,9 @@ public abstract class AbstractStatistics implements InterfaceTextListener, Inter
|
|||||||
} else {
|
} else {
|
||||||
if (printRunStoppedVerbosity()) printToTextListener(" NO feasible individual found.\n");
|
if (printRunStoppedVerbosity()) printToTextListener(" NO feasible individual found.\n");
|
||||||
}
|
}
|
||||||
|
if (printRunStoppedVerbosity()) {
|
||||||
|
printToTextListener(" Solution correlations (min,max,avg,med,var): " + BeanInspector.toString(((Population)lastSols).getCorrelations((Population)lastSols)) + "\n");
|
||||||
|
}
|
||||||
if (bestOfRunFeasibleIndy != null) {
|
if (bestOfRunFeasibleIndy != null) {
|
||||||
runBestFeasibleList.add(bestOfRunFeasibleIndy);
|
runBestFeasibleList.add(bestOfRunFeasibleIndy);
|
||||||
// if (meanBestFeasibleFit==null) {
|
// if (meanBestFeasibleFit==null) {
|
||||||
@ -666,8 +669,8 @@ public abstract class AbstractStatistics implements InterfaceTextListener, Inter
|
|||||||
case meanFit: ret[i] = (currentMeanFit==null) ? Double.NaN : currentMeanFit[defaultFitCriterion]; break;
|
case meanFit: ret[i] = (currentMeanFit==null) ? Double.NaN : currentMeanFit[defaultFitCriterion]; break;
|
||||||
case currentWorst: ret[i] = (currentWorstFit==null) ? Double.NaN : currentWorstFit[defaultFitCriterion]; break;
|
case currentWorst: ret[i] = (currentWorstFit==null) ? Double.NaN : currentWorstFit[defaultFitCriterion]; break;
|
||||||
case runBest: ret[i] = bestOfRunIndy.getFitness()[defaultFitCriterion]; break;
|
case runBest: ret[i] = bestOfRunIndy.getFitness()[defaultFitCriterion]; break;
|
||||||
case currentBestFeasible: ret[i] = currentBestFeasibleFit[defaultFitCriterion]; break;
|
case currentBestFeasible: ret[i] = (currentBestFeasibleFit==null) ? Double.NaN : currentBestFeasibleFit[defaultFitCriterion]; break;
|
||||||
case runBestFeasible: ret[i] = bestOfRunFeasibleIndy.getFitness()[defaultFitCriterion]; break;
|
case runBestFeasible: ret[i] = (bestOfRunFeasibleIndy==null) ? Double.NaN : bestOfRunFeasibleIndy.getFitness()[defaultFitCriterion]; break;
|
||||||
case avgPopDistance: ret[i] = currentAvgPopDist; break;
|
case avgPopDistance: ret[i] = currentAvgPopDist; break;
|
||||||
case maxPopDistance: ret[i] = currentMaxPopDist; break;
|
case maxPopDistance: ret[i] = currentMaxPopDist; break;
|
||||||
}
|
}
|
||||||
|
@ -241,7 +241,10 @@ public class StatisticsWithGUI extends AbstractStatistics implements Serializabl
|
|||||||
if (lastIsShowFull) colIndex = 1+graphDesc.get(i).tail;
|
if (lastIsShowFull) colIndex = 1+graphDesc.get(i).tail;
|
||||||
// plot the column as indicated by the graph description
|
// plot the column as indicated by the graph description
|
||||||
if (currentStatDoubleData[colIndex]!=null) plotFitnessPoint(0, subGraph++, functionCalls, currentStatDoubleData[colIndex]);
|
if (currentStatDoubleData[colIndex]!=null) plotFitnessPoint(0, subGraph++, functionCalls, currentStatDoubleData[colIndex]);
|
||||||
else EVAERROR.errorMsgOnce("Error, data field " + graphDesc.get(i).head + " does not contain primitive data and cannot be plotted.");
|
else {
|
||||||
|
EVAERROR.errorMsgOnce("Error, data field " + graphDesc.get(i).head + " does not contain primitive data and cannot be plotted.");
|
||||||
|
subGraph++; // increase index anyways or the name assignment gets inconsistent
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// }
|
// }
|
||||||
}
|
}
|
||||||
|
@ -12,6 +12,8 @@ package eva2.tools;
|
|||||||
/*==========================================================================*
|
/*==========================================================================*
|
||||||
* IMPORTS
|
* IMPORTS
|
||||||
*==========================================================================*/
|
*==========================================================================*/
|
||||||
|
import java.io.ByteArrayInputStream;
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileInputStream;
|
import java.io.FileInputStream;
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
@ -68,6 +70,35 @@ public class Serializer {
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a copy of the object, or null if the object cannot
|
||||||
|
* be serialized.
|
||||||
|
*/
|
||||||
|
public static Object deepClone(Object orig) {
|
||||||
|
Object obj = null;
|
||||||
|
try {
|
||||||
|
// Write the object out to a byte array
|
||||||
|
ByteArrayOutputStream bos = new ByteArrayOutputStream();
|
||||||
|
ObjectOutputStream out = new ObjectOutputStream(bos);
|
||||||
|
out.writeObject(orig);
|
||||||
|
out.flush();
|
||||||
|
out.close();
|
||||||
|
|
||||||
|
// Make an input stream from the byte array and read
|
||||||
|
// a copy of the object back in.
|
||||||
|
ObjectInputStream in = new ObjectInputStream(
|
||||||
|
new ByteArrayInputStream(bos.toByteArray()));
|
||||||
|
obj = in.readObject();
|
||||||
|
}
|
||||||
|
catch(IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
catch(ClassNotFoundException cnfe) {
|
||||||
|
cnfe.printStackTrace();
|
||||||
|
}
|
||||||
|
return obj;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Use object serialization to make a "deep clone" of the object o.
|
* Use object serialization to make a "deep clone" of the object o.
|
||||||
@ -77,35 +108,35 @@ public class Serializer {
|
|||||||
* usually implemented to produce a "shallow" clone that copies references
|
* usually implemented to produce a "shallow" clone that copies references
|
||||||
* to other objects, instead of copying all referenced objects.
|
* to other objects, instead of copying all referenced objects.
|
||||||
**/
|
**/
|
||||||
static public Object deepclone(final Serializable o) throws IOException, ClassNotFoundException {
|
// static public Object deepclone(final Serializable o) throws IOException, ClassNotFoundException {
|
||||||
// Create a connected pair of "piped" streams.
|
// // Create a connected pair of "piped" streams.
|
||||||
// We'll write bytes to one, and them from the other one.
|
// // We'll write bytes to one, and them from the other one.
|
||||||
final PipedOutputStream pipeout = new PipedOutputStream();
|
// final PipedOutputStream pipeout = new PipedOutputStream();
|
||||||
PipedInputStream pipein = new PipedInputStream(pipeout);
|
// PipedInputStream pipein = new PipedInputStream(pipeout);
|
||||||
// Now define an independent thread to serialize the object and write
|
// // Now define an independent thread to serialize the object and write
|
||||||
// its bytes to the PipedOutputStream
|
// // its bytes to the PipedOutputStream
|
||||||
Thread writer = new Thread() {
|
// Thread writer = new Thread() {
|
||||||
public void run() {
|
// public void run() {
|
||||||
ObjectOutputStream out = null;
|
// ObjectOutputStream out = null;
|
||||||
try {
|
// try {
|
||||||
out = new ObjectOutputStream(pipeout);
|
// out = new ObjectOutputStream(pipeout);
|
||||||
out.writeObject(o); }
|
// out.writeObject(o); }
|
||||||
catch(IOException e) {
|
// catch(IOException e) {
|
||||||
System.out.println("ERROR in Serialization1"+ e.getMessage());
|
// System.out.println("ERROR in Serialization1"+ e.getMessage());
|
||||||
}
|
// }
|
||||||
finally {
|
// finally {
|
||||||
try { out.close(); } catch (Exception e) {
|
// try { out.close(); } catch (Exception e) {
|
||||||
System.out.println("ERROR in Serialization2"+ e.getMessage());
|
// System.out.println("ERROR in Serialization2"+ e.getMessage());
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
};
|
// };
|
||||||
writer.start();
|
// writer.start();
|
||||||
// Meanwhile, in this thread, read and deserialize from the piped
|
// // Meanwhile, in this thread, read and deserialize from the piped
|
||||||
// input stream. The resulting object is a deep clone of the original.
|
// // input stream. The resulting object is a deep clone of the original.
|
||||||
ObjectInputStream in = new ObjectInputStream(pipein);
|
// ObjectInputStream in = new ObjectInputStream(pipein);
|
||||||
return in.readObject();
|
// return in.readObject();
|
||||||
}
|
// }
|
||||||
/**
|
/**
|
||||||
* This is a simple serializable data structure that we use below for
|
* This is a simple serializable data structure that we use below for
|
||||||
* testing the methods above
|
* testing the methods above
|
||||||
@ -123,8 +154,6 @@ public class Serializer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** This class defines a main() method for testing */
|
|
||||||
public static class Test {
|
|
||||||
public static void main(String[] args) throws IOException, ClassNotFoundException {
|
public static void main(String[] args) throws IOException, ClassNotFoundException {
|
||||||
// Create a simple object graph
|
// Create a simple object graph
|
||||||
DataStructure ds = new DataStructure();
|
DataStructure ds = new DataStructure();
|
||||||
@ -144,11 +173,11 @@ public class Serializer {
|
|||||||
System.out.println("Read from the file: " + ds);
|
System.out.println("Read from the file: " + ds);
|
||||||
// Create a deep clone and display that. After making the copy
|
// Create a deep clone and display that. After making the copy
|
||||||
// modify the original to prove that the clone is "deep".
|
// modify the original to prove that the clone is "deep".
|
||||||
DataStructure ds2 = (DataStructure) Serializer.deepclone(ds);
|
DataStructure ds2 = (DataStructure) Serializer.deepClone(ds);
|
||||||
ds.other.message = null; ds.other.data = null; // Change original
|
ds.other.message = null; ds.other.data = null; // Change original
|
||||||
System.out.println("Deep clone: " + ds2);
|
System.out.println("Deep clone: " + ds2);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
/**
|
/**
|
||||||
* Serialize the string s and
|
* Serialize the string s and
|
||||||
* store its serialized state in File with name Filename.
|
* store its serialized state in File with name Filename.
|
||||||
|
@ -485,7 +485,7 @@ public class Mathematics {
|
|||||||
* @return the median
|
* @return the median
|
||||||
*/
|
*/
|
||||||
public static double[] median(List<double[]> dblArrList, boolean interpolate) {
|
public static double[] median(List<double[]> dblArrList, boolean interpolate) {
|
||||||
java.util.Collections.sort(dblArrList, new DoubleArrayComparator());
|
java.util.Collections.sort(dblArrList, new DoubleArrayComparator()); // by default, the comparator uses pareto dominance
|
||||||
|
|
||||||
int len = dblArrList.size();
|
int len = dblArrList.size();
|
||||||
if (len % 2 != 0) return dblArrList.get((len-1) / 2);
|
if (len % 2 != 0) return dblArrList.get((len-1) / 2);
|
||||||
@ -1081,6 +1081,21 @@ public class Mathematics {
|
|||||||
vvAddOffs(v1, 0, v2, 0, res, 0, v1.length);
|
vvAddOffs(v1, 0, v2, 0, res, 0, v1.length);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calculate r=1/2 * sqrt(sum(sqr(upperBound_i - lowerBound_i))).
|
||||||
|
*
|
||||||
|
* @param range
|
||||||
|
* @return the average length of the range intervals
|
||||||
|
*/
|
||||||
|
public static double getAvgRangeL2(double[][] range) {
|
||||||
|
double sum = 0.;
|
||||||
|
for (int i=0; i<range.length; i++) {
|
||||||
|
double d=(range[i][1]-range[i][0]);
|
||||||
|
sum+=(d*d);
|
||||||
|
}
|
||||||
|
return Math.sqrt(sum)/2.;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add vectors in place setting with an offset within the target
|
* Add vectors in place setting with an offset within the target
|
||||||
* vector, meaning that res[resOffs+i]=v1[v1Offs+i]+v2[v2Offs+i] for i in length.
|
* vector, meaning that res[resOffs+i]=v1[v1Offs+i]+v2[v2Offs+i] for i in length.
|
||||||
@ -1159,4 +1174,17 @@ public class Mathematics {
|
|||||||
Arrays.fill(result, 0, result.length-1, 0.);
|
Arrays.fill(result, 0, result.length-1, 0.);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a double vector of length dim filled with value d.
|
||||||
|
*
|
||||||
|
* @param d
|
||||||
|
* @param dim
|
||||||
|
* @return a double vector of length dim filled with value d
|
||||||
|
*/
|
||||||
|
public static double[] makeVector(double d, int dim) {
|
||||||
|
double[] ret = new double[dim];
|
||||||
|
Arrays.fill(ret, d);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -17,6 +17,8 @@ package eva2.tools.math;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
|
||||||
|
import eva2.gui.BeanInspector;
|
||||||
|
import eva2.server.go.problems.AbstractProblemDouble;
|
||||||
import eva2.tools.math.Jama.Matrix;
|
import eva2.tools.math.Jama.Matrix;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -38,10 +40,12 @@ public class StatisticUtils
|
|||||||
* @param n the length of two double vectors
|
* @param n the length of two double vectors
|
||||||
* @return the correlation coefficient
|
* @return the correlation coefficient
|
||||||
*/
|
*/
|
||||||
public final static double correlation(double y1[],double y2[],int n) {
|
public final static double correlation(double y1[],double y2[]) {
|
||||||
|
|
||||||
int i;
|
int i;
|
||||||
double av1 = 0.0, av2 = 0.0, y11 = 0.0, y22 = 0.0, y12 = 0.0, c;
|
double av1 = 0.0, av2 = 0.0, y11 = 0.0, y22 = 0.0, y12 = 0.0, c;
|
||||||
|
int n=y1.length;
|
||||||
|
if (n!=y2.length) throw new RuntimeException("Error, mismatching vectors for correlation calculation in StatisticUtils.correlation(double[], double[])");
|
||||||
|
|
||||||
if (n <= 1) {
|
if (n <= 1) {
|
||||||
return 1.0;
|
return 1.0;
|
||||||
@ -230,21 +234,24 @@ public class StatisticUtils
|
|||||||
* Computes the variance for an array of doubles.
|
* Computes the variance for an array of doubles.
|
||||||
*
|
*
|
||||||
* @param vector the array
|
* @param vector the array
|
||||||
|
* @param finiteSet if true, the vector is interpreted as complete data set, otherwise a set of samples of a larger set.
|
||||||
* @return the variance
|
* @return the variance
|
||||||
*/
|
*/
|
||||||
public static double variance(double[] vector) {
|
public static double variance(double[] vector, boolean finiteSet) {
|
||||||
|
|
||||||
double sum = 0, sumSquared = 0;
|
double sum = 0, sumSquared = 0;
|
||||||
|
int n=vector.length;
|
||||||
if (vector.length <= 1) {
|
if (n <= 1) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
for (int i = 0; i < vector.length; i++) {
|
for (int i = 0; i < n; i++) {
|
||||||
sum += vector[i];
|
sum += vector[i];
|
||||||
sumSquared += (vector[i] * vector[i]);
|
sumSquared += (vector[i] * vector[i]);
|
||||||
}
|
}
|
||||||
double result = (sumSquared - (sum * sum / (double) vector.length)) /
|
double denom;
|
||||||
(double) (vector.length - 1);
|
if (finiteSet) denom=n;
|
||||||
|
else denom=(n-1);
|
||||||
|
double result = (sumSquared - (sum * sum / (double) n)) / denom;
|
||||||
|
|
||||||
// We don't like negative variance
|
// We don't like negative variance
|
||||||
if (result < 0) {
|
if (result < 0) {
|
||||||
@ -371,8 +378,7 @@ public class StatisticUtils
|
|||||||
*
|
*
|
||||||
* @author Joerg K. Wegner
|
* @author Joerg K. Wegner
|
||||||
*/
|
*/
|
||||||
public static double getCorrelationCoefficient(double array1[], double array2[])
|
public static double getCorrelationCoefficient(double array1[], double array2[]) {
|
||||||
{
|
|
||||||
if ((array1 == null) || (array2 == null)) { return -2.0; }
|
if ((array1 == null) || (array2 == null)) { return -2.0; }
|
||||||
|
|
||||||
double sumA = 0;
|
double sumA = 0;
|
||||||
@ -406,48 +412,236 @@ public class StatisticUtils
|
|||||||
* Main method for testing this class.
|
* Main method for testing this class.
|
||||||
*/
|
*/
|
||||||
public static void main(String[] ops) {
|
public static void main(String[] ops) {
|
||||||
|
double[][] vs = {{ 356.873,-498.563, 130.923,-223.684, 494.296, 380.739, 481.353, 344.571, 501.105,-166.109},
|
||||||
|
{ 199.116,-423.448, 487.898, 344.579, 140.709, 89.007,-259.310, 512.000, 152.069,-440.778},
|
||||||
|
{ 439.128, 112.370,-422.820,-43.119,-297.609,-438.940, 488.914,-512.000,-407.847, 386.611},
|
||||||
|
{ 395.772, 191.634,-511.999,-93.078,-282.853,-444.621, 491.291,-512.000,-407.620, 386.493}};
|
||||||
|
|
||||||
// System.out.println("test (0.5, 100): " +
|
vs[1]=Mathematics.rotate(vs[0], AbstractProblemDouble.initDefaultRotationMatrix(10, 10));
|
||||||
// StatisticUtils.test(100));
|
|
||||||
|
for (int i=0; i<vs.length; i++) {
|
||||||
|
for (int j=0; j<vs.length; j++) {
|
||||||
|
System.out.print("\t" + correlation(vs[i], vs[j]));
|
||||||
|
}
|
||||||
|
System.out.println();
|
||||||
|
}
|
||||||
|
// vs[1]=Mathematics.rotate(vs[0], AbstractProblemDouble.initDefaultRotationMatrix(30, 10));
|
||||||
|
// vs[2]=Mathematics.rotate(vs[0], AbstractProblemDouble.initDefaultRotationMatrix(50, 10));
|
||||||
|
// vs[3]=Mathematics.rotate(vs[0], AbstractProblemDouble.initDefaultRotationMatrix(70, 10));
|
||||||
|
|
||||||
|
vs = new double[][]{{0.1,0.9},
|
||||||
|
{0.8,0.2},
|
||||||
|
// {0.8,0.2},
|
||||||
|
{0.0,1.0}};
|
||||||
|
System.out.println("---");
|
||||||
|
|
||||||
|
// for (int i=0; i<vs.length; i++) {
|
||||||
|
// Mathematics.svAdd(512, vs[i], vs[i]);
|
||||||
|
// Mathematics.normVect(vs[i], vs[i]);
|
||||||
|
// System.out.println(BeanInspector.toString(vs[i]));
|
||||||
|
// }
|
||||||
|
|
||||||
|
// System.out.println("entropy cols: " + entropyOverColumns(vs));
|
||||||
|
// System.out.println("entropy rows: " + entropyOverRows(vs));
|
||||||
}
|
}
|
||||||
|
|
||||||
// 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)
|
* Computes the entropy of the given array.
|
||||||
public static double quadratic_entropy(double[] ds) {
|
*
|
||||||
// TODO Auto-generated method stub
|
* @param array an array of double data
|
||||||
System.err.println("warning, not implemented!");
|
* @return the entropy
|
||||||
return 0;
|
*/
|
||||||
}
|
public static double entropy(double[] array) {
|
||||||
|
double returnValue = 0;
|
||||||
|
double sum = 0;
|
||||||
|
|
||||||
public static double mutual_information(double[] ds, double[] ds2, int nbins) {
|
for (int i = 0; i < array.length; i++) {
|
||||||
// TODO Auto-generated method stub
|
returnValue -= lnFunc(array[i]);
|
||||||
System.err.println("warning, not implemented!");
|
sum += array[i];
|
||||||
return 0;
|
}
|
||||||
}
|
|
||||||
|
|
||||||
public static double quadratic_mutinf(double[] feature, double[] labels) {
|
if (StatisticUtils.eq(sum, 0)) {
|
||||||
// TODO Auto-generated method stub
|
return 0;
|
||||||
System.err.println("warning, not implemented!");
|
} else {
|
||||||
return 0;
|
return (returnValue + lnFunc(sum)) / (sum * log2);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static double quadratic_mutinf(double[] feature, double[] labels, int[] classes) {
|
|
||||||
// TODO Auto-generated method stub
|
|
||||||
System.err.println("warning, not implemented!");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static double SUquadratic(double[] feature, double[] labels) {
|
// these came from ContingencyTables.java in the wsi package (mkron)
|
||||||
// TODO Auto-generated method stub
|
// /**
|
||||||
System.err.println("warning, not implemented!");
|
// * Computes conditional entropy of the rows given
|
||||||
return 0;
|
// * the columns.
|
||||||
}
|
// *
|
||||||
|
// * @param matrix the contingency table
|
||||||
|
// * @return the conditional entropy of the rows given the columns
|
||||||
|
// */
|
||||||
|
// public static double entropyConditionedOnColumns(double[][] matrix) {
|
||||||
|
// double ret = 0;
|
||||||
|
// double colSum;
|
||||||
|
// double total = 0;
|
||||||
|
//
|
||||||
|
// for (int j = 0; j < matrix[0].length; j++) {
|
||||||
|
// colSum = 0;
|
||||||
|
//
|
||||||
|
// for (int i = 0; i < matrix.length; i++) {
|
||||||
|
// ret = ret + lnFunc(matrix[i][j]);
|
||||||
|
// colSum += matrix[i][j];
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// ret = ret - lnFunc(colSum);
|
||||||
|
// total += colSum;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// if (StatisticUtils.eq(total, 0)) {
|
||||||
|
// return 0;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// return -ret / (total * log2);
|
||||||
|
// }
|
||||||
|
|
||||||
public static double SUquadratic(double[] feature, double[] labels, int[] classes) {
|
// /**
|
||||||
// TODO Auto-generated method stub
|
// * Computes conditional entropy of the columns given
|
||||||
System.err.println("warning, not implemented!");
|
// * the rows.
|
||||||
return 0;
|
// *
|
||||||
}
|
// * @param matrix the contingency table
|
||||||
|
// * @return the conditional entropy of the columns given the rows
|
||||||
|
// */
|
||||||
|
// public static double entropyConditionedOnRows(double[][] matrix) {
|
||||||
|
// double returnValue = 0;
|
||||||
|
// double sumForRow;
|
||||||
|
// double total = 0;
|
||||||
|
//
|
||||||
|
// for (int i = 0; i < matrix.length; i++) {
|
||||||
|
// sumForRow = 0;
|
||||||
|
//
|
||||||
|
// for (int j = 0; j < matrix[0].length; j++) {
|
||||||
|
// returnValue = returnValue + lnFunc(matrix[i][j]);
|
||||||
|
// sumForRow += matrix[i][j];
|
||||||
|
// }
|
||||||
|
// returnValue = returnValue - lnFunc(sumForRow);
|
||||||
|
// total += sumForRow;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// if (StatisticUtils.eq(total, 0)) {
|
||||||
|
// return 0;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// return -returnValue / (total * log2);
|
||||||
|
// }
|
||||||
|
|
||||||
|
// /**
|
||||||
|
// * Computes the columns' entropy for the given contingency table.
|
||||||
|
// *
|
||||||
|
// * @param matrix the contingency table
|
||||||
|
// * @return the columns' entropy
|
||||||
|
// */
|
||||||
|
// public static double entropyOverColumns(double[][] matrix)
|
||||||
|
// {
|
||||||
|
// double returnValue = 0;
|
||||||
|
// double sumForColumn;
|
||||||
|
// double total = 0;
|
||||||
|
//
|
||||||
|
// for (int j = 0; j < matrix[0].length; j++)
|
||||||
|
// {
|
||||||
|
// sumForColumn = 0;
|
||||||
|
//
|
||||||
|
// for (int i = 0; i < matrix.length; i++)
|
||||||
|
// {
|
||||||
|
// sumForColumn += matrix[i][j];
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// returnValue = returnValue - lnFunc(sumForColumn);
|
||||||
|
// total += sumForColumn;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// if (StatisticUtils.eq(total, 0))
|
||||||
|
// {
|
||||||
|
// return 0;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// return (returnValue + lnFunc(total)) / (total * log2);
|
||||||
|
// }
|
||||||
|
|
||||||
|
// /**
|
||||||
|
// * Computes the rows' entropy for the given contingency table.
|
||||||
|
// *
|
||||||
|
// * @param matrix the contingency table
|
||||||
|
// * @return the rows' entropy
|
||||||
|
// */
|
||||||
|
// public static double entropyOverRows(double[][] matrix)
|
||||||
|
// {
|
||||||
|
// double returnValue = 0;
|
||||||
|
// double sumForRow;
|
||||||
|
// double total = 0;
|
||||||
|
//
|
||||||
|
// for (int i = 0; i < matrix.length; i++)
|
||||||
|
// {
|
||||||
|
// sumForRow = 0;
|
||||||
|
//
|
||||||
|
// for (int j = 0; j < matrix[0].length; j++)
|
||||||
|
// {
|
||||||
|
// sumForRow += matrix[i][j];
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// returnValue = returnValue - lnFunc(sumForRow);
|
||||||
|
// total += sumForRow;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// if (StatisticUtils.eq(total, 0))
|
||||||
|
// {
|
||||||
|
// return 0;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// return (returnValue + lnFunc(total)) / (total * log2);
|
||||||
|
// }
|
||||||
|
|
||||||
|
private static double lnFunc(double num) {
|
||||||
|
// hard coded for efficiency reasons
|
||||||
|
if (num < 1e-7) {
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
return num * Math.log(num);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// // 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 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!");
|
||||||
|
// return 0;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// public static double SUquadratic(double[] feature, double[] labels) {
|
||||||
|
// // TODO Auto-generated method stub
|
||||||
|
// System.err.println("warning, not implemented!");
|
||||||
|
// return 0;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// public static double SUquadratic(double[] feature, double[] labels, int[] classes) {
|
||||||
|
// // TODO Auto-generated method stub
|
||||||
|
// System.err.println("warning, not implemented!");
|
||||||
|
// return 0;
|
||||||
|
// }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Random Latin Hypercube Sampling within a given double range.
|
* Random Latin Hypercube Sampling within a given double range.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user