import java.io.*; public class GAEvolve { 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 GAIndividual best_ind; // best individual of this evolution public GAEvolve(int generations, int pop_size, int genome_size, int xrate,int mrate, float[] min_range, float[] max_range){ // 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]; GAPopulation gap = new GAPopulation(pop_size,genome_size,min_range,max_range); best_fitness[0] = gap.ind[gap.best_index].fitness; worst_fitness[0] = gap.ind[gap.worst_index].fitness; avr_fitness[0] = gap.avr_fitness; for(int i=1; i < generations; i++){ gap = gap.generate(gap,xrate,mrate,min_range,max_range); best_fitness[i] = gap.ind[gap.best_index].fitness; worst_fitness[i] = gap.ind[gap.worst_index].fitness; avr_fitness[i] = gap.avr_fitness; } best_ind = gap.ind[gap.best_index]; } public static void evolveAndMakeMFile(String file_name,int runs, int generations, int pop_size, int genome_size, 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. GAEvolve[] gae = new GAEvolve[runs]; for(int i=0; i < runs; i++) gae[i] = new GAEvolve(generations,pop_size,genome_size,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] += gae[j].best_fitness[i] / (float) runs; avr_avr_fitness[i] += gae[j].avr_fitness[i] / (float) runs; avr_worst_fitness[i] += gae[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("% GA 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(gae[gae.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}; // GAEvolve.evolveAndMakeMFile("ga.m",1,300,400,3,70,20,min,max); // De Jong's F2: // float[] min = new float[]{-2.048f, -2.048f}; // float[] max = new float[]{2.048f, 2.048f}; // GAEvolve.evolveAndMakeMFile("ga.m",1,300,400,2,70,20,min,max); // Schaffer F6: // float[] min = new float[]{-100.0f, -100.0f}; // float[] max = new float[]{100.0f, 100.0f}; // GAEvolve.evolveAndMakeMFile("ga.m",1,300,400,2,70,20,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}; // GAEvolve.evolveAndMakeMFile("ga.m",1,300,400,5,70,20,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}; GAEvolve.evolveAndMakeMFile("ga.m",1,300,400,10,70,20,min,max); } }