import java.io.*; public class EPEvolve { 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 EPIndividual best_ind; // best individual of this evolution public EPEvolve(int generations,int mu,int num_obj_vars, float[] min_range, float[] max_range){ // mu: the size of the parents population best_fitness = new float[generations]; worst_fitness = new float[generations]; avr_fitness = new float[generations]; EPPopulation epp = new EPPopulation(mu,num_obj_vars,min_range,max_range); best_fitness[0] = epp.ind[epp.best_index].fitness; worst_fitness[0] = epp.ind[epp.worst_index].fitness; avr_fitness[0] = epp.avr_fitness; for(int i=1; i < generations; i++){ epp = epp.generate(epp,min_range,max_range); best_fitness[i] = epp.ind[epp.best_index].fitness; worst_fitness[i] = epp.ind[epp.worst_index].fitness; avr_fitness[i] = epp.avr_fitness; } best_ind = epp.ind[epp.best_index]; } public static void evolveAndMakeMFile(String file_name,int runs, int generations,int mu,int num_obj_vars, 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. EPEvolve[] epe = new EPEvolve[runs]; for(int i=0; i < runs; i++) epe[i] = new EPEvolve(generations,mu,num_obj_vars,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] += epe[j].best_fitness[i] / (float) runs; avr_avr_fitness[i] += epe[j].avr_fitness[i] / (float) runs; avr_worst_fitness[i] += epe[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("% EP 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(epe[epe.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}; // EPEvolve.evolveAndMakeMFile("ep.m",25,50,100,3,min,max); // De Jong's F2: // float[] min = new float[]{-2.048f, -2.048f}; // float[] max = new float[]{2.048f, 2.048f}; // EPEvolve.evolveAndMakeMFile("ep.m",25,150,100,2,min,max); // Schaffer F6: // float[] min = new float[]{-100.0f, -100.0f}; // float[] max = new float[]{100.0f, 100.0f}; // EPEvolve.evolveAndMakeMFile("ep.m",25,150,200,2,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}; // EPEvolve.evolveAndMakeMFile("ep.m",10,300,200,5,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}; EPEvolve.evolveAndMakeMFile("ep.m",25,200,300,10,min,max); } }