public void TestEquality() { var fitness = new LevelChunkFitness(0); // Use the Assert class to test conditions var chromosome = new LevelChunkChromosome(10); Assert.LessOrEqual(Mathf.Abs((float)fitness.Evaluate(chromosome) - (float)fitness.Evaluate(chromosome.Clone())), _errorMargin); }
public void TestIncreaseHT() { var fitness = new LevelChunkFitness(10); // Use the Assert class to test conditions var chromosome1 = new LevelChunkChromosome(2); chromosome1.ReplaceGenes(0, new Gene[] { new Gene(LevelElement.None), new Gene(LevelElement.None) }); var chromosome2 = new LevelChunkChromosome(2); chromosome2.ReplaceGenes(0, new Gene[] { new Gene(LevelElement.None), new Gene(LevelElement.Beast) }); Assert.Less(fitness.Evaluate(chromosome1), fitness.Evaluate(chromosome2)); }
private void GenerateLevelGS() { Level = new LevelElement[LevelSize]; for (var i = 0; i < nChunks; i++) { var dcParams = DifficultyCurveParams; var difficulty = DifficultyCurve(i, dcParams.a, dcParams.b, dcParams.k); var eParams = EvolutionParams; var chunkSize = LevelSize / nChunks; var fitness = new LevelChunkFitness(difficulty); var chromosome = new LevelChunkChromosome(chunkSize); var crossover = new OnePointCrossover(chunkSize / 2); var mutation = new UniformMutation(allGenesMutable: true); var selection = new RouletteWheelSelection(); var population = new Population(50, 100, chromosome); var m_ga = new GeneticAlgorithm(population, fitness, selection, crossover, mutation) { Termination = new TimeEvolvingTermination(new TimeSpan(0, 0, 1)) }; m_ga.TaskExecutor = new ParallelTaskExecutor { MinThreads = 2, MaxThreads = 5 }; m_ga.Start(); // Everty time a generation ends, we log the best solution. /*m_ga.GenerationRan += delegate * { * var f = m_ga.BestChromosome.Fitness; * Debug.Log($"Generation: {m_ga.GenerationsNumber} - Fitness: ${f}"); * };*/ var genes = m_ga.BestChromosome.GetGenes(); for (int j = 0; j < chunkSize; j++) { Level[i * chunkSize + j] = (LevelElement)genes[j].Value; } Debug.Log($"Fitness: {m_ga.BestChromosome.Fitness}"); } }