00001 using System; 00002 using System.Collections.Generic; 00003 using System.Linq; 00004 using System.Text; 00005 00006 namespace GEP.Core.Common.GeneticOperators 00007 { 00011 [Serializable] 00012 public class Mutation : GeneticOperator 00013 { 00017 internal double _mutationProbabilityInHead; 00021 internal double _mutationProbabilityInTail; 00025 internal double _mutationProbabilityInConstants; 00034 internal double[] _symbolSetsProbabilityDistribution; 00038 internal double _varConstProbabilityDistribution; 00042 internal Alphabet _functionsSet; 00046 internal Alphabet _variablesSet; 00050 internal Alphabet _constatnsSet; 00051 00069 protected Mutation(Alphabet functionsSet, Alphabet variablesSet, Alphabet constatnsSet, 00070 double[] symbolSetsProbabilityDistribution, 00071 bool applyOnNewGeneration, GenotypeSelection.GenotypeSelection selection) 00072 : base(1, 1, false, applyOnNewGeneration, selection, "Mutation") 00073 { 00074 _symbolSetsProbabilityDistribution = symbolSetsProbabilityDistribution; 00075 _functionsSet = functionsSet; 00076 _variablesSet = variablesSet; 00077 _constatnsSet = constatnsSet; 00078 double varConstRatioInTail = 00079 (double)((symbolSetsProbabilityDistribution[1] - symbolSetsProbabilityDistribution[0]) 00080 / (1 - symbolSetsProbabilityDistribution[0] - (symbolSetsProbabilityDistribution[1] - symbolSetsProbabilityDistribution[0]))); 00081 _varConstProbabilityDistribution = varConstRatioInTail / (varConstRatioInTail + 1); 00082 } 00083 00084 public Mutation(Alphabet functionsSet, Alphabet variablesSet, Alphabet constatnsSet, 00085 double[] symbolSetsProbabilityDistribution, double mutationProbabilityInHead, 00086 double mutationProbabilityInTail, double mutationProbabilityInConstants, 00087 bool applyOnNewGeneration, GenotypeSelection.GenotypeSelection selection) 00088 : this(functionsSet, variablesSet, constatnsSet, symbolSetsProbabilityDistribution, 00089 applyOnNewGeneration, selection) 00090 { 00091 _mutationProbabilityInHead = Math.Abs(mutationProbabilityInHead); 00092 _mutationProbabilityInTail = Math.Abs(mutationProbabilityInTail); 00093 _mutationProbabilityInConstants = Math.Abs(mutationProbabilityInConstants); 00094 } 00095 00096 public override void Apply(Genotype[] parameters, int[] selectionIndexes, Genotype[] destination, ref int destIndex) 00097 { 00098 throw new NotImplementedException(); 00099 } 00100 00101 public override void Apply(Genotype[] parameters, int[] selectionIndexes) 00102 { 00103 Genotype genotype = parameters[selectionIndexes[0]]; 00104 int headLength = genotype.HeadLength; 00105 int headAndTailLength = headLength + genotype.TailLength; 00106 int geneLength = genotype.GeneLength; 00107 double rd; 00108 for (int i = 0; i < genotype.N_Genes; i++) 00109 { 00110 for (int j = 0; j < headLength; j++) 00111 { 00112 rd = _random.NextDouble(); 00113 if (rd <= _mutationProbabilityInHead) 00114 { 00115 rd = _random.NextDouble(); 00116 if (rd <= _symbolSetsProbabilityDistribution[0]) 00117 { 00118 genotype._linearStructure[i][j] = _functionsSet[_random.Next(_functionsSet.Length)]; 00119 } 00120 else if (rd <= _symbolSetsProbabilityDistribution[1]) 00121 { 00122 genotype._linearStructure[i][j] = _variablesSet[_random.Next(_variablesSet.Length)]; 00123 } 00124 else 00125 { 00126 genotype._linearStructure[i][j] = null; 00127 } 00128 } 00129 } 00130 for (int j = headLength; j < headAndTailLength; j++) 00131 { 00132 rd = _random.NextDouble(); 00133 if (rd <= _mutationProbabilityInTail) 00134 { 00135 rd = _random.NextDouble(); 00136 if (rd <= _varConstProbabilityDistribution) 00137 { 00138 genotype._linearStructure[i][j] = _variablesSet[_random.Next(_variablesSet.Length)]; 00139 } 00140 else 00141 { 00142 genotype._linearStructure[i][j] = null; 00143 } 00144 } 00145 } 00146 for (int j = headAndTailLength; j < geneLength; j++) 00147 { 00148 rd = _random.NextDouble(); 00149 if (rd <= _mutationProbabilityInConstants) 00150 { 00151 genotype._linearStructure[i][j] = _constatnsSet[_random.Next(_constatnsSet.Length)]; 00152 } 00153 } 00154 } 00155 } 00156 00161 public Mutation(Mutation symbol) 00162 :base(symbol) 00163 { 00164 _mutationProbabilityInHead = symbol._mutationProbabilityInHead; 00165 _mutationProbabilityInTail = symbol._mutationProbabilityInTail; 00166 _mutationProbabilityInConstants = symbol._mutationProbabilityInConstants; 00167 _symbolSetsProbabilityDistribution = symbol._symbolSetsProbabilityDistribution; 00168 _varConstProbabilityDistribution = symbol._varConstProbabilityDistribution; 00169 _functionsSet = symbol._functionsSet; 00170 _variablesSet = symbol._variablesSet; 00171 _constatnsSet = symbol._constatnsSet; 00172 } 00173 00178 public override GEP.Core.Common.Symbol Clone() 00179 { 00180 return new Mutation(this); 00181 } 00182 } 00183 }