internal static ((Solution best, double fitness, int generation) result, long ElapsedMilliseconds) RunGa( SolverConfig config, int id = 1, bool showLogs = true) { var random = new Random(config.RandomGenerator.Next()); var serializer = new GaSerializer(config.Problem) { FileNameTemplate = $"{id}_ga_history_" }; var callbacks = new List <IGaCallback>(2) { serializer }; if (showLogs) { callbacks.Add(new SolutionLogger()); } var solver = new PcbGeneticSolver(config.Problem.Clone(), new WeightedEvaluator() { FragmentsOutsideBoardWeight = 20.0, IntersectionWeight = 1000.0, SegmentCountWeight = 10.0, SegmentsOutsideBoardWeight = 5000.0, TotalLengthWeight = 1 }, new RandomInitializer { RandomGenerator = random, MaxLength = config.MaxSegmentLength }, new RouletteSelection() { Bias = 2, RandomGenerator = random }, new UniformCrossoverOperator { FirstParentProbability = 0.5, RandomGenerator = random }, new ShiftMutationAlphaBeta(config.MaxShift, random), callbacks) { MutationProbability = config.MutationProbability, CrossoverProbability = config.CrossoverProbability }; var watch = System.Diagnostics.Stopwatch.StartNew(); var result = solver.Solve(config.PopulationSize, config.GenerationLimit); watch.Stop(); serializer.WaitOngoingSaves(); return(result, watch.ElapsedMilliseconds); }
public void MutationTestingGround() { var mutation = new ShiftMutationBeta(new Random(_seed), 15); var init = new RandomInitializer { RandomGenerator = new Random(_seed) }; var pathJson = "xd.json"; var pathImg = "xd.png"; for (var i = 0; i < 30; i++) { mutation.Mutation(_solution, init); var serialized = GaSerializer.CreateSerializedSolution(_solution, i, includeProblemInfo: true); File.WriteAllText(pathJson, JsonSerializer.Serialize(serialized)); GaVisualizer.GenerateImage(pathJson, pathImg); } Assert.True(true); }