Merge branch '61-terminators' into 'master'
Tests for Terminators See merge request !12
This commit is contained in:
		
							
								
								
									
										56
									
								
								build.gradle
									
									
									
									
									
								
							
							
						
						
									
										56
									
								
								build.gradle
									
									
									
									
									
								
							| @@ -1,7 +1,8 @@ | ||||
| apply plugin: 'java' | ||||
| apply plugin: 'maven' | ||||
| apply plugin: 'com.bmuschko.nexus' | ||||
|  | ||||
| group = 'eva2' | ||||
| group = 'de.openea' | ||||
| version = '2.2.0' | ||||
|  | ||||
| description = """EvA2""" | ||||
| @@ -25,9 +26,62 @@ task fatJar(type: Jar) { | ||||
| repositories { | ||||
|     mavenCentral()         | ||||
| } | ||||
|  | ||||
| dependencies { | ||||
|     compile group: 'javax.help', name: 'javahelp', version: '2.0.05' | ||||
|     compile group: 'org.yaml', name: 'snakeyaml', version: '1.16' | ||||
|     compile group: 'gov.nist.math', name: 'jama', version: '1.0.3' | ||||
|     testCompile group: 'junit', name: 'junit', version: '4.12' | ||||
|     testCompile group: 'org.mockito', name: 'mockito-core', version: '1.+' | ||||
| } | ||||
|  | ||||
| buildscript { | ||||
|     repositories { | ||||
|         jcenter() | ||||
|     } | ||||
|     dependencies { | ||||
|         classpath 'com.bmuschko:gradle-nexus-plugin:2.3.1' | ||||
|     } | ||||
| } | ||||
|  | ||||
| modifyPom { | ||||
|     project { | ||||
|         name 'EvA2' | ||||
|         description 'Gradle plugin that provides tasks for configuring and uploading artifacts to Sonatype Nexus.' | ||||
|         url 'http://www.ra.cs.uni-tuebingen.de/software/eva2/' | ||||
|         inceptionYear '2008' | ||||
|  | ||||
|         scm { | ||||
|             url 'https://gitlab.cs.uni-tuebingen.de/eva2/eva2/' | ||||
|             connection 'scm:https://gitlab.cs.uni-tuebingen.de/eva2/eva2/.git' | ||||
|             developerConnection 'scm:https://gitlab.cs.uni-tuebingen.de/eva2/eva2/.git' | ||||
|         } | ||||
|  | ||||
|         licenses { | ||||
|             license { | ||||
|                 name 'GNU Lesser General Public License, Version 3.0' | ||||
|                 url 'http://www.gnu.org/licenses/lgpl-3.0.html' | ||||
|                 distribution 'repo' | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         developers { | ||||
|             developer { | ||||
|                 id 'halfdan' | ||||
|                 name 'Fabian Becker' | ||||
|                 email 'halfdan@xnorfz.de' | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| extraArchive { | ||||
|     sources = true | ||||
|     tests = true | ||||
|     javadoc = true | ||||
| } | ||||
|  | ||||
| nexus { | ||||
|     repositoryUrl = 'https://oss.sonatype.org/service/local/staging/deploy/maven2' | ||||
|     snapshotRepositoryUrl = 'https://oss.sonatype.org/content/repositories/snapshots' | ||||
| } | ||||
|   | ||||
| @@ -19,7 +19,7 @@ import java.util.Comparator; | ||||
|  * @see AbstractEAIndividual#isDominatingFitness(double[], double[]) | ||||
|  */ | ||||
| @eva2.util.annotation.Description(value = "A comparator class for general EA individuals. Compares individuals based on their fitness in context of minimization.") | ||||
| public class EAIndividualComparator implements Comparator<Object>, Serializable { | ||||
| public class EAIndividualComparator implements Comparator<AbstractEAIndividual>, Serializable { | ||||
|     // flag whether a data field should be used. | ||||
|     private String indyDataKey = ""; | ||||
|     private int fitCriterion = -1; | ||||
| @@ -122,7 +122,7 @@ public class EAIndividualComparator implements Comparator<Object>, Serializable | ||||
|      * @return -1 if the first is dominant, 1 if the second is dominant, otherwise 0 | ||||
|      */ | ||||
|     @Override | ||||
|     public int compare(Object o1, Object o2) { | ||||
|     public int compare(AbstractEAIndividual o1, AbstractEAIndividual o2) { | ||||
|         boolean o1domO2, o2domO1; | ||||
|  | ||||
|         if (preferFeasible) { // check constraint violation first? | ||||
|   | ||||
| @@ -237,10 +237,6 @@ public class ESIndividualPermutationData extends AbstractEAIndividual implements | ||||
|         this.firstindex = firstindex; | ||||
|     } | ||||
|  | ||||
|     /************************************************************************************ | ||||
|      * AbstractEAIndividual methods | ||||
|      */ | ||||
|  | ||||
|     /** | ||||
|      * This method will initialize the individual with a given value for the | ||||
|      * phenotype. | ||||
| @@ -305,7 +301,7 @@ public class ESIndividualPermutationData extends AbstractEAIndividual implements | ||||
|     } | ||||
|  | ||||
|  | ||||
|     public double[] mapMatrixToVector(double[][] matrix) { | ||||
|     public static double[] mapMatrixToVector(double[][] matrix) { | ||||
|         int sumentries = 0; | ||||
|         for (int i = 0; i < matrix.length; i++) { | ||||
|             sumentries += matrix[i].length; | ||||
| @@ -321,7 +317,7 @@ public class ESIndividualPermutationData extends AbstractEAIndividual implements | ||||
|         return res; | ||||
|     } | ||||
|  | ||||
|     public double[][] mapVectorToMatrix(double[] vector, int[] sizes) { | ||||
|     public static double[][] mapVectorToMatrix(double[] vector, int[] sizes) { | ||||
|         double[][] matrix = new double[sizes.length][]; | ||||
|         int counter = 0; | ||||
|         for (int i = 0; i < sizes.length; i++) { | ||||
| @@ -353,8 +349,6 @@ public class ESIndividualPermutationData extends AbstractEAIndividual implements | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
|  | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|   | ||||
| @@ -9,7 +9,7 @@ import java.util.Comparator; | ||||
|  * Compare two AbstractEAIndividuals by their distance to a reference individual. | ||||
|  * Usable to sort by a distance. | ||||
|  */ | ||||
| public class IndividualDistanceComparator implements Comparator<Object>, Serializable { | ||||
| public class IndividualDistanceComparator implements Comparator<AbstractEAIndividual>, Serializable { | ||||
|  | ||||
|     private AbstractEAIndividual refIndy = null; | ||||
|     private InterfaceDistanceMetric distMetric = null; | ||||
| @@ -30,9 +30,9 @@ public class IndividualDistanceComparator implements Comparator<Object>, Seriali | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public int compare(Object o1, Object o2) { | ||||
|         double d1 = distMetric.distance((AbstractEAIndividual) o1, refIndy); | ||||
|         double d2 = distMetric.distance((AbstractEAIndividual) o2, refIndy); | ||||
|     public int compare(AbstractEAIndividual o1, AbstractEAIndividual o2) { | ||||
|         double d1 = distMetric.distance(o1, refIndy); | ||||
|         double d2 = distMetric.distance(o2, refIndy); | ||||
|  | ||||
|         if (d1 == d2) { | ||||
|             return 0; | ||||
|   | ||||
| @@ -1,6 +1,7 @@ | ||||
| package eva2.optimization.individuals; | ||||
|  | ||||
| import eva2.tools.EVAERROR; | ||||
| import eva2.util.annotation.Parameter; | ||||
|  | ||||
| import java.io.Serializable; | ||||
| import java.util.Comparator; | ||||
| @@ -10,7 +11,7 @@ import java.util.Comparator; | ||||
|  * | ||||
|  * @author mkron | ||||
|  */ | ||||
| public class IndividualWeightedFitnessComparator implements Comparator<Object>, Serializable { | ||||
| public class IndividualWeightedFitnessComparator implements Comparator<AbstractEAIndividual>, Serializable { | ||||
|     /** | ||||
|      * Generated serial version identifier | ||||
|      */ | ||||
| @@ -75,12 +76,12 @@ public class IndividualWeightedFitnessComparator implements Comparator<Object>, | ||||
|      * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object) | ||||
|      */ | ||||
|     @Override | ||||
|     public int compare(Object o1, Object o2) { | ||||
|         double[] f1 = ((AbstractEAIndividual) o1).getFitness(); | ||||
|         double[] f2 = ((AbstractEAIndividual) o2).getFitness(); | ||||
|     public int compare(AbstractEAIndividual o1, AbstractEAIndividual o2) { | ||||
|         double[] f1 = o1.getFitness(); | ||||
|         double[] f2 = o2.getFitness(); | ||||
|  | ||||
|         double score1 = calcScore(f1); | ||||
|         double score2 = calcScore(f2); | ||||
|         double score1 = calculateScore(f1); | ||||
|         double score2 = calculateScore(f2); | ||||
|  | ||||
|         if (score1 < score2) { | ||||
|             return -1; | ||||
| @@ -95,7 +96,7 @@ public class IndividualWeightedFitnessComparator implements Comparator<Object>, | ||||
|      * @param f | ||||
|      * @return | ||||
|      */ | ||||
|     private double calcScore(double[] f) { | ||||
|     private double calculateScore(double[] f) { | ||||
|         if (f == null || fitWeights == null) { | ||||
|             throw new RuntimeException("Error, missing information in " + this.getClass()); | ||||
|         } | ||||
| @@ -117,9 +118,9 @@ public class IndividualWeightedFitnessComparator implements Comparator<Object>, | ||||
|      * @param indy | ||||
|      * @return | ||||
|      */ | ||||
|     public double calcScore(AbstractEAIndividual indy) { | ||||
|     public double calculateScore(AbstractEAIndividual indy) { | ||||
|         double[] f = indy.getFitness(); | ||||
|         return calcScore(f); | ||||
|         return calculateScore(f); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
| @@ -133,6 +134,7 @@ public class IndividualWeightedFitnessComparator implements Comparator<Object>, | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     @Parameter(description = "Weights of the fitness values in the linear combination") | ||||
|     public void setFitWeights(double[] fitWeights) { | ||||
|         this.fitWeights = fitWeights; | ||||
|     } | ||||
| @@ -140,23 +142,4 @@ public class IndividualWeightedFitnessComparator implements Comparator<Object>, | ||||
|     public double[] getFitWeights() { | ||||
|         return fitWeights; | ||||
|     } | ||||
|  | ||||
|     public String fitWeightsTipText() { | ||||
|         return "Weights of the fitness values in the linear combination"; | ||||
|     } | ||||
|  | ||||
| //	public static void main(String[] args) { | ||||
| //		TF1Problem prob = new TF1Problem(); | ||||
| //		Population pop = new Population(10); | ||||
| //		prob.initializePopulation(pop); | ||||
| //		prob.evaluate(pop); | ||||
| //		System.out.println(pop.getStringRepresentation()); | ||||
| //		System.out.println("***"); | ||||
| //		IndividualWeightedFitnessComparator wfComp = new IndividualWeightedFitnessComparator(new double[]{0.5,0.5}); | ||||
| //		System.out.println("***"); System.out.println(pop.getSortedPop(wfComp).getStringRepresentation()); | ||||
| //		wfComp.setFitWeights(new double[] {0.1, 0.9}); | ||||
| //		System.out.println("***"); System.out.println(pop.getSortedPop(wfComp).getStringRepresentation()); | ||||
| //		wfComp.setFitWeights(new double[] {0.9, 0.1}); | ||||
| //		System.out.println("***"); System.out.println(pop.getSortedPop(wfComp).getStringRepresentation()); | ||||
| //	} | ||||
| } | ||||
|   | ||||
| @@ -52,7 +52,7 @@ public class ArchivingNSGAIISMeasure extends ArchivingNSGAII { | ||||
|  | ||||
|     public void calculateCrowdingDistance(Population front) { | ||||
|  | ||||
|         Object[] frontArray = front.toArray(); | ||||
|         AbstractEAIndividual[] frontArray = front.toArray(new AbstractEAIndividual[front.size()]); | ||||
|         boolean[] assigned = new boolean[frontArray.length]; | ||||
|  | ||||
|         double[] v = new double[frontArray.length]; | ||||
| @@ -68,8 +68,8 @@ public class ArchivingNSGAIISMeasure extends ArchivingNSGAII { | ||||
|         Arrays.sort(frontArray, new EAIndividualComparator(0)); | ||||
|  | ||||
|  | ||||
|         ((AbstractEAIndividual) frontArray[0]).putData("HyperCube", Double.MAX_VALUE); //die beiden aussen bekommen maximal wert als measure | ||||
|         ((AbstractEAIndividual) frontArray[frontArray.length - 1]).putData("HyperCube", Double.MAX_VALUE); | ||||
|         frontArray[0].putData("HyperCube", Double.MAX_VALUE); //die beiden aussen bekommen maximal wert als measure | ||||
|         frontArray[frontArray.length - 1].putData("HyperCube", Double.MAX_VALUE); | ||||
|         v[0] = Double.MAX_VALUE; | ||||
|         v[frontArray.length - 1] = Double.MAX_VALUE; | ||||
|  | ||||
|   | ||||
| @@ -4,6 +4,7 @@ import eva2.optimization.individuals.AbstractEAIndividual; | ||||
| import eva2.tools.EVAERROR; | ||||
| import eva2.tools.math.Mathematics; | ||||
| import eva2.util.annotation.Description; | ||||
| import eva2.util.annotation.Parameter; | ||||
|  | ||||
| import java.io.Serializable; | ||||
|  | ||||
| @@ -19,8 +20,7 @@ import java.io.Serializable; | ||||
| public class DoubleIntegralMetric implements InterfaceDistanceMetric, Serializable { | ||||
|     boolean oneNormed = true; // if true, the vectors are normed to unity sum before comparison. | ||||
|  | ||||
|     public DoubleIntegralMetric() { | ||||
|     } | ||||
|     public DoubleIntegralMetric() {} | ||||
|  | ||||
|     public DoubleIntegralMetric(boolean normed) { | ||||
|         oneNormed = normed; | ||||
| @@ -35,10 +35,8 @@ public class DoubleIntegralMetric implements InterfaceDistanceMetric, Serializab | ||||
|     public double distance(AbstractEAIndividual indy1, AbstractEAIndividual indy2) { | ||||
|         double[] dIndy1 = null, dIndy2 = null; | ||||
|  | ||||
|         if (dIndy1 == null || dIndy2 == null) { | ||||
|             dIndy1 = AbstractEAIndividual.getDoublePositionShallow(indy1); | ||||
|             dIndy2 = AbstractEAIndividual.getDoublePositionShallow(indy2); | ||||
|         } | ||||
|         dIndy1 = AbstractEAIndividual.getDoublePositionShallow(indy1); | ||||
|         dIndy2 = AbstractEAIndividual.getDoublePositionShallow(indy2); | ||||
|  | ||||
|         if (oneNormed) { | ||||
|             double l1 = Mathematics.sum(dIndy1); | ||||
| @@ -53,9 +51,8 @@ public class DoubleIntegralMetric implements InterfaceDistanceMetric, Serializab | ||||
|         } | ||||
|  | ||||
|         double sum1 = 0, sum2 = 0; | ||||
|         double tmpDiff = 0, sqrDiffSum = 0; | ||||
| //		System.out.println(Mathematics.sum(dIndy1)); | ||||
| //		System.out.println(Mathematics.sum(dIndy2)); | ||||
|         double tmpDiff, sqrDiffSum = 0; | ||||
|  | ||||
|         for (int i = 0; (i < dIndy1.length) && (i < dIndy2.length); i++) { | ||||
|             sum1 += dIndy1[i]; | ||||
|             sum2 += dIndy2[i]; | ||||
| @@ -73,12 +70,8 @@ public class DoubleIntegralMetric implements InterfaceDistanceMetric, Serializab | ||||
|         return oneNormed; | ||||
|     } | ||||
|  | ||||
|     @Parameter(description = "If true, both vectors are normed to unity sum before comparison.") | ||||
|     public void setOneNormed(boolean normedByLength) { | ||||
|         this.oneNormed = normedByLength; | ||||
|     } | ||||
|  | ||||
|     public String oneNormedTipText() { | ||||
|         return "If true, both vectors are normed to unity sum before comparison."; | ||||
|     } | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -13,15 +13,11 @@ import java.util.BitSet; | ||||
| @Description("This is a genotype based distance metric suited for binary data. The hamming distance is computed and normalized by chromosome length.") | ||||
| public class GenotypeMetricBitSet implements InterfaceDistanceMetric, java.io.Serializable { | ||||
|  | ||||
|     public GenotypeMetricBitSet() { | ||||
|     } | ||||
|  | ||||
|     public GenotypeMetricBitSet(GenotypeMetricBitSet a) { | ||||
|     } | ||||
|     public GenotypeMetricBitSet() {} | ||||
|  | ||||
|     @Override | ||||
|     public Object clone() { | ||||
|         return new GenotypeMetricBitSet(this); | ||||
|         return new GenotypeMetricBitSet(); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|   | ||||
| @@ -3,6 +3,7 @@ package eva2.optimization.operator.distancemetric; | ||||
|  | ||||
| import eva2.gui.BeanInspector; | ||||
| import eva2.optimization.individuals.*; | ||||
| import eva2.tools.math.Mathematics; | ||||
| import eva2.util.annotation.Description; | ||||
|  | ||||
| import java.util.BitSet; | ||||
| @@ -15,15 +16,11 @@ public class PhenotypeMetric implements InterfaceDistanceMetric, java.io.Seriali | ||||
|     private static PhenotypeMetric pMetric = null; | ||||
|     private static GenotypeMetricBitSet bitMetric = null; | ||||
|  | ||||
|     public PhenotypeMetric() { | ||||
|     } | ||||
|  | ||||
|     public PhenotypeMetric(PhenotypeMetric a) { | ||||
|     } | ||||
|     public PhenotypeMetric() {} | ||||
|  | ||||
|     @Override | ||||
|     public Object clone() { | ||||
|         return new PhenotypeMetric(this); | ||||
|         return new PhenotypeMetric(); | ||||
|     } | ||||
|  | ||||
|     private static int min(int a, int b, int c) { | ||||
| @@ -109,7 +106,6 @@ public class PhenotypeMetric implements InterfaceDistanceMetric, java.io.Seriali | ||||
|             r2 = ((InterfaceDataTypeInteger) indy2).getIntRange(); | ||||
|             for (int i = 0; (i < d1.length) && (i < d2.length); i++) { | ||||
|                 tmpResult += Math.pow(((d1[i] - r1[i][0]) / ((double) (r1[i][1] - r1[i][0]))) - ((d2[i] - r2[i][0]) / ((double) (r2[i][1] - r2[i][0]))), 2); | ||||
|                 //tmpResult += Math.abs(d1[i] - d2[i])/((double)(r1[i][1]-r1[i][0])); | ||||
|             } | ||||
|             result += Math.sqrt(tmpResult); | ||||
|         } | ||||
| @@ -130,7 +126,6 @@ public class PhenotypeMetric implements InterfaceDistanceMetric, java.io.Seriali | ||||
|         if ((indy1 instanceof InterfaceDataTypePermutation) && (indy2 instanceof InterfaceDataTypePermutation)) { | ||||
|             int[] dIndy1, dIndy2; | ||||
|             String s1 = "", s2 = ""; | ||||
| //            double  tmpResult = 0; | ||||
|             for (int p = 0; p < ((InterfaceDataTypePermutation) indy1).getPermutationData().length; p++) { | ||||
|                 dIndy1 = ((InterfaceDataTypePermutation) indy1).getPermutationData()[p]; | ||||
|                 dIndy2 = ((InterfaceDataTypePermutation) indy2).getPermutationData()[p]; | ||||
| @@ -192,7 +187,7 @@ public class PhenotypeMetric implements InterfaceDistanceMetric, java.io.Seriali | ||||
|             return result / d1.length; | ||||
|         } | ||||
|         if (indy instanceof InterfaceDataTypeDouble) { | ||||
|             result = norm(((InterfaceDataTypeDouble) indy).getDoubleData()); | ||||
|             result = Mathematics.norm(((InterfaceDataTypeDouble) indy).getDoubleData()); | ||||
|             return result; | ||||
|         } | ||||
|         if (indy instanceof InterfaceDataTypePermutation) { | ||||
| @@ -208,20 +203,6 @@ public class PhenotypeMetric implements InterfaceDistanceMetric, java.io.Seriali | ||||
|         return 0; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Calculates the 2 norm of a given vector. | ||||
|      * | ||||
|      * @param v1 | ||||
|      * @return | ||||
|      */ | ||||
|     public static double norm(double[] v1) { | ||||
|         double result = 0; | ||||
|         for (int i = 0; i < v1.length; i++) { | ||||
|             result += Math.pow(v1[i], 2); | ||||
|         } | ||||
|         return Math.sqrt(result); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * This method will return a naming String | ||||
|      * | ||||
|   | ||||
| @@ -15,15 +15,11 @@ import eva2.util.annotation.Description; | ||||
| @Description("This is an experimental method for individuals using global ES mutation.") | ||||
| public class SigmaSingleMetricGlobalMutation implements InterfaceDistanceMetric, java.io.Serializable { | ||||
|  | ||||
|     public SigmaSingleMetricGlobalMutation() { | ||||
|     } | ||||
|  | ||||
|     public SigmaSingleMetricGlobalMutation(SigmaSingleMetricGlobalMutation a) { | ||||
|     } | ||||
|     public SigmaSingleMetricGlobalMutation() {} | ||||
|  | ||||
|     @Override | ||||
|     public Object clone() { | ||||
|         return new SigmaSingleMetricGlobalMutation(this); | ||||
|         return new SigmaSingleMetricGlobalMutation(); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|   | ||||
| @@ -248,9 +248,9 @@ public class PostProcess { | ||||
|         Population result = new Population(); | ||||
|         for (int i = 0; i < pop.size(); i++) { | ||||
|             indy = pop.getEAIndividual(i); | ||||
|             if (bSmallerEq && (PhenotypeMetric.norm(indy.getFitness()) <= fitNorm)) { | ||||
|             if (bSmallerEq && (Mathematics.norm(indy.getFitness()) <= fitNorm)) { | ||||
|                 result.add(indy); | ||||
|             } else if (!bSmallerEq && (PhenotypeMetric.norm(indy.getFitness()) > fitNorm)) { | ||||
|             } else if (!bSmallerEq && (Mathematics.norm(indy.getFitness()) > fitNorm)) { | ||||
|                 result.add(indy); | ||||
|             } | ||||
|         } | ||||
| @@ -279,7 +279,7 @@ public class PostProcess { | ||||
|             if ((crit >= 0) && (crit < indy.getFitness().length)) { | ||||
|                 curFit = indy.getFitness(crit); | ||||
|             } else { | ||||
|                 curFit = PhenotypeMetric.norm(indy.getFitness()); | ||||
|                 curFit = Mathematics.norm(indy.getFitness()); | ||||
|             } | ||||
|  | ||||
|             if (bSmallerEq && (curFit <= fitThresh)) { | ||||
| @@ -1058,7 +1058,7 @@ public class PostProcess { | ||||
|                 plot = draw("After " + stepsDone + " steps (" + params.getPPMethod() + ")" + ((params.getPostProcessClusterSigma() > 0) ? " and second clustering" : ""), null, outputPop, null, problem); | ||||
|             } | ||||
|             // ##### some statistics | ||||
|             double upBnd = PhenotypeMetric.norm(outputPop.getWorstEAIndividual().getFitness()) * 1.1; | ||||
|             double upBnd = Mathematics.norm(outputPop.getWorstEAIndividual().getFitness()) * 1.1; | ||||
|             upBnd = Math.pow(10, Math.floor(Math.log10(upBnd) + 1)); | ||||
|             double lowBnd = 0; | ||||
|             int fitCrit = 0; // use first fitness criterion | ||||
|   | ||||
| @@ -3,6 +3,7 @@ package eva2.optimization.operator.selection; | ||||
| import eva2.optimization.individuals.AbstractEAIndividual; | ||||
| import eva2.optimization.population.Population; | ||||
| import eva2.util.annotation.Description; | ||||
| import eva2.util.annotation.Parameter; | ||||
|  | ||||
| /** | ||||
|  * Simple method to select all. | ||||
| @@ -14,8 +15,7 @@ public class SelectAll implements InterfaceSelection, java.io.Serializable { | ||||
|  | ||||
|     private boolean obeyDebsConstViolationPrinciple = true; | ||||
|  | ||||
|     public SelectAll() { | ||||
|     } | ||||
|     public SelectAll() {} | ||||
|  | ||||
|     public SelectAll(SelectAll a) { | ||||
|         this.obeyDebsConstViolationPrinciple = a.obeyDebsConstViolationPrinciple; | ||||
| @@ -41,7 +41,7 @@ public class SelectAll implements InterfaceSelection, java.io.Serializable { | ||||
|  | ||||
|     /** | ||||
|      * This method will select one Individual from the given | ||||
|      * Population in respect to the selection propability of the | ||||
|      * Population in respect to the selection probability of the | ||||
|      * individual. | ||||
|      * | ||||
|      * @param population The source population where to select from | ||||
| @@ -105,6 +105,7 @@ public class SelectAll implements InterfaceSelection, java.io.Serializable { | ||||
|      * @param b The new state | ||||
|      */ | ||||
|     @Override | ||||
|     @Parameter(description = "Toggle the use of Deb's constraint violation principle.") | ||||
|     public void setObeyDebsConstViolationPrinciple(boolean b) { | ||||
|         this.obeyDebsConstViolationPrinciple = b; | ||||
|     } | ||||
| @@ -112,8 +113,4 @@ public class SelectAll implements InterfaceSelection, java.io.Serializable { | ||||
|     public boolean getObeyDebsConstViolationPrinciple() { | ||||
|         return this.obeyDebsConstViolationPrinciple; | ||||
|     } | ||||
|  | ||||
|     public String obeyDebsConstViolationPrincipleToolTip() { | ||||
|         return "Toggle the use of Deb's coonstraint violation principle."; | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -2,8 +2,8 @@ package eva2.optimization.operator.selection; | ||||
|  | ||||
| import eva2.optimization.individuals.AbstractEAIndividual; | ||||
| import eva2.optimization.operator.selection.probability.InterfaceSelectionProbability; | ||||
| import eva2.optimization.operator.selection.probability.SelProbStandard; | ||||
| import eva2.optimization.operator.selection.probability.SelProbStandardScaling; | ||||
| import eva2.optimization.operator.selection.probability.SelectionProbabilityStandard; | ||||
| import eva2.optimization.operator.selection.probability.SelectionProbabilityStandardScaling; | ||||
| import eva2.optimization.population.Population; | ||||
| import eva2.tools.math.RNG; | ||||
| import eva2.util.annotation.Description; | ||||
| @@ -23,14 +23,14 @@ public class SelectParticleWheel implements InterfaceSelection, java.io.Serializ | ||||
|      * Comment for {@code serialVersionUID} | ||||
|      */ | ||||
|     private static final long serialVersionUID = 1L; | ||||
|     private InterfaceSelectionProbability selProbCalculator = new SelProbStandard(); | ||||
|     private InterfaceSelectionProbability selProbCalculator = new SelectionProbabilityStandard(); | ||||
|     private boolean selectFixedSteps = false; | ||||
|  | ||||
|     public SelectParticleWheel() { | ||||
|     } | ||||
|  | ||||
|     public SelectParticleWheel(double scalingProb) { | ||||
|         selProbCalculator = new SelProbStandardScaling(scalingProb); | ||||
|         selProbCalculator = new SelectionProbabilityStandardScaling(scalingProb); | ||||
|     } | ||||
|  | ||||
|     public SelectParticleWheel(InterfaceSelectionProbability selProb) { | ||||
|   | ||||
| @@ -2,7 +2,7 @@ package eva2.optimization.operator.selection; | ||||
|  | ||||
| import eva2.optimization.individuals.AbstractEAIndividual; | ||||
| import eva2.optimization.operator.selection.probability.InterfaceSelectionProbability; | ||||
| import eva2.optimization.operator.selection.probability.SelProbStandard; | ||||
| import eva2.optimization.operator.selection.probability.SelectionProbabilityStandard; | ||||
| import eva2.optimization.population.Population; | ||||
| import eva2.tools.math.RNG; | ||||
| import eva2.util.annotation.Description; | ||||
| @@ -17,7 +17,7 @@ import eva2.util.annotation.Description; | ||||
| public class SelectXProbRouletteWheel implements InterfaceSelection, java.io.Serializable { | ||||
|  | ||||
|     private transient TreeElement[] treeRoot = null; | ||||
|     private InterfaceSelectionProbability selectionProbability = new SelProbStandard(); | ||||
|     private InterfaceSelectionProbability selectionProbability = new SelectionProbabilityStandard(); | ||||
|     private boolean obeyDebsConstViolationPrinciple = true; | ||||
|  | ||||
|     public SelectXProbRouletteWheel() { | ||||
|   | ||||
| @@ -11,7 +11,7 @@ import java.util.ArrayList; | ||||
|  * This abstract implementation gives some general | ||||
|  * methods for retrieving and cleaning fitness values. | ||||
|  */ | ||||
| public abstract class AbstractSelProb implements InterfaceSelectionProbability, java.io.Serializable { | ||||
| public abstract class AbstractSelectionProbability implements InterfaceSelectionProbability, java.io.Serializable { | ||||
| 
 | ||||
|     /** | ||||
|      * This method allows you to make a deep clone of | ||||
| @@ -9,24 +9,24 @@ import eva2.util.annotation.Description; | ||||
|  * invariant to any linear transition function. | ||||
|  */ | ||||
| @Description("This is the Boltzman Normation.") | ||||
| public class SelProbBoltzman extends AbstractSelProb implements java.io.Serializable { | ||||
| public class SelectionProbabilityBoltzman extends AbstractSelectionProbability implements java.io.Serializable { | ||||
| 
 | ||||
|     private double q = 1.0; | ||||
| 
 | ||||
|     public SelProbBoltzman() { | ||||
|     public SelectionProbabilityBoltzman() { | ||||
|     } | ||||
| 
 | ||||
|     public SelProbBoltzman(double q) { | ||||
|     public SelectionProbabilityBoltzman(double q) { | ||||
|         this.q = q; | ||||
|     } | ||||
| 
 | ||||
|     public SelProbBoltzman(SelProbBoltzman a) { | ||||
|     public SelectionProbabilityBoltzman(SelectionProbabilityBoltzman a) { | ||||
|         this.q = a.q; | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public Object clone() { | ||||
|         return new SelProbBoltzman(this); | ||||
|         return new SelectionProbabilityBoltzman(this); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
| @@ -10,16 +10,16 @@ import eva2.util.annotation.Description; | ||||
|  * Here we have the infamous fitness sharing method. | ||||
|  */ | ||||
| @Description("This is a fitness sharing based normation method.") | ||||
| public class SelProbFitnessSharing extends AbstractSelProb implements java.io.Serializable { | ||||
| public class SelectionProbabilityFitnessSharing extends AbstractSelectionProbability implements java.io.Serializable { | ||||
| 
 | ||||
|     private InterfaceSelectionProbability basicNormationMethod = new SelProbStandard(); | ||||
|     private InterfaceSelectionProbability basicNormationMethod = new SelectionProbabilityStandard(); | ||||
|     private InterfaceDistanceMetric distanceMetric = new PhenotypeMetric(); | ||||
|     private double sharingDistance = 0.1; | ||||
| 
 | ||||
|     public SelProbFitnessSharing() { | ||||
|     public SelectionProbabilityFitnessSharing() { | ||||
|     } | ||||
| 
 | ||||
|     public SelProbFitnessSharing(SelProbFitnessSharing a) { | ||||
|     public SelectionProbabilityFitnessSharing(SelectionProbabilityFitnessSharing a) { | ||||
|         if (a.basicNormationMethod != null) { | ||||
|             this.basicNormationMethod = (InterfaceSelectionProbability) a.basicNormationMethod.clone(); | ||||
|         } | ||||
| @@ -31,7 +31,7 @@ public class SelProbFitnessSharing extends AbstractSelProb implements java.io.Se | ||||
| 
 | ||||
|     @Override | ||||
|     public Object clone() { | ||||
|         return new SelProbFitnessSharing(this); | ||||
|         return new SelectionProbabilityFitnessSharing(this); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
| @@ -10,24 +10,24 @@ import eva2.util.annotation.Description; | ||||
|  * | ||||
|  */ | ||||
| @Description("This is a standard normation method inverted by maximum fitness.") | ||||
| public class SelProbInvertByMax extends AbstractSelProb { | ||||
| public class SelectionProbabilityInvertByMax extends AbstractSelectionProbability { | ||||
| 
 | ||||
|     private double maxFit = 1.; | ||||
| 
 | ||||
|     public SelProbInvertByMax() { | ||||
|     public SelectionProbabilityInvertByMax() { | ||||
|     } | ||||
| 
 | ||||
|     public SelProbInvertByMax(double mF) { | ||||
|     public SelectionProbabilityInvertByMax(double mF) { | ||||
|         maxFit = mF; | ||||
|     } | ||||
| 
 | ||||
|     public SelProbInvertByMax(SelProbInvertByMax a) { | ||||
|     public SelectionProbabilityInvertByMax(SelectionProbabilityInvertByMax a) { | ||||
|         this.maxFit = a.maxFit; | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public Object clone() { | ||||
|         return new SelProbInvertByMax(this); | ||||
|         return new SelectionProbabilityInvertByMax(this); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
| @@ -7,22 +7,22 @@ import eva2.util.annotation.Description; | ||||
|  * A linear ranking method with offsets. | ||||
|  */ | ||||
| @Description("This is linear ranking normation.") | ||||
| public class SelProbLinearRanking extends AbstractSelProb implements java.io.Serializable { | ||||
| public class SelectionProbabilityLinearRanking extends AbstractSelectionProbability implements java.io.Serializable { | ||||
| 
 | ||||
|     private double nappaPlus = 1.1; | ||||
|     private double nappaMinus = 0.9; | ||||
| 
 | ||||
|     public SelProbLinearRanking() { | ||||
|     public SelectionProbabilityLinearRanking() { | ||||
|     } | ||||
| 
 | ||||
|     public SelProbLinearRanking(SelProbLinearRanking a) { | ||||
|     public SelectionProbabilityLinearRanking(SelectionProbabilityLinearRanking a) { | ||||
|         this.nappaPlus = a.nappaPlus; | ||||
|         this.nappaMinus = a.nappaMinus; | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public Object clone() { | ||||
|         return new SelProbLinearRanking(this); | ||||
|         return new SelectionProbabilityLinearRanking(this); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
| @@ -8,24 +8,24 @@ import eva2.util.annotation.Description; | ||||
|  * the given optimization problem i guess. | ||||
|  */ | ||||
| @Description("This is non-linear ranking normation.") | ||||
| public class SelProbNonLinearRanking extends AbstractSelProb implements java.io.Serializable { | ||||
| public class SelectionProbabilityNonLinearRanking extends AbstractSelectionProbability implements java.io.Serializable { | ||||
| 
 | ||||
|     private double c = 0.04; | ||||
| 
 | ||||
|     public SelProbNonLinearRanking() { | ||||
|     public SelectionProbabilityNonLinearRanking() { | ||||
|     } | ||||
| 
 | ||||
|     public SelProbNonLinearRanking(double theC) { | ||||
|     public SelectionProbabilityNonLinearRanking(double theC) { | ||||
|         this.c = theC; | ||||
|     } | ||||
| 
 | ||||
|     public SelProbNonLinearRanking(SelProbNonLinearRanking a) { | ||||
|     public SelectionProbabilityNonLinearRanking(SelectionProbabilityNonLinearRanking a) { | ||||
|         this.c = a.c; | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public Object clone() { | ||||
|         return new SelProbNonLinearRanking(this); | ||||
|         return new SelectionProbabilityNonLinearRanking(this); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
| @@ -8,17 +8,17 @@ import eva2.util.annotation.Description; | ||||
|  * This truly scaling invariant. | ||||
|  */ | ||||
| @Description("This is ranking normation.") | ||||
| public class SelProbRanking extends AbstractSelProb implements java.io.Serializable { | ||||
| public class SelectionProbabilityRanking extends AbstractSelectionProbability implements java.io.Serializable { | ||||
| 
 | ||||
|     public SelProbRanking() { | ||||
|     public SelectionProbabilityRanking() { | ||||
|     } | ||||
| 
 | ||||
|     public SelProbRanking(SelProbRanking a) { | ||||
|     public SelectionProbabilityRanking(SelectionProbabilityRanking a) { | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public Object clone() { | ||||
|         return new SelProbRanking(this); | ||||
|         return new SelectionProbabilityRanking(this); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
| @@ -9,17 +9,17 @@ import eva2.util.annotation.Description; | ||||
|  * p(i is selected) = exp(-fitness(i))/sum_j(exp(-fitness(j))) | ||||
|  */ | ||||
| @Description("This is a standard normation method using the exp function.") | ||||
| public class SelProbStandard extends AbstractSelProb implements java.io.Serializable { | ||||
| public class SelectionProbabilityStandard extends AbstractSelectionProbability implements java.io.Serializable { | ||||
| 
 | ||||
|     public SelProbStandard() { | ||||
|     public SelectionProbabilityStandard() { | ||||
|     } | ||||
| 
 | ||||
|     public SelProbStandard(SelProbStandard a) { | ||||
|     public SelectionProbabilityStandard(SelectionProbabilityStandard a) { | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public Object clone() { | ||||
|         return new SelProbStandard(this); | ||||
|         return new SelectionProbabilityStandard(this); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
| @@ -7,24 +7,24 @@ import eva2.util.annotation.Description; | ||||
|  * A simple sum with a scaling factor. | ||||
|  */ | ||||
| @Description("This is a standard normation method with scaling.") | ||||
| public class SelProbStandardScaling extends AbstractSelProb implements java.io.Serializable { | ||||
| public class SelectionProbabilityStandardScaling extends AbstractSelectionProbability implements java.io.Serializable { | ||||
| 
 | ||||
|     private double Q = 0; | ||||
| 
 | ||||
|     public SelProbStandardScaling() { | ||||
|     public SelectionProbabilityStandardScaling() { | ||||
|     } | ||||
| 
 | ||||
|     public SelProbStandardScaling(double q) { | ||||
|     public SelectionProbabilityStandardScaling(double q) { | ||||
|         Q = q; | ||||
|     } | ||||
| 
 | ||||
|     public SelProbStandardScaling(SelProbStandardScaling a) { | ||||
|     public SelectionProbabilityStandardScaling(SelectionProbabilityStandardScaling a) { | ||||
|         this.Q = a.Q; | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public Object clone() { | ||||
|         return new SelProbStandardScaling(this); | ||||
|         return new SelectionProbabilityStandardScaling(this); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
| @@ -5,6 +5,7 @@ import eva2.optimization.operator.distancemetric.PhenotypeMetric; | ||||
| import eva2.optimization.population.Population; | ||||
| import eva2.optimization.population.PopulationInterface; | ||||
| import eva2.util.annotation.Description; | ||||
| import eva2.util.annotation.Parameter; | ||||
|  | ||||
| import java.io.Serializable; | ||||
|  | ||||
| @@ -40,6 +41,7 @@ public class DiversityTerminator extends PopulationMeasureTerminator implements | ||||
|     /** | ||||
|      * @return the metric | ||||
|      */ | ||||
|     @Parameter(description = "Set the metric to be used to calculate individual distances.") | ||||
|     public InterfaceDistanceMetric getMetric() { | ||||
|         return metric; | ||||
|     } | ||||
| @@ -48,13 +50,10 @@ public class DiversityTerminator extends PopulationMeasureTerminator implements | ||||
|         this.metric = metric; | ||||
|     } | ||||
|  | ||||
|     public String metricTipText() { | ||||
|         return "Set the metric to be used to calculate individual distances."; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @return the criterion | ||||
|      */ | ||||
|     @Parameter(description = "Define the distance criterion to check for in a population.") | ||||
|     public DiversityCriterion getCriterion() { | ||||
|         return criterion; | ||||
|     } | ||||
| @@ -63,17 +62,13 @@ public class DiversityTerminator extends PopulationMeasureTerminator implements | ||||
|         this.criterion = criterion; | ||||
|     } | ||||
|  | ||||
|     public String criterionTipText() { | ||||
|         return "Define the distance criterion to check for in a population."; | ||||
|     @Override | ||||
|     protected double calculateInitialMeasure(PopulationInterface pop) { | ||||
|         return calculatePopulationMeasure(pop); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     protected double calcInitialMeasure(PopulationInterface pop) { | ||||
|         return calcPopulationMeasure(pop); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     protected double calcPopulationMeasure(PopulationInterface pop) { | ||||
|     protected double calculatePopulationMeasure(PopulationInterface pop) { | ||||
|         double[] measures = ((Population) pop).getPopulationMeasures(metric); | ||||
|         int measureIndex = criterion.ordinal(); | ||||
|         return measures[measureIndex]; | ||||
|   | ||||
| @@ -23,8 +23,7 @@ public class EvaluationTerminator implements InterfaceTerminator, | ||||
|      */ | ||||
|     protected int maxFitnessCalls = 1000; | ||||
|  | ||||
|     public EvaluationTerminator() { | ||||
|     } | ||||
|     public EvaluationTerminator() {} | ||||
|  | ||||
|     @Override | ||||
|     public void initialize(InterfaceOptimizationProblem prob) { | ||||
|   | ||||
| @@ -30,12 +30,12 @@ public class FitnessConvergenceTerminator extends PopulationMeasureTerminator | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     protected double calcInitialMeasure(PopulationInterface pop) { | ||||
|     protected double calculateInitialMeasure(PopulationInterface pop) { | ||||
|         return Mathematics.norm(pop.getBestFitness()); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     protected double calcPopulationMeasure(PopulationInterface pop) { | ||||
|     protected double calculatePopulationMeasure(PopulationInterface pop) { | ||||
| //		if (oldFit==null) return Double.MAX_VALUE; | ||||
| //		return EuclideanMetric.euclideanDistance(oldFit, pop.getBestFitness()); | ||||
|         return Mathematics.norm(pop.getBestFitness()); | ||||
|   | ||||
| @@ -44,8 +44,8 @@ public class FitnessValueTerminator implements InterfaceTerminator, | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public boolean isTerminated(PopulationInterface Pop) { | ||||
|         double[] fit = Pop.getBestFitness(); | ||||
|     public boolean isTerminated(PopulationInterface pop) { | ||||
|         double[] fit = pop.getBestFitness(); | ||||
|         for (int i = 0; i < fit.length; i++) { | ||||
|             if (fitnessValue[i] < fit[i]) { | ||||
|                 return false; | ||||
|   | ||||
| @@ -4,6 +4,7 @@ import eva2.optimization.population.InterfaceSolutionSet; | ||||
| import eva2.optimization.population.PopulationInterface; | ||||
| import eva2.problems.InterfaceOptimizationProblem; | ||||
| import eva2.util.annotation.Description; | ||||
| import eva2.util.annotation.Parameter; | ||||
|  | ||||
| import java.io.Serializable; | ||||
|  | ||||
| @@ -24,8 +25,7 @@ public class GenerationTerminator implements InterfaceTerminator, Serializable { | ||||
|         msg = "Not terminated."; | ||||
|     } | ||||
|  | ||||
|     public GenerationTerminator() { | ||||
|     } | ||||
|     public GenerationTerminator() {} | ||||
|  | ||||
|     public GenerationTerminator(int gens) { | ||||
|         maxGenerations = gens; | ||||
| @@ -37,8 +37,8 @@ public class GenerationTerminator implements InterfaceTerminator, Serializable { | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public boolean isTerminated(PopulationInterface Pop) { | ||||
|         if (maxGenerations < Pop.getGeneration()) { | ||||
|     public boolean isTerminated(PopulationInterface pop) { | ||||
|         if (maxGenerations < pop.getGeneration()) { | ||||
|             msg = maxGenerations + " generations reached."; | ||||
|             return true; | ||||
|         } | ||||
| @@ -52,10 +52,10 @@ public class GenerationTerminator implements InterfaceTerminator, Serializable { | ||||
|  | ||||
|     @Override | ||||
|     public String toString() { | ||||
|         String ret = "Generations calls=" + maxGenerations; | ||||
|         return ret; | ||||
|         return "Generations calls=" + maxGenerations; | ||||
|     } | ||||
|  | ||||
|     @Parameter(description = "Number of generations to evaluate.") | ||||
|     public void setGenerations(int x) { | ||||
|         maxGenerations = x; | ||||
|     } | ||||
| @@ -63,13 +63,4 @@ public class GenerationTerminator implements InterfaceTerminator, Serializable { | ||||
|     public int getGenerations() { | ||||
|         return maxGenerations; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Returns the tip text for this property | ||||
|      * | ||||
|      * @return tip text for this property | ||||
|      */ | ||||
|     public String generationsTipText() { | ||||
|         return "number of generations to evaluate."; | ||||
|     } | ||||
| } | ||||
| @@ -7,6 +7,7 @@ import eva2.problems.InterfaceMultimodalProblemKnown; | ||||
| import eva2.problems.InterfaceOptimizationProblem; | ||||
| import eva2.tools.EVAERROR; | ||||
| import eva2.util.annotation.Description; | ||||
| import eva2.util.annotation.Parameter; | ||||
|  | ||||
| import java.io.Serializable; | ||||
| import java.util.logging.Level; | ||||
| @@ -25,16 +26,15 @@ public class KnownOptimaFoundTerminator implements InterfaceTerminator, Serializ | ||||
|     private int reqOptima = 1; | ||||
|     private String msg = ""; | ||||
|  | ||||
|     public KnownOptimaFoundTerminator() { | ||||
|     } | ||||
|     public KnownOptimaFoundTerminator() {} | ||||
|  | ||||
|     @Override | ||||
|     public void initialize(InterfaceOptimizationProblem prob) { | ||||
|     public void initialize(InterfaceOptimizationProblem prob) throws IllegalArgumentException { | ||||
|         if (prob != null) { | ||||
|             if (prob instanceof InterfaceMultimodalProblemKnown) { | ||||
|                 mProblem = (InterfaceMultimodalProblemKnown) prob; | ||||
|             } else { | ||||
|                 LOGGER.log(Level.WARNING, "KnownOptimaFoundTerminator only works with InterfaceMultimodalProblemKnown instances!"); | ||||
|                 throw new IllegalArgumentException("KnownOptimaFoundTerminator only works with InterfaceMultimodalProblemKnown instances!"); | ||||
|             } | ||||
|         } else { | ||||
|             LOGGER.log(Level.WARNING, "KnownOptimaFoundTerminator wont work with null problem!"); | ||||
| @@ -71,21 +71,18 @@ public class KnownOptimaFoundTerminator implements InterfaceTerminator, Serializ | ||||
|     /** | ||||
|      * @return the reqOptima | ||||
|      */ | ||||
|     public int getReqOptima() { | ||||
|     public int getRequiredOptima() { | ||||
|         return reqOptima; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param reqOptima the reqOptima to set | ||||
|      */ | ||||
|     public void setReqOptima(int reqOptima) { | ||||
|     @Parameter(description = "The number of optima that need to be found to terminate the optimization.") | ||||
|     public void setRequiredOptima(int reqOptima) { | ||||
|         this.reqOptima = reqOptima; | ||||
|     } | ||||
|  | ||||
|     public String reqOptimaTipText() { | ||||
|         return "The number of optima that need to be found to terminate the optimization."; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public String toString() { | ||||
|         return "KnownOptimaFoundTerminator requiring " + reqOptima + " optima."; | ||||
|   | ||||
| @@ -9,6 +9,7 @@ import eva2.problems.AbstractMultiObjectiveOptimizationProblem; | ||||
| import eva2.problems.InterfaceOptimizationProblem; | ||||
| import eva2.tools.EVAERROR; | ||||
| import eva2.util.annotation.Description; | ||||
| import eva2.util.annotation.Parameter; | ||||
|  | ||||
| import java.io.Serializable; | ||||
|  | ||||
| @@ -50,13 +51,12 @@ public class ParetoMetricTerminator extends PopulationMeasureTerminator implemen | ||||
|         if (prob instanceof AbstractMultiObjectiveOptimizationProblem) { | ||||
|             moProb = (AbstractMultiObjectiveOptimizationProblem) prob; | ||||
|         } else { | ||||
|             moProb = null; | ||||
|             EVAERROR.errorMsgOnce("Error, " + this.getClass() + " works only with problems inheriting from " + AbstractMultiObjectiveOptimizationProblem.class + "!"); | ||||
|             throw new IllegalArgumentException("Error, " + this.getClass() + " works only with problems inheriting from " + AbstractMultiObjectiveOptimizationProblem.class + "!"); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     protected double calcInitialMeasure(PopulationInterface pop) { | ||||
|     protected double calculateInitialMeasure(PopulationInterface pop) { | ||||
|         if (moProb == null) { | ||||
|             return Double.MAX_VALUE; | ||||
|         } else { | ||||
| @@ -69,8 +69,8 @@ public class ParetoMetricTerminator extends PopulationMeasureTerminator implemen | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     protected double calcPopulationMeasure(PopulationInterface pop) { | ||||
|         return calcInitialMeasure(pop); | ||||
|     protected double calculatePopulationMeasure(PopulationInterface pop) { | ||||
|         return calculateInitialMeasure(pop); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
| @@ -89,6 +89,7 @@ public class ParetoMetricTerminator extends PopulationMeasureTerminator implemen | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     @Parameter(description = "The pareto metric to use") | ||||
|     public void setParetoMetric(InterfaceParetoFrontMetric pMetric) { | ||||
|         this.pMetric = pMetric; | ||||
|     } | ||||
| @@ -97,10 +98,7 @@ public class ParetoMetricTerminator extends PopulationMeasureTerminator implemen | ||||
|         return pMetric; | ||||
|     } | ||||
|  | ||||
|     public String paretoMetricTipText() { | ||||
|         return "The pareto metric to use"; | ||||
|     } | ||||
|  | ||||
|     @Parameter(description = "If true, the current population is used, otherwise the pareto front of the multi-objective problem instance is used") | ||||
|     public void setUseCurrentPop(boolean useCurrentPop) { | ||||
|         this.useCurrentPop = useCurrentPop; | ||||
|     } | ||||
| @@ -108,8 +106,4 @@ public class ParetoMetricTerminator extends PopulationMeasureTerminator implemen | ||||
|     public boolean isUseCurrentPop() { | ||||
|         return useCurrentPop; | ||||
|     } | ||||
|  | ||||
|     public String useCurrentPopTipText() { | ||||
|         return "If true, the current population is used, otherwise the pareto front of the multi-objective problem instance is used"; | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -34,13 +34,13 @@ public class PhenotypeConvergenceTerminator extends PopulationMeasureTerminator | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     protected double calcInitialMeasure(PopulationInterface pop) { | ||||
|     protected double calculateInitialMeasure(PopulationInterface pop) { | ||||
|         oldIndy = (AbstractEAIndividual) ((AbstractEAIndividual) pop.getBestIndividual()).clone(); | ||||
|         return Double.MAX_VALUE; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     protected double calcPopulationMeasure(PopulationInterface pop) { | ||||
|     protected double calculatePopulationMeasure(PopulationInterface pop) { | ||||
|         return pMetric.distance(oldIndy, (AbstractEAIndividual) pop.getBestIndividual()); | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -4,6 +4,7 @@ import eva2.optimization.individuals.IndividualWeightedFitnessComparator; | ||||
| import eva2.optimization.population.Population; | ||||
| import eva2.optimization.population.PopulationInterface; | ||||
| import eva2.util.annotation.Description; | ||||
| import eva2.util.annotation.Parameter; | ||||
|  | ||||
| /** | ||||
|  * Terminate if a score based on the archive of the population converges. | ||||
| @@ -14,22 +15,22 @@ public class PopulationArchiveTerminator extends PopulationMeasureTerminator { | ||||
|     IndividualWeightedFitnessComparator wfComp = new IndividualWeightedFitnessComparator(new double[]{1.}); | ||||
|  | ||||
|     @Override | ||||
|     protected double calcInitialMeasure(PopulationInterface pop) { | ||||
|     protected double calculateInitialMeasure(PopulationInterface pop) { | ||||
|         Population archive = ((Population) pop).getArchive(); | ||||
|         if (archive == null || (archive.size() < 1)) { | ||||
|             return Double.MAX_VALUE; | ||||
|         } else { | ||||
|             return wfComp.calcScore(archive.getBestEAIndividual(wfComp)); | ||||
|             return wfComp.calculateScore(archive.getBestEAIndividual(wfComp)); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     protected double calcPopulationMeasure(PopulationInterface pop) { | ||||
|     protected double calculatePopulationMeasure(PopulationInterface pop) { | ||||
|         Population archive = ((Population) pop).getArchive(); | ||||
|         if (archive == null || (archive.size() < 1)) { | ||||
|             return Double.MAX_VALUE; | ||||
|         } else { | ||||
|             return wfComp.calcScore(archive.getBestEAIndividual(wfComp)); | ||||
|             return wfComp.calculateScore(archive.getBestEAIndividual(wfComp)); | ||||
|         } | ||||
|     } | ||||
|  | ||||
| @@ -42,11 +43,8 @@ public class PopulationArchiveTerminator extends PopulationMeasureTerminator { | ||||
|         return wfComp.getFitWeights(); | ||||
|     } | ||||
|  | ||||
|     @Parameter(description = "Weights of the fitness values in the linear combination") | ||||
|     public void setFitWeights(double[] fWeights) { | ||||
|         wfComp.setFitWeights(fWeights); | ||||
|     } | ||||
|  | ||||
|     public String fitWeightsTipText() { | ||||
|         return wfComp.fitWeightsTipText(); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -4,6 +4,7 @@ import eva2.optimization.population.PopulationInterface; | ||||
| import eva2.optimization.population.InterfaceSolutionSet; | ||||
| import eva2.problems.InterfaceOptimizationProblem; | ||||
| import eva2.util.annotation.Description; | ||||
| import eva2.util.annotation.Parameter; | ||||
|  | ||||
| import java.io.Serializable; | ||||
|  | ||||
| @@ -14,11 +15,11 @@ import java.io.Serializable; | ||||
|  * The class detects changes of a population measure over time and may signal convergence | ||||
|  * if the measure m(P) behaved in a certain way for a given time. Convergence may | ||||
|  * be signaled | ||||
|  * - if the measure reached absolute values below convThresh (absolute value), | ||||
|  * - if the measure remained within m(P)+/-convThresh (absolute change), | ||||
|  * - if the measure remained above m(P)-convThresh (absolute change and regard improvement only), | ||||
|  * - if the measure remained within m(P)*[1-convThresh, 1+convThresh] (relative change), | ||||
|  * - if the measure remained above m(P)*(1-convThresh) (relative change and regard improvement only). | ||||
|  * - if the measure reached absolute values below convergenceThresh (absolute value), | ||||
|  * - if the measure remained within m(P)+/-convergenceThresh (absolute change), | ||||
|  * - if the measure remained above m(P)-convergenceThresh (absolute change and regard improvement only), | ||||
|  * - if the measure remained within m(P)*[1-convergenceThresh, 1+convergenceThresh] (relative change), | ||||
|  * - if the measure remained above m(P)*(1-convergenceThresh) (relative change and regard improvement only). | ||||
|  */ | ||||
| @Description("Stop if a convergence criterion has been met.") | ||||
| public abstract class PopulationMeasureTerminator implements InterfaceTerminator, Serializable { | ||||
| @@ -28,9 +29,9 @@ public abstract class PopulationMeasureTerminator implements InterfaceTerminator | ||||
|  | ||||
|     public enum StagnationTypeEnum {fitnessCallBased, generationBased} | ||||
|  | ||||
|     private double convThresh = 0.01; //, convThreshLower=0.02; | ||||
|     private double convergenceThresh = 0.01; | ||||
|     private double oldMeasure = -1; | ||||
|     private int stagTime = 1000; | ||||
|     private int stagnationTime = 1000; | ||||
|     private int oldPopFitCalls = 1000; | ||||
|     private int oldPopGens = 1000; | ||||
|     private boolean firstTime = true; | ||||
| @@ -43,16 +44,16 @@ public abstract class PopulationMeasureTerminator implements InterfaceTerminator | ||||
|     } | ||||
|  | ||||
|     public PopulationMeasureTerminator(double convergenceThreshold, int stagnationTime, StagnationTypeEnum stagType, ChangeTypeEnum changeType, DirectionTypeEnum dirType) { | ||||
|         this.convThresh = convergenceThreshold; | ||||
|         this.stagTime = stagnationTime; | ||||
|         this.convergenceThresh = convergenceThreshold; | ||||
|         this.stagnationTime = stagnationTime; | ||||
|         this.stagnationMeasure = stagType; | ||||
|         this.changeType = changeType; | ||||
|         this.condDirection = dirType; | ||||
|     } | ||||
|  | ||||
|     public PopulationMeasureTerminator(PopulationMeasureTerminator o) { | ||||
|         convThresh = o.convThresh; | ||||
|         stagTime = o.stagTime; | ||||
|         convergenceThresh = o.convergenceThresh; | ||||
|         stagnationTime = o.stagnationTime; | ||||
|         oldPopFitCalls = o.oldPopFitCalls; | ||||
|         oldPopGens = o.oldPopGens; | ||||
|         firstTime = o.firstTime; | ||||
| @@ -80,16 +81,16 @@ public abstract class PopulationMeasureTerminator implements InterfaceTerminator | ||||
|         if (!firstTime && isStillConverged(pop)) { | ||||
|  | ||||
|             if (stagnationTimeHasPassed(pop)) { | ||||
|                 // population hasnt changed much for max time, criterion is met | ||||
|                 // population hasn't changed much for max time, criterion is met | ||||
|                 msg = getTerminationMessage(); | ||||
|                 return true; | ||||
|             } else { | ||||
|                 // population hasnt changed much for i<max time, keep running | ||||
|                 // population hasn't changed much for i<max time, keep running | ||||
|                 return false; | ||||
|             } | ||||
|         } else { | ||||
|             // first call at all - or population improved more than "allowed" to terminate | ||||
|             oldMeasure = calcInitialMeasure(pop); | ||||
|             oldMeasure = calculateInitialMeasure(pop); | ||||
|             saveState(pop); | ||||
|             return false; | ||||
|         } | ||||
| @@ -100,7 +101,7 @@ public abstract class PopulationMeasureTerminator implements InterfaceTerminator | ||||
|      * | ||||
|      * @return | ||||
|      */ | ||||
|     protected abstract double calcInitialMeasure(PopulationInterface pop); | ||||
|     protected abstract double calculateInitialMeasure(PopulationInterface pop); | ||||
|  | ||||
|     @Override | ||||
|     public String lastTerminationMessage() { | ||||
| @@ -114,7 +115,6 @@ public abstract class PopulationMeasureTerminator implements InterfaceTerminator | ||||
|      */ | ||||
|     protected String getTerminationMessage() { | ||||
|         StringBuilder sb = new StringBuilder(getMeasureName()); | ||||
| //		if (convergenceCondition.isSelectedString("Relative")) sb.append(" converged relatively "); | ||||
|         switch (changeType) { | ||||
|             case absoluteChange: | ||||
|                 sb.append(" changed absolutely "); | ||||
| @@ -128,15 +128,13 @@ public abstract class PopulationMeasureTerminator implements InterfaceTerminator | ||||
|         } | ||||
|         if (doCheckImprovement()) { | ||||
|             sb.append("less than "); | ||||
|             sb.append(convThresh); | ||||
|             sb.append(convergenceThresh); | ||||
|         } else { | ||||
|             sb.append("within +/-"); | ||||
| //			sb.append(convThreshLower); | ||||
| //			sb.append("/"); | ||||
|             sb.append(convThresh); | ||||
|             sb.append(convergenceThresh); | ||||
|         } | ||||
|         sb.append(" for "); | ||||
|         sb.append(stagTime); | ||||
|         sb.append(stagnationTime); | ||||
|         if (stagnationMeasure == StagnationTypeEnum.generationBased) { | ||||
|             sb.append(" generations."); | ||||
|         } else { | ||||
| @@ -159,8 +157,7 @@ public abstract class PopulationMeasureTerminator implements InterfaceTerminator | ||||
|      * @param pop | ||||
|      */ | ||||
|     protected void saveState(PopulationInterface pop) { | ||||
| //		oldFit = pop.getBestFitness().clone(); | ||||
|         oldMeasure = calcPopulationMeasure(pop); | ||||
|         oldMeasure = calculatePopulationMeasure(pop); | ||||
|         oldPopFitCalls = pop.getFunctionCalls(); | ||||
|         oldPopGens = pop.getGeneration(); | ||||
|         firstTime = false; | ||||
| @@ -173,7 +170,7 @@ public abstract class PopulationMeasureTerminator implements InterfaceTerminator | ||||
|      * @param pop | ||||
|      * @return | ||||
|      */ | ||||
|     protected abstract double calcPopulationMeasure(PopulationInterface pop); | ||||
|     protected abstract double calculatePopulationMeasure(PopulationInterface pop); | ||||
|  | ||||
|     /** | ||||
|      * Return true if the population measure did not exceed the | ||||
| @@ -183,22 +180,21 @@ public abstract class PopulationMeasureTerminator implements InterfaceTerminator | ||||
|      * @return | ||||
|      */ | ||||
|     protected boolean isStillConverged(PopulationInterface pop) { | ||||
|         double measure = calcPopulationMeasure(pop); | ||||
|         double measure = calculatePopulationMeasure(pop); | ||||
|         double allowedLower = Double.NEGATIVE_INFINITY, allowedUpper = Double.POSITIVE_INFINITY; | ||||
|         boolean ret; | ||||
|         switch (changeType) { | ||||
|             case absoluteChange: | ||||
|                 allowedLower = oldMeasure - convThresh; | ||||
|                 allowedLower = oldMeasure - convergenceThresh; | ||||
|                 if (!doCheckImprovement()) { | ||||
|                     allowedUpper = oldMeasure + convThresh; | ||||
|                     allowedUpper = oldMeasure + convergenceThresh; | ||||
|                 } | ||||
|                 break; | ||||
|             case absoluteValue: | ||||
|                 allowedUpper = convThresh; | ||||
| //			if (!doCheckImprovement()) allowedUpper = convThreshUpper; | ||||
|                 allowedUpper = convergenceThresh; | ||||
|                 break; | ||||
|             case relativeChange: | ||||
|                 double delta = oldMeasure * convThresh; | ||||
|                 double delta = oldMeasure * convergenceThresh; | ||||
|                 allowedLower = oldMeasure - delta; | ||||
|                 if (!doCheckImprovement()) { | ||||
|                     allowedUpper = oldMeasure + delta; | ||||
| @@ -211,7 +207,6 @@ public abstract class PopulationMeasureTerminator implements InterfaceTerminator | ||||
|  | ||||
|     public boolean doCheckImprovement() { | ||||
|         return (condDirection == DirectionTypeEnum.decrease); | ||||
| //		return condImprovementOrChange.isSelectedString("Improvement"); | ||||
|     } | ||||
|  | ||||
|     public boolean isRelativeConvergence() { | ||||
| @@ -220,43 +215,38 @@ public abstract class PopulationMeasureTerminator implements InterfaceTerminator | ||||
|  | ||||
|     /** | ||||
|      * Return true if the defined stagnation time (function calls or generations) has passed | ||||
|      * since the last noteable change. | ||||
|      * since the last notable change. | ||||
|      * | ||||
|      * @param pop | ||||
|      * @return | ||||
|      */ | ||||
|     private boolean stagnationTimeHasPassed(PopulationInterface pop) { | ||||
|         if (stagnationMeasure == StagnationTypeEnum.fitnessCallBased) { // by fitness calls | ||||
|             return (pop.getFunctionCalls() - oldPopFitCalls) >= stagTime; | ||||
|             return (pop.getFunctionCalls() - oldPopFitCalls) >= stagnationTime; | ||||
|         } else {// by generation | ||||
|             return (pop.getGeneration() - oldPopGens) >= stagTime; | ||||
|             return (pop.getGeneration() - oldPopGens) >= stagnationTime; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     @Parameter(description = "Ratio of improvement/change or absolute value of improvement/change to determine convergence.") | ||||
|     public void setConvergenceThreshold(double x) { | ||||
|         convThresh = x; | ||||
|         convergenceThresh = x; | ||||
|     } | ||||
|  | ||||
|     public double getConvergenceThreshold() { | ||||
|         return convThresh; | ||||
|     } | ||||
|  | ||||
|     public String convergenceThresholdTipText() { | ||||
|         return "Ratio of improvement/change or absolute value of improvement/change to determine convergence."; | ||||
|         return convergenceThresh; | ||||
|     } | ||||
|  | ||||
|     @Parameter(description = "Terminate if the population has not improved/changed for this time") | ||||
|     public void setStagnationTime(int k) { | ||||
|         stagTime = k; | ||||
|         stagnationTime = k; | ||||
|     } | ||||
|  | ||||
|     public int getStagnationTime() { | ||||
|         return stagTime; | ||||
|     } | ||||
|  | ||||
|     public String stagnationTimeTipText() { | ||||
|         return "Terminate if the population has not improved/changed for this time"; | ||||
|         return stagnationTime; | ||||
|     } | ||||
|  | ||||
|     @Parameter(description = "Stagnation time is measured in fitness calls or generations") | ||||
|     public StagnationTypeEnum getStagnationMeasure() { | ||||
|         return stagnationMeasure; | ||||
|     } | ||||
| @@ -265,31 +255,21 @@ public abstract class PopulationMeasureTerminator implements InterfaceTerminator | ||||
|         this.stagnationMeasure = stagnationTimeIn; | ||||
|     } | ||||
|  | ||||
|     public String stagnationMeasureTipText() { | ||||
|         return "Stagnation time is measured in fitness calls or generations"; | ||||
|     } | ||||
|  | ||||
|     public ChangeTypeEnum getConvergenceCondition() { | ||||
|         return changeType; | ||||
|     } | ||||
|  | ||||
|     @Parameter(description = "Select absolute or relative convergence condition") | ||||
|     public void setConvergenceCondition(ChangeTypeEnum convergenceCondition) { | ||||
|         this.changeType = convergenceCondition; | ||||
|     } | ||||
|  | ||||
|     public String convergenceConditionTipText() { | ||||
|         return "Select absolute or relative convergence condition"; | ||||
|     } | ||||
|  | ||||
|     public DirectionTypeEnum getCheckType() { | ||||
|         return condDirection; | ||||
|     } | ||||
|  | ||||
|     @Parameter(description = "Detect improvement only (decreasing measure) or change in both directions (decrease and increase)") | ||||
|     public void setCheckType(DirectionTypeEnum dt) { | ||||
|         this.condDirection = dt; | ||||
|     } | ||||
|  | ||||
|     public String checkTypeTipText() { | ||||
|         return "Detect improvement only (decreasing measure) or change in both directions (decrease and increase)"; | ||||
|     } | ||||
| } | ||||
| @@ -7,7 +7,7 @@ import eva2.optimization.operator.distancemetric.EuclideanMetric; | ||||
| import eva2.optimization.operator.distancemetric.InterfaceDistanceMetric; | ||||
| import eva2.optimization.operator.distancemetric.PhenotypeMetric; | ||||
| import eva2.optimization.operator.postprocess.PostProcess; | ||||
| import eva2.optimization.operator.selection.probability.AbstractSelProb; | ||||
| import eva2.optimization.operator.selection.probability.AbstractSelectionProbability; | ||||
| import eva2.tools.EVAERROR; | ||||
| import eva2.tools.Pair; | ||||
| import eva2.tools.Serializer; | ||||
| @@ -722,9 +722,7 @@ public class Population extends ArrayList<AbstractEAIndividual> implements Popul | ||||
|             this.historyList.add((AbstractEAIndividual) this.getBestEAIndividual().clone()); | ||||
|         } | ||||
|         if (isAutoAging()) { | ||||
|             for (AbstractEAIndividual individual : this) { | ||||
|                 individual.incrAge(); | ||||
|             } | ||||
|             this.forEach(AbstractEAIndividual::incrAge); | ||||
|         } | ||||
|         this.generationCount++; | ||||
|         firePropertyChangedEvent(NEXT_GENERATION_PERFORMED); | ||||
| @@ -885,7 +883,7 @@ public class Population extends ArrayList<AbstractEAIndividual> implements Popul | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Resets the fitnes to the maximum possible value for the given individual. | ||||
|      * Resets the fitness to the maximum possible value for the given individual. | ||||
|      * | ||||
|      * @param indy an individual whose fitness will be reset | ||||
|      */ | ||||
| @@ -1040,7 +1038,7 @@ public class Population extends ArrayList<AbstractEAIndividual> implements Popul | ||||
|      * @param comparator indicate whether constraints should be regarded | ||||
|      * @return The index of the best (worst) individual. | ||||
|      */ | ||||
|     public int getIndexOfBestOrWorstIndividual(boolean bBest, Comparator<Object> comparator) { | ||||
|     public int getIndexOfBestOrWorstIndividual(boolean bBest, Comparator<AbstractEAIndividual> comparator) { | ||||
|         ArrayList<?> sorted = getSorted(comparator); | ||||
|         if (bBest) { | ||||
|             return indexOf(sorted.get(0)); | ||||
| @@ -1053,7 +1051,7 @@ public class Population extends ArrayList<AbstractEAIndividual> implements Popul | ||||
|         return getIndexOfBestOrWorstIndividual(true, comparator); | ||||
|     } | ||||
|  | ||||
|     public AbstractEAIndividual getBestEAIndividual(Comparator<Object> comparator) { | ||||
|     public AbstractEAIndividual getBestEAIndividual(Comparator<AbstractEAIndividual> comparator) { | ||||
|         int index = getIndexOfBestOrWorstIndividual(true, comparator); | ||||
|         return getEAIndividual(index); | ||||
|     } | ||||
| @@ -1201,7 +1199,7 @@ public class Population extends ArrayList<AbstractEAIndividual> implements Popul | ||||
|      *         fitness first | ||||
|      * @see #getSortedNIndividuals(int, boolean, Population, Comparator) | ||||
|      */ | ||||
|     public Population getSortedBestFirst(Comparator<Object> comp) { | ||||
|     public Population getSortedBestFirst(Comparator<AbstractEAIndividual> comp) { | ||||
|         Population result = this.cloneWithoutInds(); | ||||
|         getSortedNIndividuals(size(), true, result, comp); | ||||
|         result.synchSize(); | ||||
| @@ -1221,7 +1219,7 @@ public class Population extends ArrayList<AbstractEAIndividual> implements Popul | ||||
|      * @param comp         the Comparator to use with individuals | ||||
|      * @param res The m sorted best or worst individuals, where m <= n (will be added to res) | ||||
|      */ | ||||
|     public void getSortedNIndividuals(int n, boolean bBestOrWorst, Population res, Comparator<Object> comp) { | ||||
|     public void getSortedNIndividuals(int n, boolean bBestOrWorst, Population res, Comparator<AbstractEAIndividual> comp) { | ||||
|         if ((n < 0) || (n > super.size())) { | ||||
|             // this may happen, treat it gracefully | ||||
|             //System.err.println("invalid request to getSortedNIndividuals: n="+n + ", size is " + super.size()); | ||||
| @@ -1293,7 +1291,7 @@ public class Population extends ArrayList<AbstractEAIndividual> implements Popul | ||||
|      *             on AbstractEAIndividual instances. | ||||
|      * @return | ||||
|      */ | ||||
|     protected ArrayList<AbstractEAIndividual> sortBy(Comparator<Object> comp) { | ||||
|     protected ArrayList<AbstractEAIndividual> sortBy(Comparator<AbstractEAIndividual> comp) { | ||||
|         if (super.isEmpty()) { | ||||
|             return new ArrayList<>(); | ||||
|         } | ||||
| @@ -1322,7 +1320,7 @@ public class Population extends ArrayList<AbstractEAIndividual> implements Popul | ||||
|      * @param comp The comparator | ||||
|      * @return | ||||
|      */ | ||||
|     public ArrayList<AbstractEAIndividual> getSorted(Comparator<Object> comp) { | ||||
|     public ArrayList<AbstractEAIndividual> getSorted(Comparator<AbstractEAIndividual> comp) { | ||||
|         if (!comp.equals(lastSortingComparator) || (sortedArr == null) || (super.modCount != lastQModCount)) { | ||||
|             ArrayList<AbstractEAIndividual> sArr = sortBy(comp); | ||||
|             if (sortedArr == null) { | ||||
| @@ -1342,7 +1340,7 @@ public class Population extends ArrayList<AbstractEAIndividual> implements Popul | ||||
|      * | ||||
|      * @see #getSorted(java.util.Comparator) | ||||
|      */ | ||||
|     public Population getSortedPop(Comparator<Object> comp) { | ||||
|     public Population getSortedPop(Comparator<AbstractEAIndividual> comp) { | ||||
|         Population pop = this.cloneWithoutInds(); | ||||
|         ArrayList<AbstractEAIndividual> sortedIndies = getSorted(comp); | ||||
|         pop.addAll(sortedIndies); | ||||
| @@ -2093,7 +2091,7 @@ public class Population extends ArrayList<AbstractEAIndividual> implements Popul | ||||
|      */ | ||||
|     public double[] getCenter() { | ||||
|         if (size() == 0) { | ||||
|             EVAERROR.errorMsgOnce("Invalid pop size in DistractingPopulation:getCenter!"); | ||||
|             return null; | ||||
|         } | ||||
|         double[] centerPos = AbstractEAIndividual.getDoublePosition(getEAIndividual(0)); | ||||
|         for (int i = 1; i < size(); i++) { | ||||
| @@ -2125,7 +2123,7 @@ public class Population extends ArrayList<AbstractEAIndividual> implements Popul | ||||
|      */ | ||||
|     public double[] getCenterWeighted(double[] weights) { | ||||
|         if (size() == 0 || (weights.length > size()) || (weights.length == 0)) { | ||||
|             EVAERROR.errorMsgOnce("Invalid pop size in DistractingPopulation:getCenterWeighted!"); | ||||
|             return null; | ||||
|         } | ||||
|         double[] centerPos = AbstractEAIndividual.getDoublePosition(getEAIndividual(0)); | ||||
|         Mathematics.svMult(weights[0], centerPos, centerPos); | ||||
| @@ -2145,7 +2143,7 @@ public class Population extends ArrayList<AbstractEAIndividual> implements Popul | ||||
|      * @param criterion | ||||
|      * @return | ||||
|      */ | ||||
|     public double[] getCenterWeighted(AbstractSelProb selProb, int criterion, boolean obeyConst) { | ||||
|     public double[] getCenterWeighted(AbstractSelectionProbability selProb, int criterion, boolean obeyConst) { | ||||
|         selProb.computeSelectionProbability(this, "Fitness", obeyConst); | ||||
|         double[] mean = AbstractEAIndividual.getDoublePosition(getEAIndividual(0)); | ||||
|  | ||||
|   | ||||
| @@ -44,7 +44,7 @@ import java.util.Vector; | ||||
| public class ParticleSwarmOptimization extends AbstractOptimizer implements java.io.Serializable, InterfaceAdditionalPopulationInformer { | ||||
|  | ||||
|     public enum PSOType { Inertness, Constriction } | ||||
|     Object[] sortedPop = null; | ||||
|     AbstractEAIndividual[] sortedPop = null; | ||||
|     protected AbstractEAIndividual bestIndividual = null; | ||||
|     protected boolean checkRange = true; | ||||
|     protected boolean checkSpeedLimit = false; | ||||
| @@ -1299,7 +1299,7 @@ public class ParticleSwarmOptimization extends AbstractOptimizer implements java | ||||
|             } | ||||
|         } | ||||
|         if ((topology == PSOTopology.multiSwarm) || (topology == PSOTopology.tree)) { | ||||
|             sortedPop = pop.toArray(); | ||||
|             sortedPop = pop.toArray(new AbstractEAIndividual[pop.size()]); | ||||
|             if ((topology == PSOTopology.multiSwarm) || (treeStruct >= 2)) { | ||||
|                 Arrays.sort(sortedPop, new EAIndividualComparator()); | ||||
|             } else { | ||||
|   | ||||
| @@ -3,9 +3,6 @@ package eva2.tools; | ||||
| import java.util.HashMap; | ||||
| import java.util.Map; | ||||
|  | ||||
| /** | ||||
|  * Created by halfdan on 17/12/15. | ||||
|  */ | ||||
| public class Primitives { | ||||
|     public static Class<?> unwrap(Class<?> clazz) { | ||||
|         return getWrapperTypes().get(clazz); | ||||
|   | ||||
| @@ -71,9 +71,6 @@ public class SelectedTag implements java.io.Serializable { | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     //~ Methods //////////////////////////////////////////////////////////////// | ||||
|  | ||||
|  | ||||
|     /** | ||||
|      * Set the selected tag by index. | ||||
|      * | ||||
| @@ -197,23 +194,5 @@ public class SelectedTag implements java.io.Serializable { | ||||
|     @Override | ||||
|     public String toString() { | ||||
|         return tags[selectedId].getString(); | ||||
| //		Character selSign = '*'; | ||||
| //		Character separator = '|'; | ||||
| //		StringBuffer sbuf; | ||||
| //		if (selectedId != 0) sbuf = new StringBuffer(tags[0].getString()); | ||||
| //		else { | ||||
| //			sbuf = new StringBuffer(selSign.toString()); | ||||
| //			sbuf.append(tags[0].getString()); | ||||
| //			sbuf.append(selSign); | ||||
| //		} | ||||
| //		for (int i=1; i<tags.length; i++) { | ||||
| //			sbuf.append(separator); | ||||
| //			if (selectedId == i) { | ||||
| //				sbuf.append(selSign); | ||||
| //				sbuf.append(tags[i].getString()); | ||||
| //				sbuf.append(selSign); | ||||
| //			} else sbuf.append(tags[i].getString()); | ||||
| //		} | ||||
| //		return sbuf.toString(); | ||||
|     } | ||||
| } | ||||
| @@ -2,18 +2,43 @@ package eva2.optimization.individuals; | ||||
|  | ||||
| import org.junit.Test; | ||||
|  | ||||
| import static org.junit.Assert.assertFalse; | ||||
| import static org.junit.Assert.assertTrue; | ||||
|  | ||||
| /** | ||||
|  */ | ||||
| public class AbstractEAIndividualTest { | ||||
|  | ||||
|     @Test | ||||
|     public void testIsDominatingFitness() throws Exception { | ||||
|         // Single objective | ||||
|         double[] fit1 = new double[]{405.231322}; | ||||
|         double[] fit2 = new double[]{123.128371293}; | ||||
|  | ||||
|         assertTrue(AbstractEAIndividual.isDominatingFitness(fit2, fit1)); | ||||
|         assertFalse(AbstractEAIndividual.isDominatingFitness(fit1, fit2)); | ||||
|  | ||||
|         // Multi objective | ||||
|         fit1 = new double[]{12.0, 10.0, 8.0}; | ||||
|         fit2 = new double[]{11.0, 10.0, 9.0}; | ||||
|  | ||||
|         assertFalse(AbstractEAIndividual.isDominatingFitness(fit1, fit2)); | ||||
|         assertFalse(AbstractEAIndividual.isDominatingFitness(fit2, fit1)); | ||||
|  | ||||
|         fit2 = new double[]{11.0, 9.9, 0.9}; | ||||
|         assertTrue(AbstractEAIndividual.isDominatingFitness(fit2, fit1)); | ||||
|  | ||||
|         // Is dominating itself | ||||
|         assertTrue(AbstractEAIndividual.isDominatingFitness(fit1, fit1)); | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
|     public void testIsDominatingFitnessNotEqual() throws Exception { | ||||
|         // Single objective | ||||
|         double[] fit1 = new double[]{415.231322}; | ||||
|  | ||||
|         // Is not dominating itself | ||||
|         assertFalse(AbstractEAIndividual.isDominatingFitnessNotEqual(fit1, fit1)); | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
|   | ||||
| @@ -0,0 +1,30 @@ | ||||
| package eva2.optimization.individuals; | ||||
|  | ||||
| import org.junit.Test; | ||||
|  | ||||
| import static org.junit.Assert.*; | ||||
|  | ||||
| public class ESIndividualPermutationDataTest { | ||||
|  | ||||
|     @Test | ||||
|     public void testMapXToY() throws Exception { | ||||
|         double[][] matrix = new double[][]{ | ||||
|                 {1.2, 2.3, 3.4, 1.2}, | ||||
|                 {0.2, 0.3, 0.4} | ||||
|         }; | ||||
|  | ||||
|         // Properly constructs vector from matrix | ||||
|         assertArrayEquals( | ||||
|                 new double[]{1.2, 2.3, 3.4, 1.2, 0.2, 0.3, 0.4}, | ||||
|                 ESIndividualPermutationData.mapMatrixToVector(matrix), 0.0 | ||||
|         ); | ||||
|  | ||||
|         // Properly converts to vector and back to matrix | ||||
|         assertArrayEquals( | ||||
|                 matrix, | ||||
|                 ESIndividualPermutationData.mapVectorToMatrix( | ||||
|                         ESIndividualPermutationData.mapMatrixToVector(matrix), new int[]{4,3} | ||||
|                 ) | ||||
|         ); | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,79 @@ | ||||
| package eva2.optimization.operator.distancemetric; | ||||
|  | ||||
| import eva2.optimization.individuals.*; | ||||
| import org.junit.Before; | ||||
| import org.junit.Test; | ||||
|  | ||||
| import static org.junit.Assert.*; | ||||
| import static org.mockito.Mockito.mock; | ||||
| import static org.mockito.Mockito.when; | ||||
|  | ||||
| public class PhenotypeMetricTest { | ||||
|     private PhenotypeMetric metric; | ||||
|  | ||||
|     @Before | ||||
|     public void setUp() throws Exception { | ||||
|         metric = new PhenotypeMetric(); | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
|     public void testDistance() throws Exception { | ||||
|         // DOUBLE | ||||
|         ESIndividualDoubleData dindy1, dindy2; | ||||
|         dindy1 = mock(ESIndividualDoubleData.class); | ||||
|         when(dindy1.getDoubleData()).thenReturn(new double[]{1.0, 1.0, 1.0, 1.0, 1.0}); | ||||
|         when(dindy1.getDoubleRange()).thenReturn(new double[][]{ | ||||
|                 {0.0, 10.0},{0.0, 10.0},{0.0, 10.0},{0.0, 10.0},{0.0, 10.0} | ||||
|         }); | ||||
|         dindy2 = mock(ESIndividualDoubleData.class); | ||||
|         when(dindy2.getDoubleData()).thenReturn(new double[]{2.0, 2.0, 2.0, 2.0, 2.0}); | ||||
|         when(dindy2.getDoubleRange()).thenReturn(new double[][]{ | ||||
|                 {0.0, 10.0},{0.0, 10.0},{0.0, 10.0},{0.0, 10.0},{0.0, 10.0} | ||||
|         }); | ||||
|  | ||||
|         // Should be zero for distance to itself | ||||
|         assertEquals(0.0, metric.distance(dindy1, dindy1), 0.0); | ||||
|  | ||||
|         assertEquals(0.2236, metric.distance(dindy1, dindy2), 1E-4); | ||||
|  | ||||
|         // INTEGER | ||||
|         ESIndividualIntegerData iindy1, iindy2; | ||||
|         iindy1 = mock(ESIndividualIntegerData.class); | ||||
|         when(iindy1.getIntegerData()).thenReturn(new int[]{1, 1, 1, 1, 1}); | ||||
|         when(iindy1.getIntRange()).thenReturn(new int[][]{ | ||||
|                 {0, 10},{0, 10},{0, 10},{0, 10},{0, 10} | ||||
|         }); | ||||
|         iindy2 = mock(ESIndividualIntegerData.class); | ||||
|         when(iindy2.getIntegerData()).thenReturn(new int[]{3, 3, 3, 3, 3}); | ||||
|         when(iindy2.getIntRange()).thenReturn(new int[][]{ | ||||
|                 {0, 10},{0, 10},{0, 10},{0, 10},{0, 10} | ||||
|         }); | ||||
|  | ||||
|         // Should be zero for distance to itself | ||||
|         assertEquals(0.0, metric.distance(iindy1, iindy1), 0.0); | ||||
|  | ||||
|         assertEquals(0.4472, metric.distance(iindy1, iindy2), 1E-4); | ||||
|  | ||||
|         // PERMUTATION | ||||
|         ESIndividualPermutationData pindy1, pindy2; | ||||
|         pindy1 = mock(ESIndividualPermutationData.class); | ||||
|         when(pindy1.getPermutationData()).thenReturn(new int[][]{ | ||||
|                 {0, 1, 2}, {0, 1, 2}, {0, 1, 2}, {0, 1, 2}, {0, 1, 2}, {} | ||||
|         }); | ||||
|         pindy2 = mock(ESIndividualPermutationData.class); | ||||
|         when(pindy2.getPermutationData()).thenReturn(new int[][]{ | ||||
|                 {0, 1, 3}, {0, 1, 1}, {0, 0, 2}, {1, 1, 3}, {}, {1, 2, 3} | ||||
|         }); | ||||
|  | ||||
|         // Should be zero for distance to itself | ||||
|         assertEquals(0.0, metric.distance(pindy1, pindy1), 0.0); | ||||
|  | ||||
|         assertEquals(2.35, metric.distance(pindy1, pindy2), 1E-4); | ||||
|  | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
|     public void testNorm() throws Exception { | ||||
|  | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,94 @@ | ||||
| package eva2.optimization.operator.terminators; | ||||
|  | ||||
| import eva2.optimization.population.PopulationInterface; | ||||
| import eva2.optimization.population.SolutionSet; | ||||
| import eva2.problems.InterfaceOptimizationProblem; | ||||
| import org.junit.Before; | ||||
| import org.junit.Test; | ||||
|  | ||||
| import static org.junit.Assert.*; | ||||
| import static org.mockito.Mockito.*; | ||||
|  | ||||
| public class CombinedTerminatorTest { | ||||
|     private CombinedTerminator terminator; | ||||
|     private InterfaceTerminator term1; | ||||
|     private InterfaceTerminator term2; | ||||
|     private InterfaceOptimizationProblem prob; | ||||
|  | ||||
|     @Before | ||||
|     public void setUp() throws Exception { | ||||
|         terminator = new CombinedTerminator(); | ||||
|         term1 = mock(InterfaceTerminator.class); | ||||
|         term2 = mock(InterfaceTerminator.class); | ||||
|         prob = mock(InterfaceOptimizationProblem.class); | ||||
|  | ||||
|         terminator.setTerminatorOne(term1); | ||||
|         terminator.setTerminatorTwo(term2); | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
|     public void testInitialize() throws Exception { | ||||
|         terminator.initialize(prob); | ||||
|  | ||||
|         verify(term1).initialize(prob); | ||||
|         verify(term2).initialize(prob); | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
|     public void testIsTerminatedPop() throws Exception { | ||||
|         PopulationInterface pop = mock(PopulationInterface.class); | ||||
|  | ||||
|         terminator.isTerminated(pop); | ||||
|         verify(term1).isTerminated(pop); | ||||
|         verify(term2).isTerminated(pop); | ||||
|  | ||||
|         reset(term1, term2); | ||||
|  | ||||
|         terminator.setLogicalOperator(CombinedTerminator.LogicalOperator.OR); | ||||
|         // Should still call both terminators | ||||
|         terminator.isTerminated(pop); | ||||
|         verify(term1).isTerminated(pop); | ||||
|         verify(term2).isTerminated(pop); | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
|     public void testIsTerminatedSolSet() throws Exception { | ||||
|         SolutionSet solutionSet = mock(SolutionSet.class); | ||||
|  | ||||
|         terminator.isTerminated(solutionSet); | ||||
|         verify(term1).isTerminated(solutionSet); | ||||
|         verify(term2).isTerminated(solutionSet); | ||||
|  | ||||
|         reset(term1, term2); | ||||
|  | ||||
|         terminator.setLogicalOperator(CombinedTerminator.LogicalOperator.OR); | ||||
|         // Should still call both terminators | ||||
|         terminator.isTerminated(solutionSet); | ||||
|         verify(term1).isTerminated(solutionSet); | ||||
|         verify(term2).isTerminated(solutionSet); | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
|     public void testLastTerminationMessage() throws Exception { | ||||
|  | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
|     public void testGetLogicalOperator() throws Exception { | ||||
|         // Defaults to an AND | ||||
|         assertEquals(CombinedTerminator.LogicalOperator.AND, terminator.getLogicalOperator()); | ||||
|  | ||||
|         terminator.setLogicalOperator(CombinedTerminator.LogicalOperator.OR); | ||||
|         assertEquals(CombinedTerminator.LogicalOperator.OR, terminator.getLogicalOperator()); | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
|     public void testGetTerminatorOne() throws Exception { | ||||
|         assertEquals(term1, terminator.getTerminatorOne()); | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
|     public void testGetTerminatorTwo() throws Exception { | ||||
|         assertEquals(term2, terminator.getTerminatorTwo()); | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,46 @@ | ||||
| package eva2.optimization.operator.terminators; | ||||
|  | ||||
| import eva2.optimization.population.Population; | ||||
| import eva2.optimization.population.SolutionSet; | ||||
| import org.junit.Before; | ||||
| import org.junit.Test; | ||||
|  | ||||
| import static org.junit.Assert.*; | ||||
| import static org.mockito.Mockito.mock; | ||||
| import static org.mockito.Mockito.when; | ||||
|  | ||||
| public class FitnessValueTerminatorTest { | ||||
|     private FitnessValueTerminator terminator; | ||||
|  | ||||
|     @Before | ||||
|     public void setUp() throws Exception { | ||||
|         terminator = new FitnessValueTerminator(); | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
|     public void testIsTerminated() throws Exception { | ||||
|         Population pop = mock(Population.class); | ||||
|         when(pop.getBestFitness()).thenReturn(new double[]{10E-3}); | ||||
|  | ||||
|         assertFalse(terminator.isTerminated(pop)); | ||||
|  | ||||
|  | ||||
|         when(pop.getBestFitness()).thenReturn(new double[]{10E-5}); | ||||
|         assertTrue(terminator.isTerminated(pop)); | ||||
|  | ||||
|         SolutionSet solSet = mock(SolutionSet.class); | ||||
|         when(solSet.getCurrentPopulation()).thenReturn(pop); | ||||
|  | ||||
|         assertTrue(terminator.isTerminated(pop)); | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
|     public void testSetFitnessValue() throws Exception { | ||||
|         assertArrayEquals(new double[]{10E-4}, terminator.getFitnessValue(), 0.0); | ||||
|  | ||||
|         double[] newFitness = {10E-4, 10E-4, 10E-4}; | ||||
|         terminator.setFitnessValue(newFitness); | ||||
|         assertEquals(3, terminator.getFitnessValue().length); | ||||
|         assertArrayEquals(newFitness, terminator.getFitnessValue(), 0.0); | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,58 @@ | ||||
| package eva2.optimization.operator.terminators; | ||||
|  | ||||
| import eva2.optimization.population.Population; | ||||
| import eva2.optimization.population.SolutionSet; | ||||
| import org.junit.Before; | ||||
| import org.junit.Test; | ||||
|  | ||||
| import static org.junit.Assert.*; | ||||
|  | ||||
| public class GenerationTerminatorTest { | ||||
|     GenerationTerminator terminator; | ||||
|  | ||||
|     @Before | ||||
|     public void setUp() throws Exception { | ||||
|         terminator = new GenerationTerminator(); | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
|     public void testIsTerminated() throws Exception { | ||||
|         Population pop = new Population(); | ||||
|         pop.setGeneration(100); | ||||
|         assertFalse(terminator.isTerminated(pop)); | ||||
|         pop.incrGeneration(); | ||||
|         assertTrue(terminator.isTerminated(pop)); | ||||
|  | ||||
|         pop.setGeneration(100); | ||||
|         SolutionSet sset = new SolutionSet(pop); | ||||
|         assertFalse(terminator.isTerminated(sset)); | ||||
|         pop.incrGeneration(); | ||||
|         assertTrue(terminator.isTerminated(sset)); | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
|     public void testLastTerminationMessage() throws Exception { | ||||
|         assertNotNull(terminator.toString()); | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
|     public void testToString() throws Exception { | ||||
|         assertEquals("Generations calls=100", terminator.toString()); | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
|     public void testSetGenerations() throws Exception { | ||||
|         // Defaults to 100 generations | ||||
|         assertEquals(100, terminator.getGenerations()); | ||||
|  | ||||
|         terminator.setGenerations(42); | ||||
|  | ||||
|         assertEquals(42, terminator.getGenerations()); | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
|     public void testGetGenerations() throws Exception { | ||||
|         // Defaults to 100 generations | ||||
|         assertEquals(100, terminator.getGenerations()); | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,52 @@ | ||||
| package eva2.optimization.operator.terminators; | ||||
|  | ||||
| import eva2.optimization.population.Population; | ||||
| import org.junit.Before; | ||||
| import org.junit.Test; | ||||
|  | ||||
| import static org.junit.Assert.*; | ||||
|  | ||||
| public class MaximumTimeTerminatorTest { | ||||
|     MaximumTimeTerminator terminator; | ||||
|  | ||||
|     @Before | ||||
|     public void setUp() throws Exception { | ||||
|         terminator = new MaximumTimeTerminator(); | ||||
|         terminator.setMaximumTime(1); | ||||
|     } | ||||
|  | ||||
|     @Test(timeout = 2500) | ||||
|     public void testIsTerminated() throws Exception { | ||||
|         terminator.initialize(null); | ||||
|  | ||||
|         while(!terminator.isTerminated(new Population())); | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
|     public void testLastTerminationMessage() throws Exception { | ||||
|         assertNotNull(terminator.lastTerminationMessage()); | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
|     public void testInitialize() throws Exception { | ||||
|         terminator.initialize(null); | ||||
|         // Should not be terminated after reinitialization | ||||
|         assertFalse(terminator.isTerminated(new Population())); | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
|     public void testToString() throws Exception { | ||||
|         assertNotNull(terminator.toString()); | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
|     public void testGetMaximumTime() throws Exception { | ||||
|         assertEquals(1, terminator.getMaximumTime()); | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
|     public void testSetMaximumTime() throws Exception { | ||||
|         terminator.setMaximumTime(10); | ||||
|         assertEquals(10, terminator.getMaximumTime()); | ||||
|     } | ||||
| } | ||||
| @@ -1,9 +1,14 @@ | ||||
| package eva2.optimization.population; | ||||
|  | ||||
| import com.sun.org.apache.bcel.internal.generic.POP; | ||||
| import eva2.optimization.individuals.AbstractEAIndividual; | ||||
| import eva2.optimization.individuals.ESIndividualDoubleData; | ||||
| import org.junit.Before; | ||||
| import org.junit.Test; | ||||
| import static org.junit.Assert.*; | ||||
| import static org.mockito.Mockito.mock; | ||||
| import static org.mockito.Mockito.verify; | ||||
| import static org.mockito.Mockito.when; | ||||
|  | ||||
| public class PopulationTest { | ||||
|     Population emptyPopulation; | ||||
| @@ -18,11 +23,6 @@ public class PopulationTest { | ||||
|  | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
|     public void testPutData() throws Exception { | ||||
|  | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
|     public void testGetData() throws Exception { | ||||
|         // Simple data | ||||
| @@ -182,8 +182,13 @@ public class PopulationTest { | ||||
|     @Test | ||||
|     public void testIncrGeneration() throws Exception { | ||||
|         int currentGeneration = emptyPopulation.getGeneration(); | ||||
|         InterfacePopulationChangedEventListener listener = mock(InterfacePopulationChangedEventListener.class); | ||||
|  | ||||
|         emptyPopulation.addPopulationChangedEventListener(listener); | ||||
|         emptyPopulation.incrGeneration(); | ||||
|  | ||||
|         verify(listener).registerPopulationStateChanged(emptyPopulation, Population.NEXT_GENERATION_PERFORMED); | ||||
|  | ||||
|         assertEquals(currentGeneration + 1, emptyPopulation.getGeneration()); | ||||
|     } | ||||
|  | ||||
| @@ -204,11 +209,6 @@ public class PopulationTest { | ||||
|  | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
|     public void testAddPopulation1() throws Exception { | ||||
|  | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
|     public void testResetFitness() throws Exception { | ||||
|  | ||||
| @@ -219,11 +219,6 @@ public class PopulationTest { | ||||
|  | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
|     public void testGetDominatingSet1() throws Exception { | ||||
|  | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
|     public void testGetIndexOfBestIndividualPrefFeasible() throws Exception { | ||||
|  | ||||
| @@ -234,16 +229,6 @@ public class PopulationTest { | ||||
|  | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
|     public void testGetIndexOfBestIndividualPrefFeasible1() throws Exception { | ||||
|  | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
|     public void testGetIndexOfWorstIndividualNoConstr1() throws Exception { | ||||
|  | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
|     public void testMoveNInds() throws Exception { | ||||
|  | ||||
| @@ -319,11 +304,6 @@ public class PopulationTest { | ||||
|  | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
|     public void testGetCorrelations1() throws Exception { | ||||
|  | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
|     public void testGetFitnessMeasures() throws Exception { | ||||
|  | ||||
| @@ -331,12 +311,22 @@ public class PopulationTest { | ||||
|  | ||||
|     @Test | ||||
|     public void testGetCenter() throws Exception { | ||||
|         assertNull(emptyPopulation.getCenter()); | ||||
|  | ||||
|         for(int i = 0; i < 10; i++) { | ||||
|             ESIndividualDoubleData indy = mock(ESIndividualDoubleData.class); | ||||
|             when(indy.getDGenotype()).thenReturn(new double[]{i, i, i, i, i}); | ||||
|             emptyPopulation.add(indy); | ||||
|         } | ||||
|  | ||||
|         assertArrayEquals(new double[]{ | ||||
|                 4.5, 4.5, 4.5, 4.5, 4.5 | ||||
|         }, emptyPopulation.getCenter(), 0.0); | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
|     public void testGetCenterIndy() throws Exception { | ||||
|  | ||||
|          | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
| @@ -351,7 +341,15 @@ public class PopulationTest { | ||||
|  | ||||
|     @Test | ||||
|     public void testGetFitSum() throws Exception { | ||||
|         for(int i = 0; i < 10; i++) { | ||||
|             ESIndividualDoubleData indy = mock(ESIndividualDoubleData.class); | ||||
|             when(indy.getFitness(0)).thenReturn((double)i); | ||||
|             when(indy.getFitness(1)).thenReturn((double)i*2); | ||||
|             emptyPopulation.add(indy); | ||||
|         } | ||||
|  | ||||
|         assertEquals(45.0, emptyPopulation.getFitSum(0), 0.0); | ||||
|         assertEquals(90.0, emptyPopulation.getFitSum(1), 0.0); | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
| @@ -371,7 +369,12 @@ public class PopulationTest { | ||||
|  | ||||
|     @Test | ||||
|     public void testGetFreeSlots() throws Exception { | ||||
|         assertEquals(10, emptyPopulation.getFreeSlots()); | ||||
|  | ||||
|         ESIndividualDoubleData indy = mock(ESIndividualDoubleData.class); | ||||
|         emptyPopulation.add(indy); | ||||
|  | ||||
|         assertEquals(9, emptyPopulation.getFreeSlots()); | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
| @@ -384,6 +387,19 @@ public class PopulationTest { | ||||
|  | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
|     public void testPutDataAllIndies() throws Exception { | ||||
|         ESIndividualDoubleData indy1 = mock(ESIndividualDoubleData.class); | ||||
|         ESIndividualDoubleData indy2 = mock(ESIndividualDoubleData.class); | ||||
|  | ||||
|         emptyPopulation.add(indy1); | ||||
|         emptyPopulation.add(indy2); | ||||
|         emptyPopulation.putDataAllIndies("test", 12); | ||||
|  | ||||
|         verify(indy1).putData("test", 12); | ||||
|         verify(indy2).putData("test", 12); | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
|     public void testFilterByFitness() throws Exception { | ||||
|         ESIndividualDoubleData indy1, indy2, indy3; | ||||
| @@ -401,4 +417,29 @@ public class PopulationTest { | ||||
|         // Get all individuals with fitness <= 10.0 (first fitness dimension) | ||||
|         assertEquals(2, emptyPopulation.filterByFitness(10.0, 0).size()); | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
|     public void testGetBestEAIndividual() throws Exception { | ||||
|  | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
|     public void testGetBestNIndividuals() throws Exception { | ||||
|  | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
|     public void testGetWorstNIndividuals() throws Exception { | ||||
|  | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
|     public void testGetWorstEAIndividual() throws Exception { | ||||
|  | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
|     public void testRemoveNIndividuals() throws Exception { | ||||
|  | ||||
|     } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user