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