diff --git a/src/eva2/server/go/operators/archiving/ArchivingNSGAIISMeasure.java b/src/eva2/server/go/operators/archiving/ArchivingNSGAIISMeasure.java new file mode 100644 index 00000000..1a67e096 --- /dev/null +++ b/src/eva2/server/go/operators/archiving/ArchivingNSGAIISMeasure.java @@ -0,0 +1,106 @@ +package eva2.server.go.operators.archiving; + +import java.util.Arrays; +import java.util.Collections; +import java.util.Vector; + +import eva2.server.go.individuals.AbstractEAIndividual; +import eva2.server.go.individuals.AbstractEAIndividualComparator; +import eva2.server.go.populations.Population; + +public class ArchivingNSGAIISMeasure extends ArchivingNSGAII { + + /** This method will cacluated the NSGAII crowding distance + * for all individuals + * @param fronts The pareto fronts + */ + public void calculateCrowdingDistance(Population[] fronts) { + //TODO Dimension der Zielfunktion checken + + for (int rank = 0; rank < fronts.length; rank++) + { + calculateCrowdingDistance(fronts[rank]); + } + } + + + /** This mehtod will test if a given individual is dominant within + * a given population + * @param indy The individual that is to be tested. + * @param pop The population that the individual is to be tested against. + * @return True if the individual is dominating + */ + @Override + public boolean isDominant(AbstractEAIndividual indy, Population pop) { + if (this.m_ObeyDebsConstViolationPrinciple) { + for (int i = 0; i < pop.size(); i++) { + if (!(indy.equals(pop.get(i))||indy.equalFitness((AbstractEAIndividual) pop.get(i))) && (((AbstractEAIndividual)pop.get(i)).isDominatingDebConstraints(indy))) return false; + } + } else { + for (int i = 0; i < pop.size(); i++) { + if (!(indy.equals(pop.get(i))||indy.equalFitness((AbstractEAIndividual) pop.get(i))) && (((AbstractEAIndividual)pop.get(i)).isDominating(indy))) return false; + } + } + return true; + } + + public void calculateCrowdingDistance(Population front) { + + Object[] frontArray= front.toArray(); + boolean[] assigned=new boolean[frontArray.length]; + + double[] v=new double[frontArray.length]; + int i, left, right; + + // initialization of assignment vector + for (i = 0; i < frontArray.length; i++) + { + assigned[ i ] = false; + + } + + + Arrays.sort(frontArray,new AbstractEAIndividualComparator(0)); + + + ((AbstractEAIndividual)frontArray[0]).putData("HyperCube",Double.MAX_VALUE); //die beiden außen bekommen maximal wert als smeasure + ((AbstractEAIndividual)frontArray[frontArray.length-1]).putData("HyperCube",Double.MAX_VALUE); + v[0]=Double.MAX_VALUE; + v[frontArray.length-1]=Double.MAX_VALUE; + + + for (int e = 1; e < frontArray.length - 1; e++) + { // loop over all non-border elements + for (i = 1; (assigned[ i ]); i++); // determine 1st not assigned, non-border element + + for (left = 0; i < frontArray.length - 1;) + { // loop over all not assigned elements + // determine right not assigned neighbor + for (right = i + 1; (assigned[ right]); right++); + + v[i] = (((AbstractEAIndividual)frontArray[right]).getFitness(0) - ((AbstractEAIndividual)frontArray[i]).getFitness(0)) * + (((AbstractEAIndividual)frontArray[left]).getFitness(1) - ((AbstractEAIndividual)frontArray[i]).getFitness(1)); + + left = i; + i = right; + } + + int minIndex = 0; + double min=v[minIndex]; + for (int f = 1; f < frontArray.length - 1; f++) + { + if (!assigned[ f ]) + if (v[f] < min) + { + min = v[f]; + minIndex = f; + } + } + assigned[ minIndex ] = true; + ((AbstractEAIndividual)frontArray[ minIndex]).putData("HyperCube",new Double(e)); + } + + + + } +} diff --git a/src/eva2/server/go/operators/mutation/MutateESCovarianceMatrixAdaptionPlus.java b/src/eva2/server/go/operators/mutation/MutateESCovarianceMatrixAdaptionPlus.java new file mode 100644 index 00000000..4a4c2abc --- /dev/null +++ b/src/eva2/server/go/operators/mutation/MutateESCovarianceMatrixAdaptionPlus.java @@ -0,0 +1,195 @@ +package eva2.server.go.operators.mutation; + +import eva2.server.go.individuals.AbstractEAIndividual; +import eva2.server.go.individuals.InterfaceESIndividual; +import eva2.server.go.populations.Population; +import eva2.server.go.problems.InterfaceOptimizationProblem; +import eva2.tools.math.Jama.Matrix; + +public class MutateESCovarianceMatrixAdaptionPlus extends MutateESCovarianceMatrixAdaption implements InterfaceMutationGenerational +{ + protected double m_psuccess; + protected double m_cp; + protected double m_psuccesstarget=0.44; + protected double m_stepd; + protected double m_pthresh; + protected int m_lambda=1; + + + public MutateESCovarianceMatrixAdaptionPlus() { + super(); + } + + + public MutateESCovarianceMatrixAdaptionPlus(MutateESCovarianceMatrixAdaptionPlus mutator) { + super(mutator); + m_psuccess=mutator.m_psuccess; + m_cp=mutator.m_cp; + m_psuccesstarget=mutator.m_psuccesstarget; + m_lambda=mutator.m_lambda; + m_pthresh=mutator.m_pthresh; + m_stepd=mutator.m_stepd; + } + + /** This method will enable you to clone a given mutation operator + * @return The clone + */ + public Object clone() { + return new MutateESCovarianceMatrixAdaptionPlus(this); + } + + + /** This method allows you to init the mutation operator + * @param individual The individual that will be mutated. + * @param opt The optimization problem. + */ + public void init(AbstractEAIndividual individual, InterfaceOptimizationProblem opt) { + + if (!(individual instanceof InterfaceESIndividual)) return; + super.init(individual,opt); + m_psuccesstarget=1.0/(5+Math.sqrt(m_lambda)/2); + m_psuccess=m_psuccesstarget; + m_stepd=1.0+m_D/(2.0*m_lambda); + m_cp=m_psuccesstarget*m_lambda/(2+m_psuccesstarget*m_lambda); + m_c=2.0/(2.0+m_D); + this.cov = 2.0/(6.0+Math.pow(m_D, 2)); //ATTN: differs from the standard CMA-ES + m_pthresh=0.44; + + } + + + + protected void adaptStrategyGen(AbstractEAIndividual child,AbstractEAIndividual parent) { + if(child.getFitness(0)<=parent.getFitness(0)){ + //updatecov + updateCovariance(child, parent); + //updateCovariance(); + } + + } + + /** + * @param parent + * @param child + */ + public void updateCovariance(AbstractEAIndividual child,AbstractEAIndividual parent) { + double[] step=new double[m_D]; + for(int i=0;i x[i]) x[i] = range[i][0]; + if (range[i][1] < x[i]) x[i] = range[i][1]; + } + ((InterfaceESIndividual)individual).SetDGenotype(x); + + } + //System.out.println("After Mutate: " +((GAIndividual)individual).getSolutionRepresentationFor()); + } + + /** This method allows you to perform either crossover on the strategy parameters + * or to deal in some other way with the crossover event. + * @param indy1 The original mother + * @param partners The original partners + */ + public void crossoverOnStrategyParameters(AbstractEAIndividual indy1, Population partners) { + // nothing to do here + } + + /** This method allows you to get a string representation of the mutation + * operator + * @return A descriptive string. + */ + public String getStringRepresentation() { + return "ES fixed step size mutation"; + } + +/********************************************************************************************************************** + * These are for GUI + */ + /** This method allows the CommonJavaObjectEditorPanel to read the + * name to the current object. + * @return The name. + */ + public String getName() { + return "ES polynomial mutation"; + } + /** This method returns a global info string + * @return description + */ + public String globalInfo() { + return "The polynomial mutation alters all elements according to a polynomial distribution"; + } + + /** This method allows you to set the number of crossovers that occur in the + * genotype. + * @param a The number of crossovers. + */ + public void setEta(double a) { + if (a < 0) a = 0; + this.m_Eta = a; + } + public double getEta() { + return this.m_Eta; + } + public String etaTipText() { + return "Set the Eta_c value (the larger the value, the more restricted the search)."; + } +} diff --git a/src/eva2/server/go/strategies/MultiObjectiveCMAES.java b/src/eva2/server/go/strategies/MultiObjectiveCMAES.java new file mode 100644 index 00000000..c422ce5d --- /dev/null +++ b/src/eva2/server/go/strategies/MultiObjectiveCMAES.java @@ -0,0 +1,303 @@ +package eva2.server.go.strategies; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Vector; + +import eva2.server.go.InterfacePopulationChangedEventListener; +import eva2.server.go.individuals.AbstractEAIndividual; +import eva2.server.go.individuals.InterfaceESIndividual; +import eva2.server.go.operators.archiving.AbstractArchiving; +import eva2.server.go.operators.archiving.ArchivingNSGAII; +import eva2.server.go.operators.archiving.ArchivingNSGAIISMeasure; +import eva2.server.go.operators.mutation.InterfaceMutationGenerational; +import eva2.server.go.operators.mutation.MutateESCovarianceMatrixAdaptionPlus; +import eva2.server.go.operators.selection.InterfaceSelection; +import eva2.server.go.operators.selection.SelectBestIndividuals; +import eva2.server.go.operators.selection.SelectMONSGAIICrowedTournament; +import eva2.server.go.operators.selection.SelectMONonDominated; +import eva2.server.go.populations.InterfaceSolutionSet; +import eva2.server.go.populations.Population; +import eva2.server.go.populations.SolutionSet; +import eva2.server.go.problems.AbstractOptimizationProblem; +import eva2.server.go.problems.InterfaceOptimizationProblem; + + +import eva2.tools.math.Mathematics; +import eva2.tools.math.RNG; +import eva2.tools.math.Jama.EigenvalueDecomposition; +import eva2.tools.math.Jama.Matrix; + +public class MultiObjectiveCMAES implements InterfaceOptimizer, Serializable +{ + + class CounterClass{ + public CounterClass(int i) { + value=i; + } + public int value; + public boolean seen=false; + } + + + private String m_Identifier = "NelderMeadSimplex"; + + + private Population m_Population; + private AbstractOptimizationProblem m_Problem; + + transient private InterfacePopulationChangedEventListener m_Listener; + + private int m_lambda = 1; + private int m_lambdamo=1; + + + + public MultiObjectiveCMAES() { + m_Population=new Population(m_lambdamo); + } + + public MultiObjectiveCMAES(MultiObjectiveCMAES a) { + m_Problem = (AbstractOptimizationProblem)a.m_Problem.clone(); + setPopulation((Population)a.m_Population.clone()); + m_lambda = a.m_lambda; + m_Identifier = a.m_Identifier; + } + + public MultiObjectiveCMAES clone() { + return new MultiObjectiveCMAES(this); + } + + + @Override + public void SetIdentifier(String name) { + m_Identifier=name; + } + + @Override + public void SetProblem(InterfaceOptimizationProblem problem) { + m_Problem = (AbstractOptimizationProblem)problem; + } + + /** This method allows you to add the LectureGUI as listener to the Optimizer + * @param ea + */ + public void addPopulationChangedEventListener(InterfacePopulationChangedEventListener ea) { + this.m_Listener = ea; + } + + + @Override + public void freeWilly() { + } + + @Override + public InterfaceSolutionSet getAllSolutions() { + Population pop = getPopulation(); + return new SolutionSet(pop, pop); + } + + @Override + public String getIdentifier() { + + return m_Identifier; + } + + @Override + public String getName() { + return "(1+"+m_lambda+") MO-CMA-ES"; + } + + @Override + public Population getPopulation() { + return m_Population; + } + + @Override + public InterfaceOptimizationProblem getProblem() { + return m_Problem; + } + + @Override + public String getStringRepresentation() { + StringBuilder strB = new StringBuilder(200); + strB.append("(1+"+m_lambda+") MO-CMA-ES:\nOptimization Problem: "); + strB.append(this.m_Problem.getStringRepresentationForProblem(this)); + strB.append("\n"); + strB.append(this.m_Population.getStringRepresentation()); + return strB.toString(); + } + + @Override + public void init() { + //initByPopulation(m_Population, true); + this.m_Population.setTargetSize(m_lambdamo); + this.m_Problem.initPopulation(this.m_Population); + // children = new Population(m_Population.size()); + this.evaluatePopulation(this.m_Population); + this.firePropertyChangedEvent(Population.nextGenerationPerformed); + + } + + + + @Override + public void initByPopulation(Population pop, boolean reset) { + setPopulation(pop); + if (reset) { + m_Problem.initPopulation(m_Population); + m_Problem.evaluate(m_Population); + + } + } + + /** This method will evaluate the current population using the + * given problem. + * @param population The population that is to be evaluated + */ + private void evaluatePopulation(Population population) { + this.m_Problem.evaluate(population); + } + + @Override + public void optimize() { + + HashMap SuccessCounterMap=new HashMap(); + + //Eltern markieren und für die Zählung vorbereiten + for(int j=0;jparentSMeasure ) ){ + SuccessCounterMap.get(parent.getIndyID()).value++; + } + }else{ //Debug + + SuccessCounterMap.get(parent.getIndyID()).seen=true; + } + } + + + //Selection + m_Population.clear(); + for(int i=0;i0&&m_Population.size()