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);
        }