Exemplo n.º 1
0
        public void MutateAsymmetric(IBitIndividual individual, double p, double zeroPart, double onePart)
        {
            onePart  *= p;
            zeroPart *= p;
            var genes  = individual.Genes;
            var ones   = individual.Ones;
            var zeroes = genes.Count - ones;

            var oneLookup  = new SpecializedQueue(ones);
            var zeroLookup = new SpecializedQueue(zeroes);

            for (var i = 0; i < genes.Count; i++)
            {
                if (genes[i])
                {
                    oneLookup.Add(i);
                }
                else
                {
                    zeroLookup.Add(i);
                }
            }

            MutatePart(individual, onePart, oneLookup);
            MutatePart(individual, zeroPart, zeroLookup);
        }
Exemplo n.º 2
0
        public void MutatePart(IBitIndividual individual, double p, SpecializedQueue indexes)
        {
            var n    = indexes.Count;
            var roll = _random.NextDouble();

            foreach (var d in CalculateOdds(p, n))
            {
                if (roll < d || indexes.IsEmpty)
                {
                    break;
                }
                roll -= d;
                individual.Flip(indexes.TakeOne());
            }
        }