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