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); }
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()); } }