/// <summary> /// Mutates a gene by bitwise mutation. /// </summary> /// <param name="gene"></param> /// <returns></returns> public static Gene Mutate(Gene gene) { if ( gene is BinaryGene ) { BinaryGene g = (BinaryGene) gene.Clone(); g.Value = !(BinaryGene)gene; return g; } else if ( gene is DoubleGene ) { DoubleGene g = (DoubleGene) gene.Clone(); byte[] bytes = BitConverter.GetBytes(g.Value); BitArray ba = new BitArray(bytes); int p = Utils.Rand.Next( ba.Length ); ba.Set(p, !ba[p]); ba.CopyTo(bytes, 0); g.Value = BitConverter.ToDouble(bytes,0); return g; } else if ( gene is IntegerGene ) { IntegerGene g = (IntegerGene) gene.Clone(); byte[] bytes = BitConverter.GetBytes(g.Value); BitArray ba = new BitArray(bytes); int p = Utils.Rand.Next( ba.Length ); ba.Set(p, !ba[p]); ba.CopyTo(bytes, 0); g.Value = BitConverter.ToInt32(bytes,0); return g; } return (Gene) gene.Clone(); // default }