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}.
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
*
* @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