コード例 #1
0
        public Log Compute(Graph graph)
        {
            TerminateCondition terminate = terminateStrategy();

            Route?bestRoute = default;

            int       itterationCounter = 0;
            Stopwatch timer             = new Stopwatch();

            timer.Start();


            while (!terminate())
            {
                Route parent    = initalisationStrategy.Initalise(graph.nodes);
                Route candidate = Search(parent);

                bestRoute = bestRoute == null? candidate : step.CostP(candidate, bestRoute);

                OnItterationComplete?.Invoke(this, new Log()
                {
                    numberOfRoutesEvaluated = routesEvaluated,
                    bestRouteCost           = bestRoute.Distance(),
                    iteration     = itterationCounter++,
                    bestRoute     = bestRoute != null ? bestRoute.ToString() : String.Empty,
                    timeToCompute = timer.ElapsedMilliseconds,
                });
            }

            timer.Stop();
            return(new Log()
            {
                timeToCompute = timer.ElapsedMilliseconds,
                numberOfRoutesEvaluated = routesEvaluated,
                iteration = itterationCounter,
                bestRouteCost = bestRoute != null?bestRoute.Distance() : float.PositiveInfinity,
                                    bestRoute = bestRoute != null?bestRoute.ToString() : String.Empty,
            });
        }
コード例 #2
0
        public Log Compute(Graph graph)
        {
            TerminateCondition Terminate = this.terminateStrategy();
            int numberOfRoutes           = 0;

            //Initalise population
            for (int i = 0; i < population.Length; i++)
            {
                population[i] = InitalisationStrategy.Initalise(graph.nodes);
            }


            Route?bestRoute = default;

            Stopwatch timer = new Stopwatch();

            timer.Start();
            int generationCounter = 0;
            int itterationCounter = 0;

            while (!Terminate())
            {
                Route[] parents = selectionStrategy.Select(population, 20, step);

                //Recombine pairs of parents
                Route[] children = Recombine(parents, (int)eliteism * parents.Length);

                //Mutate the resulting offsprint
                for (int i = 0; i < children.Length; i++)
                {
                    if (random.NextDouble() < mutationRate)
                    {
                        children[i] = swap.Swap(children[i]);
                    }
                    numberOfRoutes++;
                    bestRoute = bestRoute == null ? children[i] : step.CostP(children[i], bestRoute);
                    population[generationCounter] = children[i];
                    generationCounter             = (generationCounter + 1) % population.Length;
                }



                OnItterationComplete?.Invoke(this, new Log()
                {
                    numberOfRoutesEvaluated = numberOfRoutes,
                    iteration     = itterationCounter,
                    bestRouteCost = bestRoute != null ? bestRoute.Distance() : float.MaxValue,
                    bestRoute     = bestRoute != null ? bestRoute.ToString() : string.Empty,
                    timeToCompute = timer.ElapsedMilliseconds,
                });
            }
            timer.Stop();
            return(new Log()
            {
                timeToCompute = timer.ElapsedMilliseconds,
                numberOfRoutesEvaluated = numberOfRoutes,
                iteration = itterationCounter,
                bestRouteCost = bestRoute != null?bestRoute.Distance() : float.MaxValue,
                                    bestRoute = bestRoute != null?bestRoute.ToString() : string.Empty,
            });
        }