private static void LaunchEvolutionRun(SolverParameters solverParameters, ExpressionGenerator <GameState> expressionGenerator) { var cache = new FitnessCache <GameAgentLogicGenome, double>(2000 * solverParameters.MaxEliteSize); var evaluator = new GameAgentEvaluator <GameAgentLogicGenome>(cache, genome => new GameAgentWithLogic(genome)); var bellWeightedRandom = new CyclableBellWeightedRandom(10.0, 3.0, 1.0, 0.5, 0.1); var genomeDescriptions = new GameAgentLogicGenomeDescription(bellWeightedRandom, expressionGenerator); var defaultGenomeFactory = new GeneticSolver.Genome.DefaultGenomeFactory <GameAgentLogicGenome>(genomeDescriptions); var mutationProbabilities = new Cyclable <double>(new[] { 0.3, 0.9, 1.0 }); var mutator = new GenomeMutator <GameAgentLogicGenome>(genomeDescriptions, mutationProbabilities, new UnWeightedRandom()); var logger = new GameAgentWithLogicSolverLogger(); var solver = new Solver <GameAgentLogicGenome, double>( defaultGenomeFactory, evaluator, logger, solverParameters, new IEarlyStoppingCondition <GameAgentLogicGenome, double>[] { // new GeneticSolver.EarlyStoppingConditions.FitnessThresholdReachedEarlyStopCondition<GameAgentMultipliers, double>(fitness => fitness < 1e-6), new GeneticSolver.EarlyStoppingConditions.ProgressStalledEarlyStoppingCondition <GameAgentLogicGenome, double>(10, 0.5, 0.8), new GeneticSolver.EarlyStoppingConditions.FitnessNotImprovingEarlyStoppingCondition <GameAgentLogicGenome>(1, 100), }, new IGenomeReproductionStrategy <GameAgentLogicGenome>[] { new CyclableReproductionStrategy <GameAgentLogicGenome>(new IGenomeReproductionStrategy <GameAgentLogicGenome>[] { new SexualGenomeReproductionStrategy <GameAgentLogicGenome, double>(mutator, new StratifiedBreedingStrategy(), defaultGenomeFactory, genomeDescriptions, evaluator, 40, 2), new SexualGenomeReproductionStrategy <GameAgentLogicGenome, double>(mutator, new GeneticSolver.PairingStrategies.RandomBreedingStrategy(), defaultGenomeFactory, genomeDescriptions, evaluator, 40, 2), new AsexualGenomeReproductionStrategy <GameAgentLogicGenome>(new GenomeMutator <GameAgentLogicGenome>(genomeDescriptions, 1.0, new UnWeightedRandom())), }), new AsexualGenomeReproductionStrategy <GameAgentLogicGenome>(new GenomeMutator <GameAgentLogicGenome>(genomeDescriptions, 0.4, new UnWeightedRandom())), }); solver.NewGeneration += (s, e) => bellWeightedRandom.CycleStdDev(); solver.NewGeneration += (s, e) => mutationProbabilities.Cycle(); solver.NewGeneration += (sender, e) => cache.ClearExcept(e.OrderedGenomes.Select(g => g.GenomeInfo.Genome)); logger.Start(); var best = solver.Evolve(1000); logger.LogGeneration(best); logger.End(); }
/// <summary> /// Allows the game to perform any initialization it needs to before starting to run. /// This is where it can query for any required services and load any non-graphic /// related content. Calling base.Initialize will enumerate through any components /// and initialize them as well. /// </summary> protected override void Initialize() { // TODO: Add your initialization logic here MAPWIDTH = 40; MAPHEIGHT = 40; sprites = TextureLoader.LoadTextures <Texture2D>(Content, "Sprites"); IMapGenStrat <DungeonMap> strat = new RandomRoomMapStrat <DungeonMap>(MAPWIDTH, MAPHEIGHT, 30, 1, 3, 10); map = strat.CreateMap(); genomes = new List <Genome>(); mutator = new GenomeMutator(); for (int i = 0; i < POPULATION_SIZE; i++) { genomes.Add(new Genome(2500)); } int genomeNumber = 1; foreach (Genome g in genomes) { mutator.AddGenomeWalker(new GenomeWalker(map.GetStartTile().X, map.GetStartTile().Y, map, g, genomeNumber)); genomeNumber++; } Tile temp = map.GetRandomWalkable(); p = new Player(temp.X, temp.Y, ref map); font = Content.Load <SpriteFont>("ASCII"); inputState = new InputState(); camera.ViewportWidth = graphics.GraphicsDevice.Viewport.Width; camera.ViewportHeight = graphics.GraphicsDevice.Viewport.Height; camera.CenterOn(temp); start = map.GetRandomWalkable(); end = map.GetRandomWalkable(); base.Initialize(); }
private static void LaunchEvolutionRun(SolverParameters solverParameters, CoefficientsGenomeEvaluator evaluator) { var mutationProbabilities = new Cyclable <double>(new [] { 0.3, 0.9, 1.0 }); var bellWeightedRandom = new CyclableBellWeightedRandom(10.0, 3.0, 1.0, 0.5, 0.1); var genomeDescriptions = new CoefficientsGenomeDescriptions(bellWeightedRandom); var defaultGenomeFactory = new DefaultGenomeFactory <Coefficients.Coefficients>(genomeDescriptions); var mutator = new GenomeMutator <Coefficients.Coefficients>(genomeDescriptions, mutationProbabilities, new UnWeightedRandom()); var logger = new CoefficientsSolverLogger(); var solver = new Solver <Coefficients.Coefficients, double>( defaultGenomeFactory, evaluator, logger, solverParameters, new IEarlyStoppingCondition <Coefficients.Coefficients, double>[] { new FitnessThresholdReachedEarlyStopCondition <Coefficients.Coefficients, double>(fitness => fitness < 1e-6), new ProgressStalledEarlyStoppingCondition <Coefficients.Coefficients, double>(10, 0.5, 0.8), new FitnessNotImprovingEarlyStoppingCondition <Coefficients.Coefficients>(1e-7, 10), }, new IGenomeReproductionStrategy <Coefficients.Coefficients>[] { // new SexualGenomeReproductionStrategy<Coefficients.Coefficients, double>(mutator, new HaremBreedingStrategy(), // defaultGenomeFactory, genomeDescriptions, evaluator, 100, 2), new SexualGenomeReproductionStrategy <Coefficients.Coefficients, double>(mutator, new StratifiedBreedingStrategy(), defaultGenomeFactory, genomeDescriptions, evaluator, 100, 2), new SexualGenomeReproductionStrategy <Coefficients.Coefficients, double>(mutator, new RandomBreedingStrategy(), defaultGenomeFactory, genomeDescriptions, evaluator, 100, 2), // new AsexualGenomeReproductionStrategy<Coefficients.Coefficients>(mutator), }); solver.NewGeneration += (s, e) => mutationProbabilities.Cycle(); solver.NewGeneration += (s, e) => bellWeightedRandom.CycleStdDev(); logger.Start(); var best = solver.Evolve(1000); logger.LogGeneration(best); logger.End(); }