00001 using System; 00002 using System.Collections.Generic; 00003 using System.Linq; 00004 using System.Text; 00005 00006 namespace GEP.Core.Float.FitnessFunctions 00007 { 00012 [Serializable] 00013 public class MeanAbsolutePercentageError : FitnessFunction 00014 { 00018 protected float[] _expectedOutputVectorSize; 00019 00057 public MeanAbsolutePercentageError(int teachingVariableCasesStartIndex, int teachingVariableCasesEndIndex, 00058 int testVariableCasesStartIndex, int testVariableCasesEndIndex, float[][] expectedOutput, 00059 int maxN_CasesOfNaNorInfinityToIgnore) 00060 : base(teachingVariableCasesStartIndex, teachingVariableCasesEndIndex, testVariableCasesStartIndex, 00061 testVariableCasesEndIndex, expectedOutput, maxN_CasesOfNaNorInfinityToIgnore) 00062 { 00063 float[] zero = new float[expectedOutput[0].Length]; 00064 int endIndex = Math.Max(teachingVariableCasesEndIndex, testVariableCasesEndIndex); 00065 _expectedOutputVectorSize = new float[endIndex + 1]; 00066 for (int i = 0; i <= endIndex; i++) 00067 { 00068 _expectedOutputVectorSize[i] = (float)Common.Functions.Distance(expectedOutput[i], zero); 00069 } 00070 } 00071 00072 public override void SetFitness(Common.Genotype genotype, bool isTest) 00073 { 00074 Genotype fGenotype = (Genotype)genotype; 00075 double fitness = 0; 00076 int ignoredCases = 0; 00077 double relativeDistance = 0; 00078 int startIndex = (isTest ? _testVariableCasesStartIndex : _teachingVariableCasesStartIndex); 00079 int endIndex = (isTest ? _testVariableCasesEndIndex : _teachingVariableCasesEndIndex); 00080 if (_expectedOutput[0].Length == 1) 00081 { 00082 for (int i = startIndex; i <= endIndex; i++) 00083 { 00084 fGenotype.CalculateAll(i); 00085 relativeDistance = Math.Abs(_expectedOutput[i][0] - fGenotype._value) / 00086 _expectedOutputVectorSize[i]; 00087 if (double.IsNaN(relativeDistance) || double.IsInfinity(relativeDistance)) 00088 { 00089 if (ignoredCases < _maxN_CasesOfNaNorInfinityToIgnore) 00090 ignoredCases++; 00091 else 00092 { 00093 if (isTest) 00094 fGenotype._testFitness = double.NaN; 00095 else 00096 fGenotype._fitness = double.NaN; 00097 return; 00098 } 00099 } 00100 else 00101 fitness += relativeDistance; 00102 } 00103 } 00104 else 00105 { 00106 for (int i = startIndex; i <= endIndex; i++) 00107 { 00108 fGenotype.CalculateAll(i); 00109 relativeDistance = Common.Functions.Distance(_expectedOutput[i], fGenotype._geneValues) / 00110 _expectedOutputVectorSize[i]; 00111 if (double.IsNaN(relativeDistance) || double.IsInfinity(relativeDistance)) 00112 { 00113 if (ignoredCases < _maxN_CasesOfNaNorInfinityToIgnore) 00114 ignoredCases++; 00115 else 00116 { 00117 if (isTest) 00118 fGenotype._testFitness = double.NaN; 00119 else 00120 fGenotype._fitness = double.NaN; 00121 return; 00122 } 00123 } 00124 else 00125 fitness += relativeDistance; 00126 } 00127 } 00128 if (isTest) 00129 fGenotype._testFitness = fitness / (endIndex - startIndex - ignoredCases); 00130 else 00131 fGenotype._fitness = fitness / (endIndex - startIndex - ignoredCases); 00132 } 00133 } 00134 }