private static Chromosome SingleMutation(Chromosome chromosome) { Chromosome newChromosome = chromosome.GetClone(); newChromosome[GrammaticalEvolution.random.Next(chromosome.Count)] = (byte)GrammaticalEvolution.random.Next(0, 256); return(newChromosome); }
public Tuple <List <double>, List <double> > ExecuteTest(int testnumber, int testSize, int mutatedIndividuals, int initialChromosomeSize, double failureFitnessValue, bool useGE1ForBase, bool includeFailedCorrections) { List <double> localityResults1 = new List <double>(); List <double> localityResults2 = new List <double>(); for (int i = 0; i < testSize; i++) { Chromosome baseChromosome = null; double baseFitness = failureFitnessValue; while (baseFitness == failureFitnessValue)//Check that it is a correct individual { baseChromosome = new Chromosome(initialChromosomeSize, 64); GrammaticalEvolution baseGE = (useGE1ForBase ? GE1 : GE2).GetClone(); baseFitness = Evaluate(baseChromosome, true, baseGE).Item1; } for (int j = 0; j < mutatedIndividuals; j++)//TODO: Perché le differenze del 2 è di 1?. { Chromosome mutatedChromosome1 = SingleMutation(baseChromosome); mutatedChromosome1.BackupCodons = baseChromosome.ToList(); Chromosome mutatedChromosome2 = mutatedChromosome1.GetClone(); Tuple <double, bool> result1 = Evaluate(mutatedChromosome1, false, GE1); Tuple <double, bool> result2 = Evaluate(mutatedChromosome2, false, GE2); double minDistance = (double)1 / 64; localityResults1.Add(Math.Abs(result1.Item1 - baseFitness - minDistance)); double secondResult = result2.Item2 ? baseFitness : result2.Item1; localityResults2.Add(Math.Abs(secondResult - baseFitness - minDistance)); } Console.WriteLine(i + " out of " + testSize); } Console.WriteLine("Media 1:" + localityResults1.Average()); Console.WriteLine("Media 2:" + localityResults2.Average()); Console.WriteLine("Miglioramento:" + ((localityResults1.Average() - localityResults2.Average()) / localityResults1.Average())); return(new Tuple <List <double>, List <double> >(localityResults1, localityResults2)); /*string percorso = @"C:\Users\Samuele\Documents\BetterPECLE\v3\Studio località\"; * //string avviso = "ATTENZIONE: QUESTI RISULTATI SONO STATI DEFINITI PREVENTIVAMENTE COME TEST.\n" + * // "AL FINE DI RISPETTARE L'ETICA SCIENTIFICA, NON USARE QUESTI DATI IN NESSUNA PUBBLICAZIONE.\n\n"; * * double miglioramento = ((localityResults1.Average() - localityResults2.Average()) / localityResults1.Average()); * * string spiegazione = "I seguenti dati indicano la differenza di fitness medio per mutazione. Più la differenza\n" + * "è bassa, più la rappresentazione è locale.\n\n"; * File.WriteAllText(percorso + "Studio" + testnumber + ".txt", * spiegazione + "Media default: " + localityResults1.Average() + * "\nDeviazione Standard: " + StdDev(localityResults1) + * "\nMedia PECLE: " + localityResults2.Average() + * "\nDeviazione Standard: " + StdDev(localityResults2) + * "\nMiglioramento: " + miglioramento);*/ }
public GenerationStats GetClone() { GenerationStats stats = new GenerationStats(); stats.bestChromosome = bestChromosome.GetClone(); stats.compilationErrors = compilationErrors; stats.executedEvaluations = executedEvaluations; stats.executionExceptions = executionExceptions; stats.failedErrorChecks = failedErrorChecks; stats.failedErrorCorrections = failedErrorCorrections; stats.fitnessValues = fitnessValues.ToList(); stats.generationErrors = generationErrors; stats.passedErrorChecks = passedErrorChecks; stats.successfulErrorCorrections = successfulErrorCorrections; return(stats); }
public override Tuple <Chromosome, Chromosome> Cross(Chromosome parent1, Chromosome parent2, double crossoverProbability) { if (GrammaticalEvolution.random.NextDouble() < crossoverProbability) { int crossoverPoint = GrammaticalEvolution.random.Next(0, Math.Min(parent1.Count, parent2.Count)); Chromosome child1 = new Chromosome(0, parent1.MaximumSize); Chromosome child2 = new Chromosome(0, parent2.MaximumSize); for (int i = 0; i < crossoverPoint; i++) { child1.Add(parent1[i]); child2.Add(parent2[i]); } for (int j = crossoverPoint; j < parent2.Count; j++) { child1.Add(parent2[j]); } for (int k = crossoverPoint; k < parent1.Count; k++) { child2.Add(parent1[k]); } if (GrammaticalEvolution.random.NextDouble() > 0.5) { child1.BackupCodons = parent1.BackupCodons == null ? null : parent1.BackupCodons.ToList(); child2.BackupCodons = parent2.BackupCodons == null ? null : parent2.BackupCodons.ToList(); } else { child1.BackupCodons = parent2.BackupCodons == null ? null : parent2.BackupCodons.ToList(); child2.BackupCodons = parent1.BackupCodons == null ? null : parent1.BackupCodons.ToList(); } return(new Tuple <Chromosome, Chromosome>(child1, child2)); } else { return(new Tuple <Chromosome, Chromosome>(parent1.GetClone(), parent2.GetClone())); } }