Example #1
0
        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;
        }
Example #2
0
        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};
        }
Example #3
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;
        }
Example #4
0
 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;
 }
Example #5
0
        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);
            //    }
            //}
        }
Example #6
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;
        }
Example #7
0
 public abstract void Mutate(double rate, BitVector genotype);
Example #8
0
 public abstract AbstractPhenotype Translate(BitVector genom);
Example #9
0
 public OneMaxPhenotype(BitVector genom)
 {
     Genotype = genom;
 }
Example #10
0
 public override AbstractPhenotype Translate(BitVector genom)
 {
     return new OneMaxPhenotype(genom);
 }