// Select individuals for crossover private static Individual rouletteSelection(Population pop) { double[] weights = new double[pop.size()]; for (int i = 0; i < pop.size(); i++) { weights[i] = FitnessCalc.getProb(pop.getIndividual(i)); } double weight_sum = 0; for (int i = 0; i < weights.Length; i++) { weight_sum += weights[i]; } // get a random value double value = randUniformPositive() * weight_sum; // locate the random value based on the weights for (int i = 0; i < weights.Length; i++) { value -= weights[i]; if (value <= 0) { return(pop.getIndividual(i)); } } // only when rounding errors occur return(pop.getIndividual(weights.Length - 1)); }
//getFitness public double getFitness() { if (fitness == 0) { fitness = FitnessCalc.getFitness(this); } return(fitness); }
//Evolve population public static Population evolvePopulation(Population pop) { Population newPopulation = new Population(pop.size(), false); Individual fittestOfThisPop = null; //keep your best individual if (Elitism) { //get fittest of the CURRENT pop fittestOfThisPop = newPopulation.saveIndividual(0, FitnessCalc.getFittest()); //SAVE best of the algorithm if (bestSolution != null) { if (betterFitness(bestSolution, fittestOfThisPop)) { bestSolution = fittestOfThisPop; } } else { bestSolution = fittestOfThisPop; } } //Crossover population int elitismOffset; if (Elitism) { elitismOffset = 1; } else { elitismOffset = 0; } //loop over tje population size and create new individuals with crossover for (int i = elitismOffset; i < pop.size(); i++) { Individual indiv1 = rouletteSelection(pop); Individual indiv2 = rouletteSelection(pop); Individual newIndiv = crossover(indiv1, indiv2); newPopulation.saveIndividual(i, newIndiv); } //Mutate population for (int i = elitismOffset; i < newPopulation.size(); i++) { mutate(newPopulation.getIndividual(i)); } // fitless die & replace by fittest if (DieFactor) { if (elitism) { newPopulation.saveIndividual(FitnessCalc.getFitlessIndex(), fittestOfThisPop); } else { newPopulation.saveIndividual(FitnessCalc.getFitlessIndex(), FitnessCalc.getFittest()); } } return(newPopulation); }