00001 using System; 00002 using System.Collections.Generic; 00003 using System.Linq; 00004 using System.Text; 00005 00006 namespace GEP.Core.Float 00007 { 00012 [Serializable] 00013 public class ConstantsSetMutation 00014 { 00015 protected Random _random; 00019 public float _upperBound; 00023 public float _lowerBound; 00027 public float _mutationProbability; 00035 public int _n_MutationsCycles; 00039 public ConstantMutation[][] _mutationSequence; 00044 public int _sequenceIndex = 0; 00048 public Alphabet _constants; 00049 00059 public ConstantsSetMutation(float upperBound, float lowerBound, float mutationProbability, 00060 int n_MutationsCycles, Alphabet constants) 00061 { 00062 _constants = constants; 00063 _upperBound = upperBound; 00064 _lowerBound = lowerBound; 00065 _mutationProbability = mutationProbability; 00066 _n_MutationsCycles = n_MutationsCycles; 00067 _random = new Random(); 00068 } 00069 00074 public void GenerateMutationSequence() 00075 { 00076 _mutationSequence = new ConstantMutation[_n_MutationsCycles][]; 00077 int mutationsInCycle; 00078 int constsLenght = _constants.Length; 00079 for (int i = 0; i < _n_MutationsCycles; i++) 00080 { 00081 mutationsInCycle = 0; 00082 for (int j = 0; j < constsLenght; j++) 00083 { 00084 if (_random.NextDouble() < _mutationProbability) 00085 mutationsInCycle++; 00086 } 00087 _mutationSequence[i] = new ConstantMutation[mutationsInCycle]; 00088 for (int j = 0; j < mutationsInCycle; j++) 00089 { 00090 _mutationSequence[i][j] = new ConstantMutation(_random.Next(_constants.Length) 00091 , Common.Functions.IntervalMapping((float)(_random.NextDouble()), 0F, 1F, _lowerBound, _upperBound)); 00092 } 00093 } 00094 _sequenceIndex = 0; 00095 } 00096 00101 public void Next() 00102 { 00103 for (int i = _mutationSequence[_sequenceIndex].Length - 1; 0 <= i; i--) 00104 { 00105 ((Constant)(_constants._symbols[_mutationSequence[_sequenceIndex][i]._indexInAlphabet]))._value = 00106 _mutationSequence[_sequenceIndex][i]._newValue; 00107 } 00108 _sequenceIndex++; 00109 } 00110 00115 public bool HasMore() 00116 { 00117 if (_sequenceIndex < _mutationSequence.Length) 00118 return true; 00119 return false; 00120 } 00121 } 00122 }