public Gene(Gene a, Gene b)
        {
            int genePartIndex = Chromosome.random.Next(4);
            byte logicHelper = 0;

            for (int i = 0; i <= genePartIndex; i++)
            {
                logicHelper += (byte) Math.Pow(2, i);
            }

            byte vala = a.Value, valb = b.Value;
            byte valc = (byte) (valb & logicHelper);

            logicHelper = (byte) (~logicHelper - 240);
            valc += (byte)(vala & logicHelper);

            this.value = valc;
        }
        public Chromosome Recombine(Chromosome a, Chromosome b)
        {
            if (a == b)
                return null;

            // Chance to recombine means 2 fenotypes that meet
            // don't always create a new one.
            if (Chromosome.random.NextDouble() > crossoverProbability)
                return null;

            int partitionIndex = Chromosome.random.Next(Math.Min(a.Genes.Count, b.Genes.Count));
            Gene gene = new Gene((Gene) a.Genes[partitionIndex], (Gene) b.Genes[partitionIndex]);
            ArrayList list = new ArrayList();

            for (int i = 0; i < partitionIndex; i++)
            {
                list.Add(a.Genes[i]);
            }
            list.Add(gene);
            for (int i = partitionIndex + 1; i < b.Genes.Count; i++)
            {
                list.Add(b.Genes[i]);
            }

            Chromosome returnValue = new Chromosome(list);
            returnValue.Mutate();
            returnValue.ComputeFitness(target);

            return returnValue;
        }