/* Routine for two point binary Crossover */ static void BinaryCrossover(Individual parent1, Individual parent2, Individual child1, Individual child2, ProblemDefinition problemObj, Randomization randomizationObj) { int i, j; double rand; int temp, site1, site2; for (i = 0; i < problemObj.BinaryVariableCount; i++) { rand = randomizationObj.RandomPercent(); if (rand <= problemObj.BinaryCrossoverProbability) { problemObj.BinaryCrossoverCount++; site1 = randomizationObj.RandomInteger(0, problemObj.Nbits[i] - 1); site2 = randomizationObj.RandomInteger(0, problemObj.Nbits[i] - 1); if (site1 > site2) { temp = site1; site1 = site2; site2 = temp; } for (j = 0; j < site1; j++) { child1.Gene[i][j] = parent1.Gene[i][j]; child2.Gene[i][j] = parent2.Gene[i][j]; } for (j = site1; j < site2; j++) { child1.Gene[i][j] = parent2.Gene[i][j]; child2.Gene[i][j] = parent1.Gene[i][j]; } for (j = site2; j < problemObj.Nbits[i]; j++) { child1.Gene[i][j] = parent1.Gene[i][j]; child2.Gene[i][j] = parent2.Gene[i][j]; } } else { for (j = 0; j < problemObj.Nbits[i]; j++) { child1.Gene[i][j] = parent1.Gene[i][j]; child2.Gene[i][j] = parent2.Gene[i][j]; } } } }
/* Actual implementation of the randomized quick sort used to sort a population based on a particular objective chosen */ static void q_sort_front_obj(Population pop, int objcount, int[] objArray, int left, int right, Randomization randomizationObj) { int index; int temp; int i, j; double pivot; if (left < right) { index = randomizationObj.RandomInteger(left, right); temp = objArray[right]; objArray[right] = objArray[index]; objArray[index] = temp; pivot = pop.IndList[objArray[right]].Obj[objcount]; i = left - 1; for (j = left; j < right; j++) { if (pop.IndList[objArray[j]].Obj[objcount] <= pivot) { i += 1; temp = objArray[j]; objArray[j] = objArray[i]; objArray[i] = temp; } } index = i + 1; temp = objArray[index]; objArray[index] = objArray[right]; objArray[right] = temp; q_sort_front_obj(pop, objcount, objArray, left, index - 1, randomizationObj); q_sort_front_obj(pop, objcount, objArray, index + 1, right, randomizationObj); } }
/* Routine for Tournament Selection, it creates a newPopulation from oldPopulation by performing Tournament Selection and the Crossover */ static void Selection(Population oldPopulation, Population newPopulation, ProblemDefinition problemObj, Randomization randomizationObj) { int[] a1, a2; //todo: optmizasyon int temp; int i; int rand; Individual parent1, parent2; a1 = new int[problemObj.PopulationSize]; a2 = new int[problemObj.PopulationSize]; for (i = 0; i < problemObj.PopulationSize; i++) { a1[i] = a2[i] = i; } for (i = 0; i < problemObj.PopulationSize; i++) { rand = randomizationObj.RandomInteger(i, problemObj.PopulationSize - 1); temp = a1[rand]; a1[rand] = a1[i]; a1[i] = temp; rand = randomizationObj.RandomInteger(i, problemObj.PopulationSize - 1); temp = a2[rand]; a2[rand] = a2[i]; a2[i] = temp; } for (i = 0; i < problemObj.PopulationSize; i += 4) { parent1 = Tournament(oldPopulation.IndList[a1[i]], oldPopulation.IndList[a1[i + 1]], problemObj, randomizationObj); parent2 = Tournament(oldPopulation.IndList[a1[i + 2]], oldPopulation.IndList[a1[i + 3]], problemObj, randomizationObj); Crossover(parent1, parent2, newPopulation.IndList[i], newPopulation.IndList[i + 1], problemObj, randomizationObj); parent1 = Tournament(oldPopulation.IndList[a2[i]], oldPopulation.IndList[a2[i + 1]], problemObj, randomizationObj); parent2 = Tournament(oldPopulation.IndList[a2[i + 2]], oldPopulation.IndList[a2[i + 3]], problemObj, randomizationObj); Crossover(parent1, parent2, newPopulation.IndList[i + 2], newPopulation.IndList[i + 3], problemObj, randomizationObj); } }
/* Actual implementation of the randomized quick sort used to sort a population based on crowding distance */ static void q_sort_dist(Population pop, int[] dist, int left, int right, Randomization randomizationObj) { int index; int temp; int i, j; double pivot; if (left < right) { index = randomizationObj.RandomInteger(left, right); temp = dist[right]; dist[right] = dist[index]; dist[index] = temp; pivot = pop.IndList[dist[right]].CrowdDist; i = left - 1; for (j = left; j < right; j++) { if (pop.IndList[dist[j]].CrowdDist <= pivot) { i += 1; temp = dist[j]; dist[j] = dist[i]; dist[i] = temp; } } index = i + 1; temp = dist[index]; dist[index] = dist[right]; dist[right] = temp; q_sort_dist(pop, dist, left, index - 1, randomizationObj); q_sort_dist(pop, dist, index + 1, right, randomizationObj); } }