public Route Search(Graph graph, bool printProgress = false)
        {
            Route route = new Route(graph);

            if (printProgress)
            {
                Console.ForegroundColor = ConsoleColor.Green;
                Console.WriteLine("Starting a new {0} search", GetType().Name);
                if (Improver != null)
                {
                    Console.ForegroundColor = ConsoleColor.DarkGreen;
                    Console.WriteLine("Search will use {0} to "
                                      + "improve each iteration", Improver.GetType().Name);
                }
                Console.ForegroundColor = ConsoleColor.Green;
                Console.Write("Progress: 0/{0} - 0", graph.Count);
                Console.ForegroundColor = ConsoleColor.White;
            }

            int lastCount = route.Count;

            while (route.Count < graph.Count)
            {
                int vIndex = ChooseNext(route);
                route.Insert(vIndex, ChooseIndex(route, vIndex));

                lastCount = route.Count;

                if (Improver != null)
                {
                    Improver.Improve(route, false);
                }

                if (printProgress)
                {
                    Console.CursorLeft = 10;
                    Console.Write("{0}/{1} - {2}    ",
                                  route.Count, graph.Count, route.Length);
                }
            }

            if (printProgress)
            {
                Console.ForegroundColor = ConsoleColor.Green;
                Console.WriteLine("\n{0} search complete", GetType().Name);
                Console.ForegroundColor = ConsoleColor.White;
            }

            return(route);
        }
        public Route Search( Graph graph, bool printProgress = false )
        {
            Route route = new Route( graph );

            if ( printProgress )
            {
                Console.ForegroundColor = ConsoleColor.Green;
                Console.WriteLine( "Starting a new {0} search", GetType().Name );
                if ( Improver != null )
                {
                    Console.ForegroundColor = ConsoleColor.DarkGreen;
                    Console.WriteLine( "Search will use {0} to "
                    + "improve each iteration", Improver.GetType().Name );
                }
                Console.ForegroundColor = ConsoleColor.Green;
                Console.Write( "Progress: 0/{0} - 0", graph.Count );
                Console.ForegroundColor = ConsoleColor.White;
            }

            int lastCount = route.Count;
            while ( route.Count < graph.Count )
            {
                int vIndex = ChooseNext( route );
                route.Insert( vIndex, ChooseIndex( route, vIndex ) );

                lastCount = route.Count;

                if ( Improver != null )
                    Improver.Improve( route, false );

                if ( printProgress )
                {
                    Console.CursorLeft = 10;
                    Console.Write( "{0}/{1} - {2}    ",
                        route.Count, graph.Count, route.Length );
                }
            }

            if ( printProgress )
            {
                Console.ForegroundColor = ConsoleColor.Green;
                Console.WriteLine( "\n{0} search complete", GetType().Name );
                Console.ForegroundColor = ConsoleColor.White;
            }

            return route;
        }
        public override void Improve(Route route, bool printProgress = false)
        {
            _genePool = new GeneticRoute[GenePoolCount];
            _selected = new GeneticRoute[SelectionCount];

            if (printProgress) {
                Console.ForegroundColor = ConsoleColor.Green;
                Console.WriteLine("Starting a new {0} search", GetType().Name);
                Console.WriteLine("Creating initial population...");
                Console.Write("Progress: 0/{0}", GenePoolCount);
                Console.ForegroundColor = ConsoleColor.White;
            }

            ReversingSearcher improver = new ReversingSearcher();

            _genePool[0] = new GeneticRoute(route);
            _genePool[0].Fitness = route.Length;
            for (int i = 1; i < GenePoolCount; ++i) {
                _genePool[i] = new GeneticRoute(route.Graph, _rand);
                _genePool[i].Fitness = _genePool[i].Length;
                //Route clone = new Route(_genePool[i]);
                //improver.Improve(clone, false);
                //_genePool[i].Fitness = clone.Length;
                if (printProgress) {
                    Console.CursorLeft = 10;
                    Console.Write("{0}/{1}", i + 1, GenePoolCount);
                }
            }

            if (printProgress) {
                Console.ForegroundColor = ConsoleColor.Green;
                Console.WriteLine();
                Console.WriteLine("Initial population created");
                Console.WriteLine("Running generations...");
                Console.Write("Progress: 0/{0} - 0", GenerationLimit);
                Console.ForegroundColor = ConsoleColor.White;
            }

            for (int g = 0; g < GenerationLimit; ++g) {
                if (printProgress) {
                    Console.CursorLeft = 10;
                    Console.Write("{0}/{1} - {2}   ", g + 1, GenerationLimit, _genePool[0].Fitness);
                }

                for (int i = 0; i < SelectionCount; ++i) {
                    int j = 0;
                    while (IsSelected(i, j) || _rand.NextDouble() >= SelectionQuality) {
                        j = (j + 1) % GenePoolCount;
                    }
                    _selected[i] = _genePool[j];
                }

                for (int i = 0; i < OffspringCount; ++i) {
                    GeneticRoute parentA = _selected[0]; // TODO: fix for different
                    GeneticRoute parentB = _selected[1]; //       selection counts
                    ushort[] genes = new ushort[route.Count];
                    Crossover(genes, parentA.Genes, parentB.Genes);
                    Mutate(genes);
                    GeneticRoute child = new GeneticRoute(route.Graph, genes);
                    //Route clone = new Route(child);
                    //improver.Improve(clone, false);
                    //child.Fitness = clone.Length;
                    child.Fitness = child.Length;

                    int l = -1;
                    for (int j = GenePoolCount - 1; j >= 0; --j) {
                        GeneticRoute other = _genePool[j];
                        if (other.Fitness > child.Fitness) {
                            _genePool[j] = child;

                            if (l > -1)
                                _genePool[l] = other;

                            if (j == 0) {
                                BetterRouteFound(this, new BetterRouteFoundEventArgs(child));
                                g = 0;
                            }

                            l = j;
                        } else break;
                    }
                }
            }

            if (printProgress) {
                Console.ForegroundColor = ConsoleColor.Green;
                Console.WriteLine("\nGenetic search complete");
                Console.ForegroundColor = ConsoleColor.White;
            }

            Route best = new Route(_genePool[0]);
            improver.Improve(best);

            route.Clear();
            for (int i = 0; i < best.Count; ++i)
                route.Insert(route.VIndexOf(best[i]), i);
        }
