public static int RunGAMapFinder(GAFinderOption option) { var map = _loadMap(option.MapFileName, option.Diagonal); if (map == null) { return(1); } var heuristic = (new HeuristicFactory()).GetImplementation(option.Heuristic); var mutate = new MutateFactory().GetImplementation(option.Mutate); var crossover = new CrossoverFactory().GetImplementation(option.Crossover); var selection = new SelectionFactory().GetImplementation(option.Selection); var fitness = new FitnessFactory().GetImplementation(option.Fitness); fitness.Heuristic = heuristic; var finder = FinderFactory.GetGAImplementation( crossover, mutate, fitness, selection, option.Population, option.GenerationLimit, option.BestToPick ); return(_runFinder(finder, heuristic, map, option.Window, option.NoShowSteps, option.BlockSize, option.UISleep)); }
/// <param name="fitnessFormula">Fitness formula to be used</param> /// <param name="width">Map width</param> /// <param name="height">Map height</param> /// <param name="populationSize">Size of each generation</param> /// <param name="obstacleRate">How much obstacles on map (percent)</param> static void Main(Formula fitnessFormula , int width = 10 , int height = 10 , int populationSize = 50 , double obstacleRate = 0.2f) { var map = new Map(width, height, obstacleRate); var mapTiles = width + height; var maxRoute = (int)(mapTiles * 1.5); var engine = FitnessFactory.GetEngine(fitnessFormula); var population = new Population(populationSize, maxRoute, engine); var start = new Position { X = 0, Y = 0 }; var destiny = new Position { X = width - 1, Y = height - 1 }; System.Console.WriteLine($"using fitness: {engine.GetType().FullName}"); population.Check(start, destiny, map); for (int i = 0; i < mapTiles; i++) { population.Cross(); population.Mutate(12); population.Check(start, destiny, map); } System.Console.WriteLine(population.Individuals[0]); System.Console.WriteLine(map.DrawRoute(population.Individuals[0])); }