module gmle.salsa.framework; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; public behavior GeneticSearch { /** * Variables to control the genetic search */ int elite_population_size = 5; int population_size = 20; double mutation_chance = 0.3; double mutation_strength = 1.0; double reproduce_chance = 0.7; /** * Variables for stopping conditions */ int current_iteration = 0; int maximum_iterations = 10000; double probability_cutoff = 0.001; int stopping_population_size = 20; double stopping_population_probability_threshold = 0.00001; MLEvaluator evaluator; public void init_data(String evaluatorClass, String theaters_file) { this.evaluator = new MLEvaluator(evaluatorClass, theaters_file); } public void init_data(String evaluatorClass, int number_actors) { this.evaluator = new MLEvaluator(evaluatorClass, number_actors); } public void initialize(Object[] init_params) { evaluator<-initialize(init_params) @ currentContinuation; } double[] parameter_min; double[] parameter_max; double[] genetic_search(double[] parameter_min, double[] parameter_max) { this.parameter_min = parameter_min; this.parameter_max = parameter_max; current_population_likelihood = new double[parameter_min.length]; previous_population_likelihood = new double[parameter_min.length]; current_population = new double[population_size][parameter_min.length]; previous_population = new double[population_size][parameter_min.length]; for (int i = 0; i < current_population.length; i++) { for (int j = 0; j < current_population.length; j++) { current_population[i][j] = parameter_min[j] + ((parameter_max[j]-parameter_min[j])*Math.random()); } } evaluator<-init_data() @ evaluate_current_population() @ search() @ currentContinuation; } double[] current_population_likelihood; double[][] current_population; double[] previous_population_likelihood; double[][] previous_population; void evaluation_current_population() { join { for (int i = 0; i < current_population.length; i++) { evaluator<-evaluate(current_population[i]); } } @ set_current_likelihood(token) @ currentContinuation; } void set_current_likelihood(Object[] results) { for (int i = 0; i < results.length; i++) { current_population_likelihood[i] = ((Double)results[i]).doubleValue(); } } double[] search() { for (int i = 0; i < current_population_likelihood.length; i++) { previous_population_likelihood[i] = current_population_likelihood[i]; for (int j = 0; j < current_population[i].length; j++) { previous_population[i][j] = current_population[i][j]; } } //generate new population return new double[10]; } BufferedWriter evaluation_file; void set_evaluation_output(String filename) { try { this.evaluation_file = new BufferedWriter(new FileWriter(new File(filename))); } catch (Exception e) { System.err.println("Unable to open evaluation output file: " + filename); System.err.println(e); e.printStackTrace(); System.exit(0); } } int evaluations_done = 0; double track_evaluate(double[] parameters) { token result = evaluator<-evaluate(parameters); write_result(result, parameters) @ currentContinuation; } double write_result(double result, double[] parameters) { if (evaluation_file != null) { evaluations_done++; try { evaluation_file.write(evaluations_done + " : " + result + " :"); for (int i = 0; i < parameters.length; i++) { evaluation_file.write(" " + parameters[i]); } evaluation_file.write("\n"); evaluation_file.flush(); } catch (Exception e) { System.err.println("Unable to write to evaluation output file"); System.err.println(e); e.printStackTrace(); System.exit(0); } } return result; } }