public BinaryPopulation(int populationSize, int genotypeSize, string selectionProtocol, AbstractFitnessEvaluator evaluator, AbstractTranslator translator, int intervalStart, int intervalEnd) { _random = new Random(); Evaluator = evaluator; Translator = translator; var individuals = new List<AbstractPhenotype>(); for (int i = 0; i < populationSize; i++) { var genotype = new BitVector(); for (int j = 0; j < genotypeSize; j++) { int number = _random.Next(intervalStart, intervalEnd); string binary = Convert.ToString(number, 2); string binaryDigits = Convert.ToString(intervalEnd - 1, 2); while (binary.Length < binaryDigits.Length) { binary = "0" + binary; } for (int k = 0; k < binary.Length; k++) { genotype.Vector.Add(Convert.ToInt32(binary[k].ToString(), 2)); } } individuals.Add(Translator.Translate(genotype)); } CurrentPopulation = individuals; Offsprings = new List<BitVector>(); SelectionProtocol = selectionProtocol; }
public override AbstractPhenotype Translate(BitVector genom) { //NB: Requires explicit size genom size of 33 double a = binaryToDoubleRange(genom.GetRange(0, 7), 0.001, 0.2); //200 values : 8 bit double b = binaryToDoubleRange(genom.GetRange(7, 7), 0.01, 0.3); // 30 values : 5 bit double c = binaryToDoubleRange(genom.GetRange(14, 7), -80.0, -30.0); // 51 values : 6 bit double d = binaryToDoubleRange(genom.GetRange(21, 7), 0.1, 10.0); // 100 values : 7 bit double k = binaryToDoubleRange(genom.GetRange(28, 7), 0.01, 1.0); // 100 values : 7 bit return new IzhikevichPhenotype(a, b, c, d, k) {Genotype = genom, Fitness = 0.0, RouletteProportion = 0.0}; }
public override List<BitVector> Crossover(AbstractPhenotype parent1, AbstractPhenotype parent2, double crossoverRate) { var par1 = (BitVector) parent1.Genotype; var par2 = (BitVector) parent2.Genotype; var offspring = new List<BitVector>(); int randomIndex = _random.Next(1, par1.Vector.Count); double randomDouble = _random.NextDouble(); var child1 = new BitVector(); var child2 = new BitVector(); if (randomDouble <= crossoverRate) { for (int i = 0; i < par1.Vector.Count; i++) { //for (int j = i; j < i + 8; j++) //{ // if (_random.NextDouble() > 0.5) // { // child1.Vector.Add(par1.Vector[i]); // child2.Vector.Add(par2.Vector[i]); // } // else // { // child1.Vector.Add(par2.Vector[i]); // child2.Vector.Add(par1.Vector[i]); // } //} if (i <= randomIndex) { child1.Vector.Add(par1.Vector[i]); child2.Vector.Add(par2.Vector[i]); } else { child1.Vector.Add(par2.Vector[i]); child2.Vector.Add(par1.Vector[i]); } } } else { child1.Vector = par1.Vector; child2.Vector = par2.Vector; } offspring.Add(child1); offspring.Add(child2); return offspring; }
public override AbstractPhenotype Translate(BitVector genom) { var battles = new List<double>(); for (int i = 0; i < genom.Vector.Count; i = i + 4) { string binaryStrength = genom.Vector[i].ToString() + genom.Vector[i + 1].ToString() + genom.Vector[i + 2].ToString() + genom.Vector[i + 3].ToString(); var armyStrength = (double) Convert.ToInt32(binaryStrength, 2); battles.Add(armyStrength); } double sum = battles.Sum(); List<double> army = battles.Select(battleStrength => (battleStrength/sum)).ToList(); var cbp = new ColonelBlottoPhenotype {Genotype = genom, Army = army, Strength = 1.0, Wins = 0, Ties = 0}; cbp.CalculateEntropy(); return cbp; }
public override void Mutate(double mutationRate, BitVector genotype) { double randomDouble = _random.NextDouble(); if (randomDouble <= mutationRate) { int randomIndex = _random.Next(0, genotype.Vector.Count); genotype.Vector[randomIndex] = (genotype.Vector[randomIndex] == 0 ? 1 : 0); } //for (int i = 0; i + 8 < genotype.Vector.Count; i += 8) //{ // if (_random.NextDouble() <= mutationRate) // { // int randomIndex = _random.Next(0, 8); // genotype.Vector[randomIndex] = (genotype.Vector[randomIndex + i] == 0 ? 1 : 0); // } //} }
public override AbstractPhenotype Translate(BitVector genom) { Network network = new Network(); network.createGraph(); int index = 0; foreach (Node hiddenNode in network.HiddenNodes) { foreach (var neighbour in hiddenNode.UpstreamConnections) { if (neighbour.left == network.BiasNode) neighbour.right = binaryToDoubleRange(genom.GetRange(index++*8, 8), -10.0, 0.0); else neighbour.right = binaryToDoubleRange(genom.GetRange(index++*8, 8), -5.0, 5.0); } hiddenNode.Gain = binaryToDoubleRange(genom.GetRange(index++*8, 8), 1.0, 5.0); hiddenNode.TimeConstant = binaryToDoubleRange(genom.GetRange(index++*8, 8), 1.0, 2.0); } foreach (Node outputNode in network.OutputNodes) { foreach (var neighbour in outputNode.UpstreamConnections) { if (neighbour.left == network.BiasNode) neighbour.right = binaryToDoubleRange(genom.GetRange(index++*8, 8), -10.0, 0.0); else neighbour.right = binaryToDoubleRange(genom.GetRange(index++*8, 8), -5.0, 5.0); } outputNode.Gain = binaryToDoubleRange(genom.GetRange(index++*8, 8), 1.0, 5.0); outputNode.TimeConstant = binaryToDoubleRange(genom.GetRange(index++*8, 8), 1.0, 2.0); } MinCogPhenotype pheno = new MinCogPhenotype(network.InputNodes, network.HiddenNodes, network.OutputNodes, network.BiasNode) { Genotype = genom, Fitness = 0.0, RouletteProportion = 0.0 }; return pheno; }
public abstract void Mutate(double rate, BitVector genotype);
public abstract AbstractPhenotype Translate(BitVector genom);
public OneMaxPhenotype(BitVector genom) { Genotype = genom; }
public override AbstractPhenotype Translate(BitVector genom) { return new OneMaxPhenotype(genom); }