public double MutateWeight(GeneMutationType mutationType, double power) { double factor = (new Random().NextDouble() < 0.5 ? -1 : 1); double weight = new Random().NextDouble() * power * factor; if (mutationType == GeneMutationType.AdjustWeight) { Weight += weight; } else if (mutationType == GeneMutationType.ReplaceWeight) { Weight = weight; } return(weight); }
public void MutateGeneWeights(GeneMutationType mutationType, double power, double rate) { int geneCount = 0; double genomeTail = Genes.Count * 0.8; bool severe = new Random().NextDouble() > GeneParameters.MutateGeneWeightSevereProbability; double adjustmentProbability = 0; double replacementProbability = 0; Genes.ForEach(g => { if (severe) { adjustmentProbability = GeneParameters.MutateGeneWeightSevereAdjustmentProbability; replacementProbability = GeneParameters.MutateGeneWeightSevereReplacementProbability; } else if (Genes.Count >= GeneParameters.GeneCountThreshold && geneCount > genomeTail) { adjustmentProbability = GeneParameters.MutateGeneWeightAdjustmentProbability; replacementProbability = GeneParameters.MutateGeneWeightReplacementProbability; } else { if (new Random().NextDouble() > 0.5) { adjustmentProbability = 1 - rate; replacementProbability = 1 - rate - 0.1; } else { adjustmentProbability = 1 - rate; replacementProbability = 1 - rate; } } if (mutationType == GeneMutationType.AdjustWeight) { double choice = new Random().NextDouble(); if (choice > adjustmentProbability) { g.MutateWeight(mutationType, power); } else if (choice > replacementProbability) { g.MutateWeight(mutationType, power); } } else if (mutationType == GeneMutationType.ReplaceWeight) { g.MutateWeight(mutationType, power); } if (g.Weight > GeneParameters.GeneWeightMaximum) { g.Weight = GeneParameters.GeneWeightMaximum; } else if (g.Weight < GeneParameters.GeneWeightMinimum) { g.Weight = GeneParameters.GeneWeightMinimum; } geneCount++; }); }