package fr.inria.optimization.cmaes.examples; import fr.inria.optimization.cmaes.CMAEvolutionStrategy; import fr.inria.optimization.cmaes.fitness.IObjectiveFunction; /** The very well-known Rosenbrock objective function to be minimized. */ class Rosenbrock implements IObjectiveFunction { // meaning implements methods valueOf and isFeasible public double valueOf (double[] x) { double res = 0; for (int i = 0; i < x.length-1; ++i) res += 100 * (x[i]*x[i] - x[i+1]) * (x[i]*x[i] - x[i+1]) + (x[i] - 1.) * (x[i] - 1.); return res; } public boolean isFeasible(double[] x) {return true; } // entire R^n is feasible } /** A very short example program how to use the class CMAEvolutionStrategy. The code is given below, see also the code snippet in the documentation of class {@link CMAEvolutionStrategy}. * For implementation of restarts see {@link CMAExample2}. <pre> public class CMAExample1 { public static void main(String[] args) { IObjectiveFunction fitfun = new Rosenbrock(); // new a CMA-ES and set some initial values CMAEvolutionStrategy cma = new CMAEvolutionStrategy(); cma.readProperties(); // read options, see file CMAEvolutionStrategy.properties cma.setDimension(22); // overwrite some loaded properties cma.setInitialX(0.5); // in each dimension, also setTypicalX can be used cma.setInitialStandardDeviation(0.2); // also a mandatory setting cma.options.stopFitness = 1e-9; // optional setting // initialize cma and get fitness array to fill in later double[] fitness = cma.init(); // new double[cma.parameters.getPopulationSize()]; // initial output to files cma.writeToDefaultFilesHeaders(0); // 0 == overwrites old files // iteration loop while(cma.stopConditions.getNumber() == 0) { // core iteration step double[][] pop = cma.samplePopulation(); // get a new population of solutions for(int i = 0; i < pop.length; ++i) { // for each candidate solution i while (!fitfun.isFeasible(pop[i])) // test whether solution is feasible, pop[i] = cma.resampleSingle(i); // re-sample solution until it is feasible fitness[i] = fitfun.valueOf(pop[i]); // compute fitness value, where fitfun } // is the function to be minimized cma.updateDistribution(fitness); // pass fitness array to update search distribution // output to console and files cma.writeToDefaultFiles(); int outmod = 150; if (cma.getCountIter() % (15*outmod) == 1) cma.printlnAnnotation(); // might write file as well if (cma.getCountIter() % outmod == 1) cma.println(); } // evaluate mean value as it is the best estimator for the optimum cma.setFitnessOfMeanX(fitfun.valueOf(cma.getMeanX())); // updates the best ever solution // final output cma.writeToDefaultFiles(1); cma.println(); cma.println("Terminated due to"); for (String s : cma.stopConditions.getMessages()) cma.println(" " + s); cma.println("best function value " + cma.getBestFunctionValue() + " at evaluation " + cma.getBestEvaluationNumber()); // we might return cma.getBestSolution() or cma.getBestX() } // main } // class </pre> * * @see CMAEvolutionStrategy * * @author Nikolaus Hansen, released into public domain. */ public class CMAExample1 { public static void main(String[] args) { IObjectiveFunction fitfun = new Rosenbrock(); // new a CMA-ES and set some initial values CMAEvolutionStrategy cma = new CMAEvolutionStrategy(); cma.readProperties(); // read options, see file CMAEvolutionStrategy.properties cma.setDimension(10); // overwrite some loaded properties cma.setInitialX(0.05); // in each dimension, also setTypicalX can be used cma.setInitialStandardDeviation(0.2); // also a mandatory setting cma.options.stopFitness = 1e-14; // optional setting // initialize cma and get fitness array to fill in later double[] fitness = cma.init(); // new double[cma.parameters.getPopulationSize()]; // initial output to files cma.writeToDefaultFilesHeaders(0); // 0 == overwrites old files // iteration loop while(cma.stopConditions.getNumber() == 0) { // --- core iteration step --- double[][] pop = cma.samplePopulation(); // get a new population of solutions for(int i = 0; i < pop.length; ++i) { // for each candidate solution i // a simple way to handle constraints that define a convex feasible domain // (like box constraints, i.e. variable boundaries) via "blind re-sampling" // assumes that the feasible domain is convex, the optimum is while (!fitfun.isFeasible(pop[i])) // not located on (or very close to) the domain boundary, pop[i] = cma.resampleSingle(i); // initialX is feasible and initialStandardDeviations are // sufficiently small to prevent quasi-infinite looping here // compute fitness/objective value fitness[i] = fitfun.valueOf(pop[i]); // fitfun.valueOf() is to be minimized } cma.updateDistribution(fitness); // pass fitness array to update search distribution // --- end core iteration step --- // output to files and console cma.writeToDefaultFiles(); int outmod = 150; if (cma.getCountIter() % (15*outmod) == 1) cma.printlnAnnotation(); // might write file as well if (cma.getCountIter() % outmod == 1) cma.println(); } // evaluate mean value as it is the best estimator for the optimum cma.setFitnessOfMeanX(fitfun.valueOf(cma.getMeanX())); // updates the best ever solution // final output cma.writeToDefaultFiles(1); cma.println(); cma.println("Terminated due to"); for (String s : cma.stopConditions.getMessages()) cma.println(" " + s); cma.println("best function value " + cma.getBestFunctionValue() + " at evaluation " + cma.getBestEvaluationNumber()); // we might return cma.getBestSolution() or cma.getBestX() } // main } // class