/// <summary> /// This version of substracts poly performs just a 'from time to time' substract; /// </summary> /// <param name="gene"></param> private void performSubstract(Gene gene) { if (gene.Polygons.Count < this.NrOfPolygons / 2 + 1) { return; } int doIt = random.Next(100); if (doIt % 2 == 0) { return; } double referenceNegativeFitness = double.MaxValue; SubstractPolygonMutationChanges bigChange = null; for (int i = 0; i < gene.Polygons.Count; i++) { double oldNegativeFitness = gene.NegativeFitness; SubstractPolygonMutationChanges changes = gene.RemovePolygonAtPosition(i); if (changes != null && gene.NegativeFitness < referenceNegativeFitness) { bigChange = changes; referenceNegativeFitness = gene.NegativeFitness; } gene.RestoreMutation(changes, oldNegativeFitness); } gene.ApplyMutation(bigChange); }
private void performAddPolygon(Gene gene) { if (gene.Polygons.Count >= this.NrOfPolygons) { return; } double oldNegativeFitness = gene.NegativeFitness; AddPolygonMutationChanges bigChange = null; for (int i = 0; i < NrOfMutationsTries; i++) { AddPolygonMutationChanges changes = gene.AddPolygon(); if (changes != null && gene.NegativeFitness > oldNegativeFitness) { gene.RestoreMutation(changes, oldNegativeFitness); } else if (changes != null) { oldNegativeFitness = gene.NegativeFitness; bigChange = changes; gene.RestoreMutation(changes, changes.OldNegativeFitness); } } gene.ApplyMutation(bigChange); }
private void performMutateColorParam(Gene gene) { double oldNegativeFitness = gene.NegativeFitness; ColorMutationChanges bigChange = null; for (int i = 0; i < NrOfMutationsTries; i++) { ColorMutationChanges changes = gene.MutateColorParam(); if (changes != null && gene.NegativeFitness > oldNegativeFitness) { gene.RestoreMutation(changes, oldNegativeFitness); } else if (changes != null) { oldNegativeFitness = gene.NegativeFitness; bigChange = changes; gene.RestoreMutation(changes, changes.OldNegativeFitness); } } gene.ApplyMutation(bigChange); }