コード例 #1
0
ファイル: UCTProblem.cs プロジェクト: cemusta/NSGAII_UCT
 /* 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];
             }
         }
     }
 }
コード例 #2
0
ファイル: UCTProblem.cs プロジェクト: cemusta/NSGAII_UCT
 /* 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);
     }
 }
コード例 #3
0
ファイル: UCTProblem.cs プロジェクト: cemusta/NSGAII_UCT
 /* 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);
     }
 }
コード例 #4
0
ファイル: UCTProblem.cs プロジェクト: cemusta/NSGAII_UCT
 /* 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);
     }
 }