00001 using System;
00002 using System.Collections.Generic;
00003 using System.Linq;
00004 using System.Text;
00005 using GEP.Core.Common;
00006
00007 namespace GEP.Core.Float.MatingProbabilityFunctions
00008 {
00044 [Serializable]
00045 public class SogartarEllipticMappingFitnessToProbability : MatingProbabilityFunction
00046 {
00052 public SogartarEllipticMappingFitnessToProbability(bool fitnessCloserToZeroIsBetter)
00053 : base(fitnessCloserToZeroIsBetter)
00054 {
00055 }
00056
00057 public override void SetMatingProbability(Common.Population population)
00058 {
00059 population._totalMatingProbability = 0;
00060 int popSize = population.Size;
00061 double minFitness = double.MaxValue;
00062 double maxFitness = double.MinValue;
00063 double fitness;
00064 for (int i = 0; i < popSize; i++)
00065 {
00066 fitness = population._genotypes[i]._fitness;
00067 if (double.IsNaN(fitness) || double.IsInfinity(fitness))
00068 {
00069 if (_fitnessCloserToZeroIsBetter)
00070 {
00071 population._genotypes[i]._fitness = double.MaxValue;
00072 fitness = double.MaxValue;
00073 }
00074 else
00075 {
00076 population._genotypes[i]._fitness = 0;
00077 fitness = 0;
00078 }
00079 }
00080 else
00081 {
00082 if (fitness < minFitness)
00083 minFitness = fitness;
00084 if (maxFitness < fitness)
00085 maxFitness = fitness;
00086 }
00087 }
00088
00089 double doubleMidFitness = maxFitness - minFitness;
00090 int halfN_Population = popSize / 2;
00091 double medianAverageFitness = 0;
00092 double currentMinFitness;
00093 int currentMinFitnessIndex = 0;
00094 for (int i = 0; i <= halfN_Population; i++)
00095 {
00096 currentMinFitness = double.MaxValue;
00097 for (int j = 0; j < popSize; j++)
00098 {
00099 if (population._genotypes[j]._fitness < currentMinFitness &&
00100 medianAverageFitness < population[j]._fitness)
00101 {
00102 currentMinFitness = population._genotypes[j]._fitness;
00103 currentMinFitnessIndex = j;
00104 }
00105 }
00106 medianAverageFitness = currentMinFitness;
00107 for (int k = 0; k < popSize; k++)
00108 {
00109 if (population._genotypes[k]._fitness == currentMinFitness && currentMinFitnessIndex != k)
00110 i++;
00111 }
00112 }
00113 medianAverageFitness -= minFitness;
00114 if (_fitnessCloserToZeroIsBetter)
00115 {
00116 double twoTimesMedianAverageFitness = 2 * (doubleMidFitness - medianAverageFitness);
00117 double twoTimesMaxFitnessMinusMedianAverageFitness = 2 * medianAverageFitness;
00118 double twoTimesMaxFitness = 2 * doubleMidFitness;
00119 for (int i = 0; i < popSize; i++)
00120 {
00121 if (population._genotypes[i]._fitness == double.MaxValue)
00122 population._genotypes[i]._matingProbability = 0;
00123 else
00124 {
00125 if (medianAverageFitness <= population._genotypes[i]._fitness - minFitness)
00126 {
00127 population._genotypes[i]._matingProbability = 0.5 -
00128 Math.Sqrt((population._genotypes[i]._fitness - minFitness - medianAverageFitness) *
00129 (twoTimesMaxFitness - medianAverageFitness - population._genotypes[i]._fitness + minFitness)) /
00130 twoTimesMedianAverageFitness;
00131 }
00132 else
00133 {
00134 population._genotypes[i]._matingProbability = 0.5 +
00135 Math.Sqrt((medianAverageFitness - population._genotypes[i]._fitness + minFitness) *
00136 (medianAverageFitness + population._genotypes[i]._fitness - minFitness)) /
00137 twoTimesMaxFitnessMinusMedianAverageFitness;
00138 }
00139 population._totalMatingProbability += population._genotypes[i]._matingProbability;
00140 }
00141 }
00142 }
00143 else
00144 {
00145 double twoTimesMedianAverageFitness = 2 * (medianAverageFitness);
00146 double twoTimesMaxFitnessMinusMedianAverageFitness = 2 * (doubleMidFitness - medianAverageFitness);
00147 double twoTimesMaxFitness = 2 * doubleMidFitness;
00148 for (int i = 0; i < popSize; i++)
00149 {
00150 if (population._genotypes[i]._fitness == 0)
00151 population._genotypes[i]._matingProbability = 0;
00152 else
00153 {
00154 if (population._genotypes[i]._fitness - minFitness <= medianAverageFitness)
00155 {
00156 population._genotypes[i]._matingProbability = 0.5 -
00157 Math.Sqrt((medianAverageFitness - population._genotypes[i]._fitness + minFitness) *
00158 (medianAverageFitness + population._genotypes[i]._fitness - minFitness)) /
00159 twoTimesMedianAverageFitness;
00160 }
00161 else
00162 {
00163 population._genotypes[i]._matingProbability = 0.5 +
00164 Math.Sqrt((population._genotypes[i]._fitness - minFitness - medianAverageFitness) *
00165 (twoTimesMaxFitness - medianAverageFitness - population._genotypes[i]._fitness + minFitness)) /
00166 twoTimesMaxFitnessMinusMedianAverageFitness;
00167 }
00168 population._totalMatingProbability += population._genotypes[i]._matingProbability;
00169 }
00170 }
00171 }
00172 }
00173 }
00174 }