Population population = new Population(); Individual fittest; Individual secondFittest; int generationCount = 0;
publicstaticvoidmain(String[] args){
Random rn = new Random(); SimpleDemoGA demo = new SimpleDemoGA(); //Initialize population demo.population.initializePopulation(10); //Calculate fitness of each individual demo.population.calculateFitness(); System.out.println("Generation: " + demo.generationCount + " Fittest: " + demo.population.fittest);
//While population gets an individual with maximum fitness while (demo.population.fittest < 5) { ++demo.generationCount; //Do selection demo.selection(); //Do crossover demo.crossover(); //Do mutation under a random probability if (rn.nextInt()%7 < 5) { demo.mutation(); } //Add fittest offspring to population demo.addFittestOffspring(); //Calculate new fitness value demo.population.calculateFitness(); System.out.println("Generation: " + demo.generationCount + " Fittest: " + demo.population.fittest); }
System.out.println("\nSolution found in generation " + demo.generationCount); System.out.println("Fitness: "+demo.population.getFittest().fitness); System.out.print("Genes: "); for (int i = 0; i < 5; i++) { System.out.print(demo.population.getFittest().genes[i]); }
System.out.println("");
}
//Selection voidselection(){ //Select the most fittest individual fittest = population.getFittest(); //Select the second most fittest individual secondFittest = population.getSecondFittest(); }
//Crossover voidcrossover(){ Random rn = new Random(); //Select a random crossover point int crossOverPoint = rn.nextInt(population.individuals[0].geneLength);
//Swap values among parents for (int i = 0; i < crossOverPoint; i++) { int temp = fittest.genes[i]; fittest.genes[i] = secondFittest.genes[i]; secondFittest.genes[i] = temp;
}
}
//Mutation voidmutation(){ Random rn = new Random(); //Select a random mutation point int mutationPoint = rn.nextInt(population.individuals[0].geneLength);
//Flip values at the mutation point if (fittest.genes[mutationPoint] == 0) { fittest.genes[mutationPoint] = 1; } else { fittest.genes[mutationPoint] = 0; }
//Replace least fittest individual from most fittest offspring voidaddFittestOffspring(){ //Update fitness values of offspring fittest.calcFitness(); secondFittest.calcFitness(); //Get index of least fit individual int leastFittestIndex = population.getLeastFittestIndex(); //Replace least fittest individual from most fittest offspring population.individuals[leastFittestIndex] = getFittestOffspring(); }
}
//Individual class classIndividual{
int fitness = 0; int[] genes = newint[5]; int geneLength = 5;
publicIndividual(){ Random rn = new Random();
//Set genes randomly for each individual for (int i = 0; i < genes.length; i++) { genes[i] = rn.nextInt() % 2; }
fitness = 0; }
//Calculate fitness publicvoidcalcFitness(){
fitness = 0; for (int i = 0; i < 5; i++) { if (genes[i] == 1) { ++fitness; } } }
}
//Population class classPopulation{
int popSize = 10; Individual[] individuals = new Individual[10]; int fittest = 0;
//Initialize population publicvoidinitializePopulation(int size){ for (int i = 0; i < individuals.length; i++) { individuals[i] = new Individual(); } }
//Get the fittest individual public Individual getFittest(){ int maxFit = Integer.MIN_VALUE; for (int i = 0; i < individuals.length; i++) { if (maxFit <= individuals[i].fitness) { maxFit = i; } } fittest = individuals[maxFit].fitness; return individuals[maxFit]; }
//Get the second most fittest individual public Individual getSecondFittest(){ int maxFit1 = 0; int maxFit2 = 0; for (int i = 0; i < individuals.length; i++) { if (individuals[i].fitness > individuals[maxFit1].fitness) { maxFit2 = maxFit1; maxFit1 = i; } elseif (individuals[i].fitness > individuals[maxFit2].fitness) { maxFit2 = i; } } return individuals[maxFit2]; }
//Get index of least fittest individual publicintgetLeastFittestIndex(){ int minFit = 0; for (int i = 0; i < individuals.length; i++) { if (minFit >= individuals[i].fitness) { minFit = i; } } return minFit; }
//Calculate fitness of each individual publicvoidcalculateFitness(){
for (int i = 0; i < individuals.length; i++) { individuals[i].calcFitness(); } getFittest(); }