public static GenomeSorterDual Mutate(this GenomeSorterDual genomeDualSorter, IRando randy) { var mutantIndex = randy.NextUint(genomeDualSorter.StageCount); var newChromA = genomeDualSorter.ChromosomeA; var newChromB = genomeDualSorter.ChromosomeB; var newChoices = genomeDualSorter.Choices; if (randy.NextBool(0.5)) { var mutantStage = randy.RewireSorterStage(genomeDualSorter.ChromoA(mutantIndex)); newChromA = newChromA.ReplaceAtIndex(mutantIndex, mutantStage); } else { var mutantStage = randy.RewireSorterStage(genomeDualSorter.ChromoB(mutantIndex)); newChromB = newChromB.ReplaceAtIndex(mutantIndex, mutantStage); } return(new GenomeSorterDual( id: Guid.NewGuid(), chromA: newChromA, chromB: newChromB, choices: newChoices)); }
public static GenomeSorterDual ToDualSorterGenome(this IRando randy, uint order, uint stageCount) { return(new GenomeSorterDual( id: Guid.NewGuid(), chromA: 0u.CountUp(stageCount) .Select(i => randy.ToFullSorterStage(order, i)), chromB: 0u.CountUp(stageCount) .Select(i => randy.ToFullSorterStage(order, i)), choices: 0u.CountUp(stageCount) .Select(i => randy.NextBool(0.5)) )); }
public static GenomeSorterConjOrbit Mutate(this GenomeSorterConjOrbit genomeConjOrbit, IRando randy) { var newTs = genomeConjOrbit.TwoCycle; var newPerm = genomeConjOrbit.Conj; if (randy.NextBool(0.5)) { newTs = newTs.ConjugateByRandomSingleTwoCycle(randy); } else { newPerm = newPerm.ConjugateByRandomPermutation(randy); } return(new GenomeSorterConjOrbit( id: Guid.NewGuid(), twoCycle: newTs, conj: newPerm, order: genomeConjOrbit.Order, stageCount: genomeConjOrbit.Stagecount)); }
public static Tuple <GenomeSorterDual, GenomeSorterDual> Recombine( this GenomeSorterDual genomeDualSorterA, GenomeSorterDual genomeDualSorterB, IRando randy) { var cA = genomeDualSorterA.ChromosomeA.ToList(); var cB = genomeDualSorterA.ChromosomeB.ToList(); var recombin1 = cA.Recombo(cB, randy.NextUint((uint)cA.Count())); var recombin2 = cB.Recombo(cA, randy.NextUint((uint)cA.Count())); if (randy.NextBool(0.5)) { return(new Tuple <GenomeSorterDual, GenomeSorterDual>( item1: new GenomeSorterDual( id: Guid.NewGuid(), chromA: recombin1.Item1, chromB: recombin1.Item2, choices: genomeDualSorterA.Choices), item2: new GenomeSorterDual( id: Guid.NewGuid(), chromA: recombin2.Item1, chromB: recombin2.Item2, choices: genomeDualSorterA.Choices) )); } return(new Tuple <GenomeSorterDual, GenomeSorterDual>( item1: new GenomeSorterDual( id: Guid.NewGuid(), chromA: recombin1.Item2, chromB: recombin1.Item1, choices: genomeDualSorterA.Choices), item2: new GenomeSorterDual( id: Guid.NewGuid(), chromA: recombin2.Item2, chromB: recombin2.Item1, choices: genomeDualSorterA.Choices) )); }