コード例 #1
0
        private Population InitPopulation()
        {
            Population pop = new Population();

            pop.Add(new Sequence(parent.BSSF));

            City[]      cities = parent.GetCities();
            City        start  = cities[0];
            GreedyMaker maker  = new GreedyMaker(cities);
            List <City> greedy = new List <City>();
            City        source = start;

            greedy.Add(source);
            while (greedy.Count < cities.Length)
            {
                var destinations = maker[source];
                foreach (var c in destinations)
                {
                    City gcity = c.Destination;
                    if (!greedy.Contains(gcity))
                    {
                        greedy.Add(gcity);
                        source = gcity;
                        break;
                    }
                }
            }
            pop.Add(new Sequence(greedy));


            while (pop.Size < PopulationSize)
            {
                City        city = start;
                List <City> gene = new List <City>();
                while (gene.Count < cities.Length)
                {
                    if (!gene.Contains(city))
                    {
                        gene.Add(city);
                    }
                    city = maker[city][(random.Next() <= GreedyPreferenceRate ?
                                        random.Next(GreedyVariance) :
                                        random.Next(maker[city].Count))].Destination;
                }
                pop.Add(new Sequence(gene));
            }

            return(pop);
        }
コード例 #2
0
        public string[] Solve(ProblemAndSolver parent)
        {
            this.parent = parent;
            string[] results = new string[3];
            Dictionary <string, double> improvementRate = new Dictionary <string, double>();

            Population pop      = InitPopulation();
            Sequence   imdabest = pop.Best;
            Stopwatch  timer    = new Stopwatch();

            improvementRate[timer.Elapsed.ToString()] = imdabest.Score;
            timer.Start();
            int             iterationsSanChangement = 0;
            int             count       = 0;
            int             generations = 0;
            List <Sequence> bestones    = new List <Sequence>();

            bestones.Add(imdabest);

            while ((iterationsSanChangement < MaxGenerations && timer.Elapsed.TotalSeconds < 90) ||
                   pop.Size < 2)
            {
                generations++;
                CrossPopulation(ref pop);
                MutatePopulation(pop);
                PrunePopulation(pop);
                if (pop.Best.Score < imdabest.Score)
                {
                    iterationsSanChangement = 0;
                    count++;
                    imdabest = pop.Best;
                    improvementRate[timer.Elapsed.ToString()] = imdabest.Score;
                    bestones.Add(imdabest);
                }
                else
                {
                    iterationsSanChangement++;
                }
            }
            timer.Stop();

            parent.BSSF = imdabest.ToRoute();

            Console.WriteLine();

            results[ProblemAndSolver.COST]  = imdabest.Score.ToString(); // load results into array here, replacing these dummy values
            results[ProblemAndSolver.TIME]  = timer.Elapsed.ToString();
            results[ProblemAndSolver.COUNT] = count.ToString();          //*** should this be 1 or the number of greedy solutions that we find???
            StringBuilder bob = new StringBuilder();

            bob.Append("Time,Best Cost\r\n");
            foreach (var entry in improvementRate)
            {
                bob.Append(entry.Key);
                bob.Append(",");
                bob.Append(entry.Value);
                bob.Append("\r\n");
            }
            bob.Append("Best," + imdabest.Score.ToString() + "\r\n");
            bob.Append("Problem Size," + parent.GetCities().Length + "\r\n");
            bob.Append("Seed," + parent.Seed + "\r\n");
            bob.Append("Generations," + generations.ToString() + "\r\n");
            bob.Append("Total Time," + timer.Elapsed.ToString());
            bob.Append("\r\n");

            System.IO.File.AppendAllText(@"C:\Users\Matt\Desktop\tsp_results.csv", bob.ToString());
            return(results);
        }