Пример #4
0
        public override void Improve(Route route, bool printProgress = false)
        {
            _genePool = new GeneticRoute[GenePoolCount];
            _selected = new GeneticRoute[SelectionCount];

            if (printProgress)
            {
                Console.ForegroundColor = ConsoleColor.Green;
                Console.WriteLine("Starting a new {0} search", GetType().Name);
                Console.WriteLine("Creating initial population...");
                Console.Write("Progress: 0/{0}", GenePoolCount);
                Console.ForegroundColor = ConsoleColor.White;
            }

            ReversingSearcher improver = new ReversingSearcher();

            _genePool[0]         = new GeneticRoute(route);
            _genePool[0].Fitness = route.Length;
            for (int i = 1; i < GenePoolCount; ++i)
            {
                _genePool[i]         = new GeneticRoute(route.Graph, _rand);
                _genePool[i].Fitness = _genePool[i].Length;
                //Route clone = new Route(_genePool[i]);
                //improver.Improve(clone, false);
                //_genePool[i].Fitness = clone.Length;
                if (printProgress)
                {
                    Console.CursorLeft = 10;
                    Console.Write("{0}/{1}", i + 1, GenePoolCount);
                }
            }

            if (printProgress)
            {
                Console.ForegroundColor = ConsoleColor.Green;
                Console.WriteLine();
                Console.WriteLine("Initial population created");
                Console.WriteLine("Running generations...");
                Console.Write("Progress: 0/{0} - 0", GenerationLimit);
                Console.ForegroundColor = ConsoleColor.White;
            }

            for (int g = 0; g < GenerationLimit; ++g)
            {
                if (printProgress)
                {
                    Console.CursorLeft = 10;
                    Console.Write("{0}/{1} - {2}   ", g + 1, GenerationLimit, _genePool[0].Fitness);
                }

                for (int i = 0; i < SelectionCount; ++i)
                {
                    int j = 0;
                    while (IsSelected(i, j) || _rand.NextDouble() >= SelectionQuality)
                    {
                        j = (j + 1) % GenePoolCount;
                    }
                    _selected[i] = _genePool[j];
                }

                for (int i = 0; i < OffspringCount; ++i)
                {
                    GeneticRoute parentA = _selected[0]; // TODO: fix for different
                    GeneticRoute parentB = _selected[1]; //       selection counts
                    ushort[]     genes   = new ushort[route.Count];
                    Crossover(genes, parentA.Genes, parentB.Genes);
                    Mutate(genes);
                    GeneticRoute child = new GeneticRoute(route.Graph, genes);
                    //Route clone = new Route(child);
                    //improver.Improve(clone, false);
                    //child.Fitness = clone.Length;
                    child.Fitness = child.Length;

                    int l = -1;
                    for (int j = GenePoolCount - 1; j >= 0; --j)
                    {
                        GeneticRoute other = _genePool[j];
                        if (other.Fitness > child.Fitness)
                        {
                            _genePool[j] = child;

                            if (l > -1)
                            {
                                _genePool[l] = other;
                            }

                            if (j == 0)
                            {
                                BetterRouteFound(this, new BetterRouteFoundEventArgs(child));
                                g = 0;
                            }

                            l = j;
                        }
                        else
                        {
                            break;
                        }
                    }
                }
            }

            if (printProgress)
            {
                Console.ForegroundColor = ConsoleColor.Green;
                Console.WriteLine("\nGenetic search complete");
                Console.ForegroundColor = ConsoleColor.White;
            }

            Route best = new Route(_genePool[0]);

            improver.Improve(best);

            route.Clear();
            for (int i = 0; i < best.Count; ++i)
            {
                route.Insert(route.VIndexOf(best[i]), i);
            }
        }