public void Compute() { List<Chromosom> population = GenerateInitialChromosomPopulation(_populationCount, _chromosomLength); List<Chromosom> theBestParents = new List<Chromosom>(); for (int i = 0; i < _numberOfIterations; i++) { // count fitness value //foreach (var chromosom in population) //{ // chromosom.Fitness(_maxWeight); //} population.ForEach(chromosom => chromosom.Fitness(_maxWeight)); population = population.OrderByDescending(chromosom => chromosom.SurivatePoints).ToList(); if (_useElityzm) { theBestParents = population.Take(2).ToList(); } Chromosom theBestCurrentChromosom = population.First(); if (TheBestChromosom == null || TheBestChromosom.SurivatePoints < theBestCurrentChromosom.SurivatePoints) { TheBestChromosom = theBestCurrentChromosom; } Points.Add(new DataPoint(i, theBestCurrentChromosom.SurivatePoints)); population = RouletteSelection(population); //population = GetListOfChromosomsUsinRuletteMethod(population); //TODO population = CrossPopulation(population); population = Mutation(population); if (_useElityzm) { // replace 2 random chromosom with elite parent List<int> randomNumbers = Enumerable.Range(0, population.Count-1).Shuffle().Take(2).ToList(); population.RemoveAt(randomNumbers[0]); population.RemoveAt(randomNumbers[1]); population.AddRange(theBestParents); } } //population.ForEach(chromosom => chromosom.Fitness(_maxWeight)); //var sortedPopulation = population.OrderByDescending(chromosom => chromosom.SurivatePoints); //Chromosom theBestSChromosom = sortedPopulation.First(); //Console.WriteLine("KONIEC"); //Console.WriteLine("THE BEST SOLUTION"); //Console.WriteLine(theBestSChromosom); //Console.ReadLine(); }
private Tuple<Chromosom, Chromosom> CrossChromosoms(Chromosom chromosomOne, Chromosom chromosomTwo) { int lengthOfChromosom = chromosomOne.Bits.Length; //TODO int crossPointIndex = _random.Next(0, lengthOfChromosom); //TODO check if - 1 is needed //bool[] firstPartBitsOfOneChromosm = new bool[chromosomOne.Bits.Length]; //bool[] secondPartBitsOfOneChromosm = new bool[chromosomOne.Bits.Length]; //chromosomOne.Bits.CopyTo(firstPartBitsOfOneChromosm, crossPointIndex); //chromosomOne.Bits. var firstPartOfChromosomA = chromosomOne.Bits.Cast<bool>().Take(crossPointIndex).ToArray(); var secondPartOfChromosomA = chromosomOne.Bits.Cast<bool>().Skip(crossPointIndex).ToArray(); var firstPartOfChromosomB = chromosomTwo.Bits.Cast<bool>().Take(crossPointIndex).ToArray(); var secondPartOfChromosomB = chromosomTwo.Bits.Cast<bool>().Skip(crossPointIndex).ToArray(); BitArray newChildA = new BitArray(firstPartOfChromosomA.Concat(secondPartOfChromosomB).ToArray()); BitArray newChildB = new BitArray(firstPartOfChromosomB.Concat(secondPartOfChromosomA).ToArray()); //string chromosomOneAsString = chromosomOne.AsAStringBits(); // rewrite this function //string chromosomTwoAsString = chromosomTwo.AsAStringBits(); //string newOneChromosm = chromosomOneAsString.Substring(0, crossPointIndex); //newOneChromosm += chromosomTwoAsString.Substring(crossPointIndex); //string newTwoChromosm = chromosomTwoAsString.Substring(0, crossPointIndex); //newTwoChromosm += chromosomOneAsString.Substring(crossPointIndex); //Chromosom newChromosomOne = new Chromosom() { Value = Convert.ToInt32(newOneChromosm, 2), NumberOfBits = chromosomOne.NumberOfBits }; //Chromosom newChromosomTwo = new Chromosom() { Value = Convert.ToInt32(newTwoChromosm, 2), NumberOfBits = chromosomOne.NumberOfBits }; Chromosom newChromosomOne = new Chromosom(newChildA);//; { Value = Convert.ToInt32(newOneChromosm, 2), NumberOfBits = chromosomOne.NumberOfBits }; Chromosom newChromosomTwo = new Chromosom(newChildB); //Console.WriteLine("Old(Parent) Chromosoms:"); //Console.WriteLine("1: " + chromosomOne); //Console.WriteLine("2: " + chromosomTwo); //Console.WriteLine("New ones"); //Console.WriteLine("1: " + newChromosomOne); //Console.WriteLine("2: " + newChromosomTwo); //Console.WriteLine("*************"); return Tuple.Create(newChromosomOne, newChromosomTwo); }