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(); }
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(); }