public static void Main(string[] args) { // var solver = new Solver<Values.MyThing, int>(new DefaultGenomeFactory<MyThing>(), new MyThingGenomeEvaluator(), new MyThingGenomeDescription(), new MyThingSolverLogger(), new SolverParameters(1000)); var coefficientsToMatch = new Coefficients.Coefficients { FifthLevel = 0, FourthLevel = 3.9, ThirdLevel = -34.5, SecondLevel = -9.8, FirstLevel = 11.9 }; var pointsToMatch = Enumerable.Range(-1000, 1000).Select(x => new Point(x, coefficientsToMatch.Calc(x))); var evaluator = new CoefficientsGenomeEvaluator(pointsToMatch); var solverParameters = new SolverParameters( 1000, 2000, 0.3); // var tasks = new List<Task>(); for (int i = 0; i < 10; i++) { // tasks.Add(Task.Run(() => LaunchEvolutionRun(genomeDescriptions, solverParameters, defaultGenomeFactory, evaluator))); LaunchEvolutionRun(solverParameters, evaluator); } // Task.WaitAll(tasks.ToArray()); // TestBellCurve(); Console.WriteLine("Finished"); Console.ReadKey(); }
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(); }