public Chromosome Clone()
        {
            Chromosome c = new Chromosome(this.GeneLength, this.Bits.Length);
            for (int i = 0; i <= this.Bits.Length - 1; i++) {
                c[i] = this.Bits[i];
            }

            return c;
        }
 public void Mutate(IOrganism organism)
 {
     for (int i = 0; i <= organism.Chromosomes.Count - 1; i++) {
         int index = rand.Next(organism.Chromosomes[i].Length);
         Chromosome mutated = new Chromosome(organism.Chromosomes[i].GeneLength, organism.Chromosomes[i].Length - 1);
         Array.Copy(organism.Chromosomes[i].Bits, 0, mutated.Bits, 0, index);
         Array.Copy(organism.Chromosomes[i].Bits, index + 1, mutated.Bits, index, organism.Chromosomes[i].Length - index - 1);
         organism.Chromosomes[i] = mutated;
     }
 }
 private void SwapGenes(Chromosome chromsome, Chromosome match1, Chromosome match2)
 {
     var geneCount = chromsome.GetGenes().Count();
     for (int geneIndex = 0; geneIndex <  geneCount; geneIndex++) {
         if (chromsome.Gene(geneIndex) == match1) {
             chromsome.Gene(geneIndex, match2);
         } else if (chromsome.Gene(geneIndex) == match2) {
             chromsome.Gene(geneIndex, match1);
         }
     }
 }
 public void GetGenesTest1()
 {
     Chromosome chromosome = new Chromosome(4, "01011111000011000011");
     var genes = chromosome.GetGenes();
     Assert.AreEqual(5, genes.Count());
     Assert.AreEqual("0101", genes.ElementAt(0).ToString());
     Assert.AreEqual("1111", genes.ElementAt(1).ToString());
     Assert.AreEqual("0000", genes.ElementAt(2).ToString());
     Assert.AreEqual("1100", genes.ElementAt(3).ToString());
     Assert.AreEqual("0011", genes.ElementAt(4).ToString());
 }
        public void Gene(int index, Chromosome value)
        {
            if (index < 0 | index * this.GeneLength > this.Bits.Length) {
                throw new ArgumentException("Invalid index");
            }

            this.OverWrite(this.GeneLength * index, value.Bits);
        }