Create JSON object with optimization details.

ToDo:
- Store JSON to file
- Fix sync issue with generation 1 duplicate
This commit is contained in:
Fabian Becker 2013-12-10 11:50:37 +01:00
parent b005bb7a96
commit 30381f4c04

View File

@ -8,9 +8,11 @@ import eva2.optimization.modules.OptimizationParameters;
import eva2.optimization.operator.terminators.CombinedTerminator; import eva2.optimization.operator.terminators.CombinedTerminator;
import eva2.optimization.operator.terminators.EvaluationTerminator; import eva2.optimization.operator.terminators.EvaluationTerminator;
import eva2.optimization.operator.terminators.FitnessValueTerminator; import eva2.optimization.operator.terminators.FitnessValueTerminator;
import eva2.optimization.population.Population;
import eva2.optimization.problems.AbstractOptimizationProblem; import eva2.optimization.problems.AbstractOptimizationProblem;
import eva2.optimization.strategies.DifferentialEvolution; import eva2.optimization.strategies.DifferentialEvolution;
import eva2.optimization.strategies.InterfaceOptimizer; import eva2.optimization.strategies.InterfaceOptimizer;
import com.google.gson.*;
import org.apache.commons.cli.*; import org.apache.commons.cli.*;
import org.reflections.Reflections; import org.reflections.Reflections;
import java.lang.reflect.Modifier; import java.lang.reflect.Modifier;
@ -48,6 +50,9 @@ public class Main implements OptimizationStateListener, InterfacePopulationChang
private long seed = System.currentTimeMillis(); private long seed = System.currentTimeMillis();
private AbstractOptimizationProblem problem; private AbstractOptimizationProblem problem;
private InterfaceOptimizer optimizer; private InterfaceOptimizer optimizer;
private JsonObject jsonObject;
private JsonArray optimizationRuns;
private JsonArray generationsArray;
/** /**
* Creates a set of default options used in all optimizations. * Creates a set of default options used in all optimizations.
@ -84,6 +89,8 @@ public class Main implements OptimizationStateListener, InterfacePopulationChang
return opt; return opt;
} }
@Override @Override
public void performedStop() { public void performedStop() {
//To change body of implemented methods use File | Settings | File Templates. //To change body of implemented methods use File | Settings | File Templates.
@ -101,7 +108,7 @@ public class Main implements OptimizationStateListener, InterfacePopulationChang
@Override @Override
public void updateProgress(int percent, String msg) { public void updateProgress(int percent, String msg) {
//To change body of implemented methods use File | Settings | File Templates. printProgressBar(percent);
} }
public static void printProgressBar(int percent) { public static void printProgressBar(int percent) {
@ -172,6 +179,9 @@ public class Main implements OptimizationStateListener, InterfacePopulationChang
optimizerParams = new String[]{}; optimizerParams = new String[]{};
} }
this.jsonObject = new JsonObject();
this.optimizationRuns = new JsonArray();
/** /**
* Default command line options only require help or optimizer. * Default command line options only require help or optimizer.
* Later we build extended command line options depending on * Later we build extended command line options depending on
@ -234,6 +244,16 @@ public class Main implements OptimizationStateListener, InterfacePopulationChang
System.exit(-1); System.exit(-1);
} }
} }
this.jsonObject.addProperty("population_size", this.populationSize);
this.jsonObject.addProperty("number_of_runs", this.numberOfRuns);
this.jsonObject.addProperty("seed", this.seed);
JsonObject problemObject = new JsonObject();
problemObject.addProperty("name", this.problem.getName());
problemObject.addProperty("dimension", 30);
this.jsonObject.add("problem", problemObject);
} }
/** /**
@ -290,6 +310,9 @@ public class Main implements OptimizationStateListener, InterfacePopulationChang
break; break;
case "GeneticAlgorithm": case "GeneticAlgorithm":
System.out.println("Genetic Algorithm"); System.out.println("Genetic Algorithm");
break;
case "ParticleSwarmOptimization":
break; break;
default: default:
throw new Exception("Unsupported Optimizer"); throw new Exception("Unsupported Optimizer");
@ -310,7 +333,9 @@ public class Main implements OptimizationStateListener, InterfacePopulationChang
} }
private void runOptimization() { private void runOptimization() {
for(int i = 0; i < this.numberOfRuns; i++) {
this.generationsArray = new JsonArray();
// Terminate after 10000 function evaluations OR after reaching a fitness < 0.1 // Terminate after 10000 function evaluations OR after reaching a fitness < 0.1
OptimizerFactory.setEvaluationTerminator(50000); OptimizerFactory.setEvaluationTerminator(50000);
OptimizerFactory.addTerminator(new FitnessValueTerminator(new double[]{0.01}), CombinedTerminator.OR); OptimizerFactory.addTerminator(new FitnessValueTerminator(new double[]{0.01}), CombinedTerminator.OR);
@ -325,10 +350,24 @@ public class Main implements OptimizationStateListener, InterfacePopulationChang
// wait // wait
} }
JsonObject optimizationDetails = new JsonObject();
optimizationDetails.addProperty("total_time", 1.0);
optimizationDetails.addProperty("total_function_calls", optimizer.getPopulation().getFunctionCalls());
optimizationDetails.addProperty("termination_criteria", OptimizerFactory.terminatedBecause());
optimizationDetails.add("generations", this.generationsArray);
this.optimizationRuns.add(optimizationDetails);
System.out.println(OptimizerFactory.terminatedBecause()); System.out.println(OptimizerFactory.terminatedBecause());
System.out.println(optimizer.getPopulation().getFunctionCalls()); System.out.println(optimizer.getPopulation().getFunctionCalls());
} }
this.jsonObject.add("runs", this.optimizationRuns);
Gson gson = new GsonBuilder().setPrettyPrinting().create();
System.out.println(gson.toJson(this.jsonObject));
}
private static void showOptimizerHelp() { private static void showOptimizerHelp() {
Map<String, Class<? extends InterfaceOptimizer>> optimizerList = createOptimizerList(); Map<String, Class<? extends InterfaceOptimizer>> optimizerList = createOptimizerList();
@ -349,6 +388,28 @@ public class Main implements OptimizationStateListener, InterfacePopulationChang
@Override @Override
public void registerPopulationStateChanged(Object source, String name) { public void registerPopulationStateChanged(Object source, String name) {
//System.out.println(name); if (name.equals("NextGenerationPerformed")) {
InterfaceOptimizer optimizer = (InterfaceOptimizer)source;
Population population = optimizer.getPopulation();
JsonObject newGeneration = new JsonObject();
newGeneration.addProperty("generation", population.getGeneration());
newGeneration.addProperty("function_calls", population.getFunctionCalls());
JsonArray bestFitness = new JsonArray();
for(double val : population.getBestFitness()) {
bestFitness.add(new JsonPrimitive(val));
}
newGeneration.add("best_fitness", bestFitness);
JsonArray meanFitness = new JsonArray();
for(double val : population.getMeanFitness()) {
meanFitness.add(new JsonPrimitive(val));
}
newGeneration.add("mean_fitness", meanFitness);
System.out.println(newGeneration.toString());
//this.generationsArray.add(newGeneration);
}
} }
} }