00001 using System; 00002 using System.Collections.Generic; 00003 using System.Linq; 00004 using System.Text; 00005 00006 namespace GEP.Core.Float.MatingProbabilityFunctions 00007 { 00019 [Serializable] 00020 public class DirectFitnessToProbability : MatingProbabilityFunction 00021 { 00027 public DirectFitnessToProbability(bool fitnessCloserToZeroIsBetter) 00028 : base(fitnessCloserToZeroIsBetter) { } 00029 00030 public override void SetMatingProbability(Common.Population population) 00031 { 00032 Population fPopulation = (Population)population; 00033 fPopulation._totalMatingProbability = 0; 00034 double minFitness = double.MaxValue; 00035 double maxFitness = double.MinValue; 00036 double fitness; 00037 for (int i = 0; i < fPopulation.Size; i++) 00038 { 00039 fitness = fPopulation[i]._fitness; 00040 if (double.IsNaN(fitness) || double.IsInfinity(fitness)) 00041 { 00042 if (_fitnessCloserToZeroIsBetter) 00043 { 00044 fPopulation[i]._fitness = double.MaxValue; 00045 fitness = double.MaxValue; 00046 } 00047 else 00048 { 00049 fPopulation[i]._fitness = 0; 00050 fitness = 0; 00051 } 00052 } 00053 else 00054 { 00055 if (fitness < minFitness) 00056 minFitness = fitness; 00057 if (maxFitness < fitness) 00058 maxFitness = fitness; 00059 if (!_fitnessCloserToZeroIsBetter) 00060 { 00061 fPopulation._totalMatingProbability += fitness; 00062 fPopulation[i]._matingProbability = fitness; 00063 } 00064 } 00065 } 00066 double doubleMidFitness = minFitness + maxFitness; 00067 if (_fitnessCloserToZeroIsBetter) 00068 { 00069 for (int i = 0; i < fPopulation.Size; i++) 00070 { 00071 if (fPopulation[i]._fitness == double.MaxValue) 00072 fPopulation[i]._matingProbability = 0; 00073 else 00074 { 00075 fPopulation[i]._matingProbability = doubleMidFitness - fPopulation[i]._fitness; 00076 fPopulation._totalMatingProbability += fPopulation[i]._matingProbability; 00077 } 00078 } 00079 } 00080 } 00081 } 00082 }