private void initDNA(bool[] booleanDNA) { float initialGene, a, b, var; bool[] bits; int nVars = Fitness.nInputVars; if (booleanDNA == null) { for (int i = 0; i < nVars; i++) { var = (float)GARandomNumberGenerator.getNextfloat(); a = (float)-Math.Pow(10, 1); b = (float)Math.Pow(10, 1); initialGene = (b - a) * var + a; DNA[i] = initialGene; //bits = float2bits(initialGene); //for (int j = 0; j < 32; j++) // DNA[i * 32 + j] = bits[j]; } } else { DNA = bits2floats(booleanDNA); } }
public void evolve() { int i, j; //Individual[] children = new Individual[population.Length]; // all population should reproduce Individual mom, dad, child1, child2; bool[] momDNA, dadDNA, child1DNA, child2DNA; for (i = 0; i <= population.Length - 1; i += 2) { mom = population[i]; // clone(); dad = population[i + 1]; // clone(); momDNA = mom.binaryDNA(); dadDNA = dad.binaryDNA(); ////////////////////////// crossover and mutation int crossoverPosition1, crossoverPosition2, temp; while (true) { crossoverPosition1 = (int)(GARandomNumberGenerator.getNextfloat() * momDNA.Length); crossoverPosition2 = (int)(GARandomNumberGenerator.getNextfloat() * momDNA.Length); if (crossoverPosition1 != crossoverPosition2) { break; } } if (crossoverPosition1 > crossoverPosition2) { temp = crossoverPosition2; crossoverPosition2 = crossoverPosition1; crossoverPosition1 = temp; } child1DNA = new bool[momDNA.Length]; child2DNA = new bool[momDNA.Length]; for (j = 0; j < momDNA.Length; j++) { // crossover if (j >= crossoverPosition1 && j <= crossoverPosition2) { child1DNA[j] = dadDNA[j]; child2DNA[j] = momDNA[j]; } else { child1DNA[j] = momDNA[j]; child2DNA[j] = dadDNA[j]; } // mutation if (GARandomNumberGenerator.getNextfloat() < options.MutationProbability) { child1DNA[j] = !child1DNA[j]; } if (GARandomNumberGenerator.getNextfloat() < options.MutationProbability) { child2DNA[j] = !child2DNA[j]; } } child1 = new Individual(child1DNA); child2 = new Individual(child2DNA); //children[i] = child1; //children[i+1] = child2; population[i] = child1; population[i + 1] = child2; ///////////////////////////////////// } // insert the children into the population except the best individual //population = children; population[bestIndex] = bestIndividual; // clone(); // scramble population; int[] scrambledIndexes = new int[population.Length]; for (i = 0; i < population.Length; i++) { scrambledIndexes[i] = i; } scrambledIndexes = ShuffleArray(scrambledIndexes); Individual[] p = new Individual[population.Length]; for (i = 0; i < population.Length; i++) { p[i] = population[scrambledIndexes[i]]; } population = p; return; }