diff --git a/build.gradle b/build.gradle index 722716b9..a061f2d0 100644 --- a/build.gradle +++ b/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' } diff --git a/src/main/java/eva2/optimization/individuals/EAIndividualComparator.java b/src/main/java/eva2/optimization/individuals/EAIndividualComparator.java index caf6d25c..34ffbbab 100644 --- a/src/main/java/eva2/optimization/individuals/EAIndividualComparator.java +++ b/src/main/java/eva2/optimization/individuals/EAIndividualComparator.java @@ -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, Serializable { +public class EAIndividualComparator implements Comparator, 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, 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? diff --git a/src/main/java/eva2/optimization/individuals/ESIndividualPermutationData.java b/src/main/java/eva2/optimization/individuals/ESIndividualPermutationData.java index 0e1ca54f..2c84f7a2 100644 --- a/src/main/java/eva2/optimization/individuals/ESIndividualPermutationData.java +++ b/src/main/java/eva2/optimization/individuals/ESIndividualPermutationData.java @@ -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 } } } - - } /** diff --git a/src/main/java/eva2/optimization/individuals/IndividualDistanceComparator.java b/src/main/java/eva2/optimization/individuals/IndividualDistanceComparator.java index 3264a040..8cbff7e2 100644 --- a/src/main/java/eva2/optimization/individuals/IndividualDistanceComparator.java +++ b/src/main/java/eva2/optimization/individuals/IndividualDistanceComparator.java @@ -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, Serializable { +public class IndividualDistanceComparator implements Comparator, Serializable { private AbstractEAIndividual refIndy = null; private InterfaceDistanceMetric distMetric = null; @@ -30,9 +30,9 @@ public class IndividualDistanceComparator implements Comparator, 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; diff --git a/src/main/java/eva2/optimization/individuals/IndividualWeightedFitnessComparator.java b/src/main/java/eva2/optimization/individuals/IndividualWeightedFitnessComparator.java index 515ee305..4c31e555 100644 --- a/src/main/java/eva2/optimization/individuals/IndividualWeightedFitnessComparator.java +++ b/src/main/java/eva2/optimization/individuals/IndividualWeightedFitnessComparator.java @@ -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, Serializable { +public class IndividualWeightedFitnessComparator implements Comparator, Serializable { /** * Generated serial version identifier */ @@ -75,12 +76,12 @@ public class IndividualWeightedFitnessComparator implements Comparator, * @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, * @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, * @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, } } + @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, 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()); -// } } diff --git a/src/main/java/eva2/optimization/operator/archiving/ArchivingNSGAIISMeasure.java b/src/main/java/eva2/optimization/operator/archiving/ArchivingNSGAIISMeasure.java index 59d0e1ad..c23e8fd8 100644 --- a/src/main/java/eva2/optimization/operator/archiving/ArchivingNSGAIISMeasure.java +++ b/src/main/java/eva2/optimization/operator/archiving/ArchivingNSGAIISMeasure.java @@ -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; diff --git a/src/main/java/eva2/optimization/operator/distancemetric/DoubleIntegralMetric.java b/src/main/java/eva2/optimization/operator/distancemetric/DoubleIntegralMetric.java index fcd7364f..23b6a651 100644 --- a/src/main/java/eva2/optimization/operator/distancemetric/DoubleIntegralMetric.java +++ b/src/main/java/eva2/optimization/operator/distancemetric/DoubleIntegralMetric.java @@ -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."; - } - } diff --git a/src/main/java/eva2/optimization/operator/distancemetric/GenotypeMetricBitSet.java b/src/main/java/eva2/optimization/operator/distancemetric/GenotypeMetricBitSet.java index 94a6151b..1a3b75d1 100644 --- a/src/main/java/eva2/optimization/operator/distancemetric/GenotypeMetricBitSet.java +++ b/src/main/java/eva2/optimization/operator/distancemetric/GenotypeMetricBitSet.java @@ -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(); } /** diff --git a/src/main/java/eva2/optimization/operator/distancemetric/PhenotypeMetric.java b/src/main/java/eva2/optimization/operator/distancemetric/PhenotypeMetric.java index af780da8..07be1292 100644 --- a/src/main/java/eva2/optimization/operator/distancemetric/PhenotypeMetric.java +++ b/src/main/java/eva2/optimization/operator/distancemetric/PhenotypeMetric.java @@ -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 * diff --git a/src/main/java/eva2/optimization/operator/distancemetric/SigmaSingleMetricGlobalMutation.java b/src/main/java/eva2/optimization/operator/distancemetric/SigmaSingleMetricGlobalMutation.java index fc8f2c67..b5a6adf1 100644 --- a/src/main/java/eva2/optimization/operator/distancemetric/SigmaSingleMetricGlobalMutation.java +++ b/src/main/java/eva2/optimization/operator/distancemetric/SigmaSingleMetricGlobalMutation.java @@ -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(); } /** diff --git a/src/main/java/eva2/optimization/operator/postprocess/PostProcess.java b/src/main/java/eva2/optimization/operator/postprocess/PostProcess.java index 1feb43e7..cfed0cc3 100644 --- a/src/main/java/eva2/optimization/operator/postprocess/PostProcess.java +++ b/src/main/java/eva2/optimization/operator/postprocess/PostProcess.java @@ -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 diff --git a/src/main/java/eva2/optimization/operator/selection/SelectAll.java b/src/main/java/eva2/optimization/operator/selection/SelectAll.java index 045bb0cb..6f7a7586 100644 --- a/src/main/java/eva2/optimization/operator/selection/SelectAll.java +++ b/src/main/java/eva2/optimization/operator/selection/SelectAll.java @@ -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."; - } } diff --git a/src/main/java/eva2/optimization/operator/selection/SelectParticleWheel.java b/src/main/java/eva2/optimization/operator/selection/SelectParticleWheel.java index ebabedcb..67f071e3 100644 --- a/src/main/java/eva2/optimization/operator/selection/SelectParticleWheel.java +++ b/src/main/java/eva2/optimization/operator/selection/SelectParticleWheel.java @@ -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) { diff --git a/src/main/java/eva2/optimization/operator/selection/SelectXProbRouletteWheel.java b/src/main/java/eva2/optimization/operator/selection/SelectXProbRouletteWheel.java index 2b5b6559..a61f6562 100644 --- a/src/main/java/eva2/optimization/operator/selection/SelectXProbRouletteWheel.java +++ b/src/main/java/eva2/optimization/operator/selection/SelectXProbRouletteWheel.java @@ -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() { diff --git a/src/main/java/eva2/optimization/operator/selection/probability/AbstractSelProb.java b/src/main/java/eva2/optimization/operator/selection/probability/AbstractSelectionProbability.java similarity index 98% rename from src/main/java/eva2/optimization/operator/selection/probability/AbstractSelProb.java rename to src/main/java/eva2/optimization/operator/selection/probability/AbstractSelectionProbability.java index ee2dbb03..4d995b2c 100644 --- a/src/main/java/eva2/optimization/operator/selection/probability/AbstractSelProb.java +++ b/src/main/java/eva2/optimization/operator/selection/probability/AbstractSelectionProbability.java @@ -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 diff --git a/src/main/java/eva2/optimization/operator/selection/probability/SelProbBoltzman.java b/src/main/java/eva2/optimization/operator/selection/probability/SelectionProbabilityBoltzman.java similarity index 96% rename from src/main/java/eva2/optimization/operator/selection/probability/SelProbBoltzman.java rename to src/main/java/eva2/optimization/operator/selection/probability/SelectionProbabilityBoltzman.java index 14506319..6517df8c 100644 --- a/src/main/java/eva2/optimization/operator/selection/probability/SelProbBoltzman.java +++ b/src/main/java/eva2/optimization/operator/selection/probability/SelectionProbabilityBoltzman.java @@ -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); } /** diff --git a/src/main/java/eva2/optimization/operator/selection/probability/SelProbFitnessSharing.java b/src/main/java/eva2/optimization/operator/selection/probability/SelectionProbabilityFitnessSharing.java similarity index 92% rename from src/main/java/eva2/optimization/operator/selection/probability/SelProbFitnessSharing.java rename to src/main/java/eva2/optimization/operator/selection/probability/SelectionProbabilityFitnessSharing.java index d679e3b1..86c37b6e 100644 --- a/src/main/java/eva2/optimization/operator/selection/probability/SelProbFitnessSharing.java +++ b/src/main/java/eva2/optimization/operator/selection/probability/SelectionProbabilityFitnessSharing.java @@ -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); } /** diff --git a/src/main/java/eva2/optimization/operator/selection/probability/SelProbInvertByMax.java b/src/main/java/eva2/optimization/operator/selection/probability/SelectionProbabilityInvertByMax.java similarity index 91% rename from src/main/java/eva2/optimization/operator/selection/probability/SelProbInvertByMax.java rename to src/main/java/eva2/optimization/operator/selection/probability/SelectionProbabilityInvertByMax.java index 7c6315ae..6439b045 100644 --- a/src/main/java/eva2/optimization/operator/selection/probability/SelProbInvertByMax.java +++ b/src/main/java/eva2/optimization/operator/selection/probability/SelectionProbabilityInvertByMax.java @@ -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); } /** diff --git a/src/main/java/eva2/optimization/operator/selection/probability/SelProbLinearRanking.java b/src/main/java/eva2/optimization/operator/selection/probability/SelectionProbabilityLinearRanking.java similarity index 96% rename from src/main/java/eva2/optimization/operator/selection/probability/SelProbLinearRanking.java rename to src/main/java/eva2/optimization/operator/selection/probability/SelectionProbabilityLinearRanking.java index b3de4af5..1f116a5a 100644 --- a/src/main/java/eva2/optimization/operator/selection/probability/SelProbLinearRanking.java +++ b/src/main/java/eva2/optimization/operator/selection/probability/SelectionProbabilityLinearRanking.java @@ -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); } /** diff --git a/src/main/java/eva2/optimization/operator/selection/probability/SelProbNonLinearRanking.java b/src/main/java/eva2/optimization/operator/selection/probability/SelectionProbabilityNonLinearRanking.java similarity index 95% rename from src/main/java/eva2/optimization/operator/selection/probability/SelProbNonLinearRanking.java rename to src/main/java/eva2/optimization/operator/selection/probability/SelectionProbabilityNonLinearRanking.java index 92a62409..0ffd3535 100644 --- a/src/main/java/eva2/optimization/operator/selection/probability/SelProbNonLinearRanking.java +++ b/src/main/java/eva2/optimization/operator/selection/probability/SelectionProbabilityNonLinearRanking.java @@ -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); } /** diff --git a/src/main/java/eva2/optimization/operator/selection/probability/SelProbRanking.java b/src/main/java/eva2/optimization/operator/selection/probability/SelectionProbabilityRanking.java similarity index 92% rename from src/main/java/eva2/optimization/operator/selection/probability/SelProbRanking.java rename to src/main/java/eva2/optimization/operator/selection/probability/SelectionProbabilityRanking.java index 609bab63..0bcf47ec 100644 --- a/src/main/java/eva2/optimization/operator/selection/probability/SelProbRanking.java +++ b/src/main/java/eva2/optimization/operator/selection/probability/SelectionProbabilityRanking.java @@ -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); } /** diff --git a/src/main/java/eva2/optimization/operator/selection/probability/SelProbStandard.java b/src/main/java/eva2/optimization/operator/selection/probability/SelectionProbabilityStandard.java similarity index 92% rename from src/main/java/eva2/optimization/operator/selection/probability/SelProbStandard.java rename to src/main/java/eva2/optimization/operator/selection/probability/SelectionProbabilityStandard.java index a3022a76..9c04ee6a 100644 --- a/src/main/java/eva2/optimization/operator/selection/probability/SelProbStandard.java +++ b/src/main/java/eva2/optimization/operator/selection/probability/SelectionProbabilityStandard.java @@ -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); } /** diff --git a/src/main/java/eva2/optimization/operator/selection/probability/SelProbStandardScaling.java b/src/main/java/eva2/optimization/operator/selection/probability/SelectionProbabilityStandardScaling.java similarity index 94% rename from src/main/java/eva2/optimization/operator/selection/probability/SelProbStandardScaling.java rename to src/main/java/eva2/optimization/operator/selection/probability/SelectionProbabilityStandardScaling.java index ed42d34a..a1687f1f 100644 --- a/src/main/java/eva2/optimization/operator/selection/probability/SelProbStandardScaling.java +++ b/src/main/java/eva2/optimization/operator/selection/probability/SelectionProbabilityStandardScaling.java @@ -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); } /** diff --git a/src/main/java/eva2/optimization/operator/terminators/DiversityTerminator.java b/src/main/java/eva2/optimization/operator/terminators/DiversityTerminator.java index 3a802faf..53f7419c 100644 --- a/src/main/java/eva2/optimization/operator/terminators/DiversityTerminator.java +++ b/src/main/java/eva2/optimization/operator/terminators/DiversityTerminator.java @@ -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]; diff --git a/src/main/java/eva2/optimization/operator/terminators/EvaluationTerminator.java b/src/main/java/eva2/optimization/operator/terminators/EvaluationTerminator.java index 9985048d..26e41946 100644 --- a/src/main/java/eva2/optimization/operator/terminators/EvaluationTerminator.java +++ b/src/main/java/eva2/optimization/operator/terminators/EvaluationTerminator.java @@ -23,8 +23,7 @@ public class EvaluationTerminator implements InterfaceTerminator, */ protected int maxFitnessCalls = 1000; - public EvaluationTerminator() { - } + public EvaluationTerminator() {} @Override public void initialize(InterfaceOptimizationProblem prob) { diff --git a/src/main/java/eva2/optimization/operator/terminators/FitnessConvergenceTerminator.java b/src/main/java/eva2/optimization/operator/terminators/FitnessConvergenceTerminator.java index ee957afd..62b7d290 100644 --- a/src/main/java/eva2/optimization/operator/terminators/FitnessConvergenceTerminator.java +++ b/src/main/java/eva2/optimization/operator/terminators/FitnessConvergenceTerminator.java @@ -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()); diff --git a/src/main/java/eva2/optimization/operator/terminators/FitnessValueTerminator.java b/src/main/java/eva2/optimization/operator/terminators/FitnessValueTerminator.java index 7e04bbdb..9e108434 100644 --- a/src/main/java/eva2/optimization/operator/terminators/FitnessValueTerminator.java +++ b/src/main/java/eva2/optimization/operator/terminators/FitnessValueTerminator.java @@ -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; diff --git a/src/main/java/eva2/optimization/operator/terminators/GenerationTerminator.java b/src/main/java/eva2/optimization/operator/terminators/GenerationTerminator.java index 3b0245ad..2c7a3d62 100644 --- a/src/main/java/eva2/optimization/operator/terminators/GenerationTerminator.java +++ b/src/main/java/eva2/optimization/operator/terminators/GenerationTerminator.java @@ -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."; - } } \ No newline at end of file diff --git a/src/main/java/eva2/optimization/operator/terminators/KnownOptimaFoundTerminator.java b/src/main/java/eva2/optimization/operator/terminators/KnownOptimaFoundTerminator.java index 3ca28b20..a7603497 100644 --- a/src/main/java/eva2/optimization/operator/terminators/KnownOptimaFoundTerminator.java +++ b/src/main/java/eva2/optimization/operator/terminators/KnownOptimaFoundTerminator.java @@ -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."; diff --git a/src/main/java/eva2/optimization/operator/terminators/ParetoMetricTerminator.java b/src/main/java/eva2/optimization/operator/terminators/ParetoMetricTerminator.java index 0e7da230..99ff3882 100644 --- a/src/main/java/eva2/optimization/operator/terminators/ParetoMetricTerminator.java +++ b/src/main/java/eva2/optimization/operator/terminators/ParetoMetricTerminator.java @@ -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"; - } } diff --git a/src/main/java/eva2/optimization/operator/terminators/PhenotypeConvergenceTerminator.java b/src/main/java/eva2/optimization/operator/terminators/PhenotypeConvergenceTerminator.java index 14e56109..bb1c3d93 100644 --- a/src/main/java/eva2/optimization/operator/terminators/PhenotypeConvergenceTerminator.java +++ b/src/main/java/eva2/optimization/operator/terminators/PhenotypeConvergenceTerminator.java @@ -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()); } diff --git a/src/main/java/eva2/optimization/operator/terminators/PopulationArchiveTerminator.java b/src/main/java/eva2/optimization/operator/terminators/PopulationArchiveTerminator.java index 06e493e1..408ac7ac 100644 --- a/src/main/java/eva2/optimization/operator/terminators/PopulationArchiveTerminator.java +++ b/src/main/java/eva2/optimization/operator/terminators/PopulationArchiveTerminator.java @@ -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(); - } } diff --git a/src/main/java/eva2/optimization/operator/terminators/PopulationMeasureTerminator.java b/src/main/java/eva2/optimization/operator/terminators/PopulationMeasureTerminator.java index e734170c..2855fc64 100644 --- a/src/main/java/eva2/optimization/operator/terminators/PopulationMeasureTerminator.java +++ b/src/main/java/eva2/optimization/operator/terminators/PopulationMeasureTerminator.java @@ -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= 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)"; - } } \ No newline at end of file diff --git a/src/main/java/eva2/optimization/population/Population.java b/src/main/java/eva2/optimization/population/Population.java index 2087cfb8..f0b17fd6 100644 --- a/src/main/java/eva2/optimization/population/Population.java +++ b/src/main/java/eva2/optimization/population/Population.java @@ -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 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 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 implements Popul * @param comparator indicate whether constraints should be regarded * @return The index of the best (worst) individual. */ - public int getIndexOfBestOrWorstIndividual(boolean bBest, Comparator comparator) { + public int getIndexOfBestOrWorstIndividual(boolean bBest, Comparator comparator) { ArrayList sorted = getSorted(comparator); if (bBest) { return indexOf(sorted.get(0)); @@ -1053,7 +1051,7 @@ public class Population extends ArrayList implements Popul return getIndexOfBestOrWorstIndividual(true, comparator); } - public AbstractEAIndividual getBestEAIndividual(Comparator comparator) { + public AbstractEAIndividual getBestEAIndividual(Comparator comparator) { int index = getIndexOfBestOrWorstIndividual(true, comparator); return getEAIndividual(index); } @@ -1201,7 +1199,7 @@ public class Population extends ArrayList implements Popul * fitness first * @see #getSortedNIndividuals(int, boolean, Population, Comparator) */ - public Population getSortedBestFirst(Comparator comp) { + public Population getSortedBestFirst(Comparator comp) { Population result = this.cloneWithoutInds(); getSortedNIndividuals(size(), true, result, comp); result.synchSize(); @@ -1221,7 +1219,7 @@ public class Population extends ArrayList 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 comp) { + public void getSortedNIndividuals(int n, boolean bBestOrWorst, Population res, Comparator 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 implements Popul * on AbstractEAIndividual instances. * @return */ - protected ArrayList sortBy(Comparator comp) { + protected ArrayList sortBy(Comparator comp) { if (super.isEmpty()) { return new ArrayList<>(); } @@ -1322,7 +1320,7 @@ public class Population extends ArrayList implements Popul * @param comp The comparator * @return */ - public ArrayList getSorted(Comparator comp) { + public ArrayList getSorted(Comparator comp) { if (!comp.equals(lastSortingComparator) || (sortedArr == null) || (super.modCount != lastQModCount)) { ArrayList sArr = sortBy(comp); if (sortedArr == null) { @@ -1342,7 +1340,7 @@ public class Population extends ArrayList implements Popul * * @see #getSorted(java.util.Comparator) */ - public Population getSortedPop(Comparator comp) { + public Population getSortedPop(Comparator comp) { Population pop = this.cloneWithoutInds(); ArrayList sortedIndies = getSorted(comp); pop.addAll(sortedIndies); @@ -2093,7 +2091,7 @@ public class Population extends ArrayList 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 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 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)); diff --git a/src/main/java/eva2/optimization/strategies/ParticleSwarmOptimization.java b/src/main/java/eva2/optimization/strategies/ParticleSwarmOptimization.java index d3a4229f..06658911 100644 --- a/src/main/java/eva2/optimization/strategies/ParticleSwarmOptimization.java +++ b/src/main/java/eva2/optimization/strategies/ParticleSwarmOptimization.java @@ -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 { diff --git a/src/main/java/eva2/tools/Primitives.java b/src/main/java/eva2/tools/Primitives.java index 3c271c1d..d860b29c 100644 --- a/src/main/java/eva2/tools/Primitives.java +++ b/src/main/java/eva2/tools/Primitives.java @@ -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); diff --git a/src/main/java/eva2/tools/SelectedTag.java b/src/main/java/eva2/tools/SelectedTag.java index 80be45c9..f4199534 100644 --- a/src/main/java/eva2/tools/SelectedTag.java +++ b/src/main/java/eva2/tools/SelectedTag.java @@ -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