/// <summary>
        /// Krzyżowanie genotypu
        /// </summary>
        /// <param name="parent2">genotyp z którym ma nastąpić krzyżowanie</param>
        /// <param name="crossoverRate">współczynnik krzyżowania</param>
        /// <returns>tablica dzieci </returns>
        public Genotype[] Crossover(Genotype parent2, float crossoverRate)
        {
            if (this.Length != parent2.Length) throw new Exception("Can't Crossover genotypes with diffrent length");

            var copyArray = new BitArray(Length * 32);
            for (int i = 0; i < copyArray.Length; i++)
            {
                copyArray[i] = geneticAlgorithm.random.NextDouble() < crossoverRate ? true : false;
            }

            var child1 = new Genotype(this.Length, this.geneticAlgorithm, false);
            var child2 = new Genotype(this.Length, this.geneticAlgorithm, false);
            for (int i = 0; i < copyArray.Length; i++)
            {
                if (copyArray[i])
                {
                    child1.Genes[i] = this.Genes[i];
                    child2.Genes[i] = parent2.Genes[i];
                }
                else
                {
                    child1.Genes[i] = parent2.Genes[i];
                    child2.Genes[i] = this.Genes[i];
                }
            }

            return new Genotype[2] { child1, child2 };
        }
 /// <summary>
 /// Metoda Wykonuje kopię Genotypu
 /// </summary>
 /// <returns></returns>
 public Genotype Copy()
 {
     var copiedGenotype = new Genotype(this.Length, this.geneticAlgorithm, false);
     copiedGenotype.Genes = this.Genes;
     return copiedGenotype;
 }