Exemple #1
0
        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));
        }
Exemple #2
0
        public static ISorter Mutate(this ISorter sorter, IRando rando, StageReplacementMode stageReplacementMode)
        {
            var          mutantIndex    = rando.NextUint(sorter.StageCount);
            var          stageToReplace = sorter[(int)mutantIndex];
            ISorterStage mutantStage    = null;

            switch (stageReplacementMode)
            {
            case StageReplacementMode.RandomReplace:
                mutantStage = rando.ToFullSorterStage(order: sorter.Order, stageNumber: mutantIndex);
                break;

            case StageReplacementMode.RandomRewire:
                mutantStage = rando.RewireSorterStage(stageToReplace);
                break;

            case StageReplacementMode.RandomConjugate:
                mutantStage = stageToReplace.ConjugateByRandomPermutation(rando).ToSorterStage(mutantIndex);
                break;

            case StageReplacementMode.RCTC:
                mutantStage = stageToReplace.ConjugateByRandomSingleTwoCycle(rando).ToSorterStage(mutantIndex);
                break;

            default:
                throw new Exception($"{stageReplacementMode.ToString()}");
            }

            return(sorter.SorterStages.ReplaceAtIndex(mutantIndex, mutantStage)
                   .ToSorter(id: Guid.NewGuid(), genomeId: Guid.Empty));
        }