import java.io.*; public class ESEvolve { public float[] best_fitness; // best_fitness[i] is the best fitness of i'th generation of this evolution public float[] worst_fitness; public float[] avr_fitness; public ESIndividual best_ind; // best individual of this evolution public ESEvolve(int generations, int mu,int lambda,boolean comma_strategy, int num_obj_vars, int xrate,int mrate, float[] min_range, float[] max_range){ // mu: the size of the parents population // lambda: the size of the offsprings population // comma_strategy == true -> comma strategy // comma_strategy == false -> plus strategy // xrate: cross-over rate, the initial value // mrate: mutation rate, the initial value // xrate and mrate may be adapted over generations best_fitness = new float[generations]; worst_fitness = new float[generations]; avr_fitness = new float[generations]; ESPopulation esp = new ESPopulation(mu,num_obj_vars,min_range,max_range); best_fitness[0] = esp.ind[esp.best_index].fitness; worst_fitness[0] = esp.ind[esp.worst_index].fitness; avr_fitness[0] = esp.avr_fitness; for(int i=1; i < generations; i++){ esp = esp.generate(esp,comma_strategy,lambda,xrate,mrate,min_range,max_range); best_fitness[i] = esp.ind[esp.best_index].fitness; worst_fitness[i] = esp.ind[esp.worst_index].fitness; avr_fitness[i] = esp.avr_fitness; } best_ind = esp.ind[esp.best_index]; } public static void evolveAndMakeMFile(String file_name,int runs, int generations, int mu,int lambda,boolean comma_strategy, int num_obj_vars,int xrate,int mrate, float[] min_range, float[] max_range){ // makes a M file (file_name) so that if we run this file in MATLAB // the best fitness versus generation, average fitness versus generation // and wrost fitness versus generation are plotted. // best, average and worst fitness values are the average of "runs" evolutions. ESEvolve[] ese = new ESEvolve[runs]; for(int i=0; i < runs; i++) ese[i] = new ESEvolve(generations,mu,lambda,comma_strategy,num_obj_vars,xrate,mrate,min_range,max_range); float[] avr_best_fitness = new float[generations]; float[] avr_avr_fitness = new float[generations]; float[] avr_worst_fitness = new float[generations]; for(int i=0; i < generations; i++){ avr_best_fitness[i] = 0; avr_avr_fitness[i] = 0; avr_worst_fitness[i] = 0; for(int j=0; j < runs; j++){ avr_best_fitness[i] += ese[j].best_fitness[i] / (float) runs; avr_avr_fitness[i] += ese[j].avr_fitness[i] / (float) runs; avr_worst_fitness[i] += ese[j].worst_fitness[i] / (float) runs; } } try{ PrintWriter out=new PrintWriter(new BufferedWriter(new FileWriter(file_name))); out.println("\n% M.M.Haji"); out.println("% EC project"); out.println("% ES results:\n"); out.print("best_fitness = ["); for(int i=0; i < avr_best_fitness.length; i++){ out.print(avr_best_fitness[i]+" "); } out.println("];"); out.print("average_fitness = ["); for(int i=0; i < avr_avr_fitness.length; i++){ out.print(avr_avr_fitness[i]+" "); } out.println("];"); out.print("worst_fitness = ["); for(int i=0; i < avr_worst_fitness.length; i++){ out.print(avr_worst_fitness[i]+" "); } out.println("];\n"); out.println("plot(1:"+generations+",best_fitness,1:"+generations+",average_fitness,1:"+generations+",worst_fitness)"); out.println("\nlegend('best fitness','average fitness','worst fitness');"); out.println("xlabel('generation');"); out.println("ylabel('fitness');"); out.close(); }catch(Exception ex1){ System.out.println("error: can't create "+file_name); } System.out.println(ese[ese.length-1].best_ind); } public static void main(String[] args) { // De Jong's F1: // float[] min = new float[]{-5.12f, -5.12f, -5.12f}; // float[] max = new float[]{5.12f, 5.12f, 5.12f}; // ESEvolve.evolveAndMakeMFile("es.m",25,150,50,100,false,3,0,100,min,max); // De Jong's F2: // float[] min = new float[]{-2.048f, -2.048f}; // float[] max = new float[]{2.048f, 2.048f}; // ESEvolve.evolveAndMakeMFile("es.m",25,150,50,100,false,2,0,100,min,max); // Schaffer F6: // float[] min = new float[]{-100.0f, -100.0f}; // float[] max = new float[]{100.0f, 100.0f}; // ESEvolve.evolveAndMakeMFile("es.m",25,150,50,100,false,2,0,100,min,max); // Ackey F1 (5 Dimentional): float[] min = new float[]{-8.0f, -8.0f, -8.0f, -8.0f, -8.0f}; float[] max = new float[]{8.0f, 8.0f, 8.0f, 8.0f, 8.0f}; ESEvolve.evolveAndMakeMFile("es.m",25,150,50,100,false,5,0,100,min,max); // Rastrigin F1 (10 dimentional): // float[] min = new float[]{-10.0f, -10.0f, -10.0f, -10.0f, -10.0f, -10.0f, -10.0f, -10.0f, -10.0f, -10.0f}; // float[] max = new float[]{3.0f, 3.0f, 3.0f, 3.0f, 3.0f, 3.0f, 3.0f, 3.0f, 3.0f, 3.0f}; // ESEvolve.evolveAndMakeMFile("es.m",1,300,30,300,false,10,0,100,min,max); } }