public void TestEvolution() { Profiler.Reset(); var random = new SystemRandom(42); var configuration = new ZeldaConfiguration(random); var factory = new ZeldaGenomeFactory(configuration); var initialVariables = new VariableAssignment(); var environment = new ZeldaEnvironment(new[] { initialVariables }, 10000); var writer = File.CreateText("stats.csv"); var evolution = new ElitistEvolution(200, 100, factory, environment, ZeldaIndividual.NumAttributes, writer); var genomes = evolution.Initialize(); // TODO Jonas: replace fixed weight multirank optimization by dynamic randomized weighting // i.e. in some generations prefer some attribute over others // evolve for (int i = 0; i < 1000; i++) { Profiler.BeginFrame(); Console.WriteLine("gen " + i); genomes = evolution.Evolve(genomes, random); Profiler.EndFrame(); } writer.Close(); var best = (ZeldaIndividual)evolution.GetBest(new TestComparer()); Console.WriteLine(best); var crawler = best.Crawler; var builder = new DotBuilder(); crawler.Express(builder); // TODO: output genome to puzzle unit test (puzzle building statements) Profiler.ExportToUnityProfileAnalyzer("w:\\EvolutionTest-TestEvolution.pdata"); }
public void FindsSimpleSolution() { var random = new SystemRandom(42); var factory = new SimpleGenomeFactory(random); var selection = new BinaryTournamentSelection(random); Environment environment = new SimpleEnvironment(); Ranking ranking = new CrowdingDistanceRanking(1); var writer = File.CreateText("stats.csv"); var evolution = new ElitistEvolution(100, 20, factory, environment, 1, writer); var genomes = evolution.Initialize(); double score = 0; for (int i = 0; i < 100; i++) { genomes = evolution.Evolve(genomes, random); } writer.Close(); Assert.Greater(score, 30); }