private GeneticAlgorithm RunGeneticAlgorithm(Population population, IFitness fitness, int generations)
        {
            var selection = new EliteSelection();
            var crossover = new TwoPointCrossover();
            var mutation  = new ReverseSequenceMutation();

            var ga = new GeneticAlgorithm(population, fitness, selection, crossover, mutation)
            {
                Termination  = new GenerationNumberTermination(generations),
                TaskExecutor = new ParallelTaskExecutor()
                {
                    MinThreads = 100, MaxThreads = 250
                },
            };

            var latestFitness = 0.0;

            ga.GenerationRan += (sender, e) =>
            {
                var bestfitness = ga.BestChromosome.Fitness ?? 0;
                if (bestfitness != latestFitness)
                {
                    latestFitness = bestfitness;

                    testOutputHelper.WriteLine($"Current best fitness: {bestfitness}");
                }
            };

            ga.Start();
            return(ga);
        }
        public void GA_Issue61_Solved()
        {
            const Int32 FinalAns   = 4567213;
            var         chromosome = new Issue61.GuessNumberChromosome(FinalAns.ToString().Length);
            var         population = new Population(1000, 5000, chromosome);
            var         fitness    = new Issue61.GuessNumberFitness(FinalAns);
            var         selection  = new EliteSelection();
            var         crossover  = new AlternatingPositionCrossover();
            var         mutation   = new ReverseSequenceMutation();
            var         ga         = new GeneticAlgorithm(population, fitness, selection, crossover, mutation);

            ga.MutationProbability  = 0.2f;
            ga.CrossoverProbability = 0.75f;
            ga.Termination          = new OrTermination(
                new FitnessThresholdTermination(1.0),
                new FitnessStagnationTermination(200),
                new GenerationNumberTermination(1000));
            ga.Population.GenerationStrategy = new TrackingGenerationStrategy();
            ga.Start();

            foreach (var gen in ga.Population.Generations)
            {
                foreach (var chromossome in gen.Chromosomes)
                {
                    // Asserts if AlternatingPositionCrossover generated only ordered chromossomes.
                    Assert.AreEqual(chromosome.Length, chromosome.GetGenes().Distinct().Count());
                }
            }
        }
Exemplo n.º 3
0
        public void Mutate_NoProbality_NoReverseSequence()
        {
            var target     = new ReverseSequenceMutation();
            var chromosome = Substitute.For <ChromosomeBase>(4);

            chromosome.ReplaceGenes(0, new Gene[]
            {
                new Gene(1),
                new Gene(2),
                new Gene(3),
                new Gene(4),
            });

            var rnd = Substitute.For <IRandomization>();

            rnd.GetDouble().Returns(0.1);
            RandomizationProvider.Current = rnd;

            target.Mutate(chromosome, 0);

            Assert.AreEqual(4, chromosome.Length);
            Assert.AreEqual(1, chromosome.GetGene(0).Value);
            Assert.AreEqual(2, chromosome.GetGene(1).Value);
            Assert.AreEqual(3, chromosome.GetGene(2).Value);
            Assert.AreEqual(4, chromosome.GetGene(3).Value);
        }
Exemplo n.º 4
0
        public void Mutate_ValidChromosome_ReverseSequence()
        {
            var target     = new ReverseSequenceMutation();
            var chromosome = Substitute.For <ChromosomeBase>(6);

            chromosome.ReplaceGenes(0, new Gene[]
            {
                new Gene(1),
                new Gene(2),
                new Gene(3),
                new Gene(4),
                new Gene(5),
                new Gene(6),
            });

            var rnd = Substitute.For <IRandomization>();

            rnd.GetUniqueInts(2, 0, 6).Returns(new int[] { 1, 4 });
            RandomizationProvider.Current = rnd;

            target.Mutate(chromosome, 1);

            Assert.AreEqual(6, chromosome.Length);
            Assert.AreEqual(1, chromosome.GetGene(0).Value);
            Assert.AreEqual(5, chromosome.GetGene(1).Value);
            Assert.AreEqual(4, chromosome.GetGene(2).Value);
            Assert.AreEqual(3, chromosome.GetGene(3).Value);
            Assert.AreEqual(2, chromosome.GetGene(4).Value);
            Assert.AreEqual(6, chromosome.GetGene(5).Value);
        }
Exemplo n.º 5
0
        public static void ga()
        {
            AlgorithmList.loadformnistfsgm();
            var selection  = new EliteSelection();
            var crossover  = new OrderedCrossover();
            var mutation   = new ReverseSequenceMutation();
            var fitness    = new MyProblemFitness();
            var chromosome = new MyChromosome();
            var population = new Population(4, 6, chromosome);

            var ga = new GeneticAlgorithm(population, fitness, selection, crossover, mutation);

            ga.Termination = new GenerationNumberTermination(4);

            Console.WriteLine("GA running...");
            ga.Start();

            Console.WriteLine("Best solution found has {0} fitness.", ga.BestChromosome.Fitness);

            var    a = ga.BestChromosome.GetGenes();
            string s = "";

            foreach (var b in a)
            {
                s = s + b.Value.ToString();
            }
            Console.WriteLine("Best solution found has {0} ", s);
        }
        private void Optimize_Load(object sender, EventArgs e)
        {
            var selection  = new EliteSelection();
            var crossover  = new OrderedCrossover();
            var mutation   = new ReverseSequenceMutation();
            var fitness    = new TrajectoryFitness();
            var chromosome = new TrajectoryChromosome(TrajectoryChromosome.ChromosomeLength(3), 3);
            var population = new Population(35, 40, chromosome);
            //72 (6)
            //67 (2)
            //49 (3)
            //102 (1)
            var ga       = new GeneticAlgorithm(population, fitness, selection, crossover, mutation);
            var executor = new SmartThreadPoolTaskExecutor();

            executor.MinThreads = 1;
            executor.MaxThreads = 1;
            ga.TaskExecutor     = executor;
            ga.Termination      = new GenerationNumberTermination(10);

            Console.WriteLine("GA running...");
            var t = DateTime.Now;

            ga.Start();
            Console.WriteLine("Time:" + DateTime.Now.Subtract(t).TotalSeconds);

            Console.WriteLine("Best solution found has {0} fitness.", int.MaxValue - ga.BestChromosome.Fitness);
            Console.WriteLine(ga.BestChromosome.GetGene(0).Value + " " + ga.BestChromosome.GetGene(1).Value + " " + ga.BestChromosome.GetGene(2).Value);
        }
Exemplo n.º 7
0
        public IMutation ReverseSequenceMutation()
        {
            var target = new ReverseSequenceMutation();

            target.Mutate(new TspChromosome(_numberOfCities), _probability);

            return(target);
        }
Exemplo n.º 8
0
        static GeneticAlgorithm CreateGA(IPopulation population)
        {
            var selection = new EliteSelection();
            var crossover = new OrderedCrossover();
            var mutation  = new ReverseSequenceMutation();
            var fitness   = new TspFitness(100, 0, 1000, 0, 1000);

            return(new GeneticAlgorithm(population, fitness, selection, crossover, mutation));
        }
Exemplo n.º 9
0
        public void Mutate_LessThanThreeGenes_Exception()
        {
            var target     = new ReverseSequenceMutation();
            var chromosome = Substitute.For <ChromosomeBase>(2);

            chromosome.ReplaceGenes(0, new Gene[]
            {
                new Gene(1),
            });

            Assert.Catch <MutationException>(() =>
            {
                target.Mutate(chromosome, 0);
            }, "A chromosome should have, at least, 3 genes. {0} has only 2 gene.".With(chromosome.GetType().Name));
        }
Exemplo n.º 10
0
    public void Initialize(int numberOfCities, int areaWidth, int areaHeight)
    {
        Stop();
        Fitness = new TspFitness(numberOfCities, areaWidth, areaHeight);
        var chromosome = new TspChromosome(numberOfCities);

        // This operators are classic genetic algorithm operators that lead to a good solution on TSP,
        // but you can try others combinations and see what result you get.
        var crossover  = new OrderedCrossover();
        var mutation   = new ReverseSequenceMutation();
        var selection  = new RouletteWheelSelection();
        var population = new Population(50, 100, chromosome);

        _ga = new GeneticAlgorithm(population, Fitness, selection, crossover, mutation);
    }
        public void LinesOfCode()
        {
            const string source = @"
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics;

namespace ConsoleApplication1
{
    class Calculations
    {
        double CalculateTotal(int quantity, int itemPrice)
        {
            double basePrice = quantity * itemPrice;

            if (basePrice > 1000)
            {
                return basePrice * 0.95;
            }
            else
            {
                return basePrice * 0.98;
            }
        }
    }
}";

            var selection  = new EliteSelection();
            var crossover  = new OrderedCrossover();
            var mutation   = new ReverseSequenceMutation();
            var fitness    = new MetricsFitness <LinesOfCodeMetrics>();
            var chromosome = new RefactoringChromosome(3, source);
            var population = new Population(20, 30, chromosome);

            var ga = new GeneticAlgorithm(population, fitness, selection, crossover, mutation)
            {
                Termination = new GenerationNumberTermination(50)
            };

            ga.Start();

            Assert.IsNotNull(ga.BestChromosome.Fitness);
            TestContext.WriteLine($"Best fitness is {ga.BestChromosome.Fitness} and source looks like: \n {ga.BestChromosome}");
        }
        public void StartGeneticAlgo(string target)
        {
            var selection = new EliteSelection();
            var crossover = new ThreeParentCrossover();
            var mutation  = new ReverseSequenceMutation();
            var fitness   = new MyFitness {
                Target = target
            };
            var chromosome = new Chromosome(target);
            var population = new Population(500, 1000, chromosome);

            _stopwatch = Stopwatch.StartNew();

            _ga = new GeneticAlgorithm(population, fitness, selection, crossover, mutation)
            {
                Termination         = new GenerationNumberTermination(300),
                MutationProbability = float.MaxValue
            };
            _timer = new Timer(new TimerCallback(_ =>
            {
                _ga.Termination = new GenerationNumberTermination(_ga.GenerationsNumber + 1);
                if (_ga.GenerationsNumber > 0)
                {
                    _ga.Resume();
                }
                else
                {
                    _ga.Start();
                }

                var teste = string.Empty;
                for (var i = 0; i < _ga.BestChromosome.GetGenes().Length; i++)
                {
                    teste += _ga.BestChromosome.GetGenes()[i].Value;
                    if (teste == target)
                    {
                        Stop();
                        _stopwatch.Stop();
                    }
                }
                StateHasChanged?.Invoke();
            }), null, 0, 1);
        }
Exemplo n.º 13
0
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");

            var selection  = new GeneticSharp.Domain.Selections.RouletteWheelSelection();
            var crossover  = new OrderedCrossover();
            var mutation   = new ReverseSequenceMutation();
            var fitness    = new MyProblemFitness();
            var chromosome = new MyProblemChromosome();
            var population = new Population(50, 70, chromosome);

            var ga = new GeneticAlgorithm(population, fitness, selection, crossover, mutation);

            ga.Termination = new GenerationNumberTermination(100);

            Console.WriteLine("GA running...");
            ga.Start();

            Console.WriteLine("Best solution found has {0} fitness.", ga.BestChromosome.Fitness);
        }
        private GeneticAlgorithm CreateGA(Func <TspChromosome, Population> createPopulation = null)
        {
            var selection  = new EliteSelection();
            var crossover  = new OrderedCrossover();
            var mutation   = new ReverseSequenceMutation();
            var chromosome = new TspChromosome(_numberOfCities);
            var fitness    = new TspFitness(_numberOfCities, 0, 1000, 0, 1000);

            var population = createPopulation == null
            ? new Population(_minPopulationSize, _minPopulationSize, chromosome)
            : createPopulation(chromosome);

            population.GenerationStrategy = new PerformanceGenerationStrategy();

            var ga = new GeneticAlgorithm(population, fitness, selection, crossover, mutation)
            {
                Termination = new GenerationNumberTermination(_generations)
            };

            return(ga);
        }
        static void Main(string[] args)
        {
            int vezirSayisi = 8;

            var selection  = new EliteSelection();
            var crossover  = new TwoPointCrossover();
            var mutation   = new ReverseSequenceMutation();
            var fitness    = new MyProblemFitness();
            var chromosome = new MyProblemChromosome(vezirSayisi);
            var population = new Population(5000, 5500, chromosome);

            var ga = new GeneticAlgorithm(population, fitness, selection, crossover, mutation)
            {
                Termination = new FitnessThresholdTermination(vezirSayisi * (vezirSayisi - 1) / 2)
            };

            int index = 0;

            ga.GenerationRan += delegate
            {
                var bestChromosome = ga.Population.BestChromosome;

                Console.Write("Index: " + index);
                Console.Write(", Fitness: {0}", bestChromosome.Fitness);

                Console.Write(", Genes: {0}", string.Join("-", bestChromosome.GetGenes()));

                Console.WriteLine();

                index++;
            };

            Console.WriteLine("GA running...");

            ga.Start();

            Console.WriteLine("Best solution found has {0} fitness.", ga.BestChromosome.Fitness);

            Console.Read();
        }
Exemplo n.º 16
0
        public OutputData DoIt(InputData inputData)
        {
            var selection  = new EliteSelection();
            var crossover  = new ThreeParentCrossover();;;  //OnePointCrossover
            var mutation   = new ReverseSequenceMutation(); //DisplacementMutation ReverseSequenceMutation
            var fitness    = new MyProblemFitness(inputData);
            var chromosome = new MyProblemChromosome(inputData.F, inputData.N);
            var population = new Population(100, 1000, chromosome);

            var ga = new GeneticAlgorithm(population, fitness, selection, crossover, mutation);

            ga.Termination = new FitnessStagnationTermination(10000);
            ga.Population.GenerationStrategy = new TrackingGenerationStrategy();
            Console.WriteLine("GA running...");

            double currentFitness = 0;

            ga.GenerationRan += delegate(object obj, EventArgs eventArgs)
            {
                var outputx = new MyProblemFitness(inputData);
                var re      = outputx.Evaluate(((GeneticAlgorithm)obj).BestChromosome);
                if (re != currentFitness)
                {
                    currentFitness = re;
                    Console.WriteLine("Fitness..." + re);
                }
            };

            ga.Start();

            var x      = ga.BestChromosome;
            var output = new MyProblemFitness(inputData);
            var res    = output.Evaluate(ga.BestChromosome);

            Console.WriteLine("Done...fitness..." + res);
            return(output.OutputData);
        }
Exemplo n.º 17
0
    public void TSPSolve(int numberOfPoints, List <Point> stationList)
    {
        var fitness    = new TspFitness(stationList);
        var chromosome = new TspChromosome(numberOfPoints);

        var crossover  = new OrderedCrossover();
        var mutation   = new ReverseSequenceMutation();
        var selection  = new RouletteWheelSelection();
        var population = new Population(50, 100, chromosome);

        m_ga             = new GeneticAlgorithm(population, fitness, selection, crossover, mutation);
        m_ga.Termination = new FitnessStagnationTermination(100);

        m_ga.TaskExecutor = new ParallelTaskExecutor {
            MinThreads = 100,
            MaxThreads = 200
        };

        m_ga.GenerationRan += delegate {
            var distance = ((TspChromosome)m_ga.BestChromosome).Distance;
        };

        m_ga.TerminationReached += delegate {
            var c      = m_ga.Population.CurrentGeneration.BestChromosome as TspChromosome;
            var genes  = c.GetGenes();
            var points = ((TspFitness)m_ga.Fitness).Points;
            finalPoints = new List <Point>();
            for (int i = 0; i < genes.Length; i++)
            {
                finalPoints.Add(points[(int)genes[i].Value]);
            }
            tspSolved();
        };

        m_gaThread = new Thread(() => m_ga.Start());
        m_gaThread.Start();
    }
Exemplo n.º 18
0
        static void Main(string[] args)
        {
            var selection  = new EliteSelection();
            var crossover  = new OnePointCrossover();
            var mutation   = new ReverseSequenceMutation();
            var fitness    = new MyProblemFitness();
            var chromosome = new MyProblemChromosome();
            var population = new Population(20, 20, chromosome);

            var ga = new GeneticSharp.Domain.GeneticAlgorithm(population, fitness, selection, crossover, mutation)
            {
                Termination = new GenerationNumberTermination(100)
            };

            Console.WriteLine("GA running...");
            ga.Start();

            if (ga.BestChromosome.Fitness != null)
            {
                double fitnessValue = ga.BestChromosome.Fitness.Value;
                string solution     = ga.BestChromosome.ToUserFriendly();
                Console.WriteLine($"Best solution {solution} found has {fitnessValue} fitness for {ga.GenerationsNumber} generations.");
            }
        }
Exemplo n.º 19
0
        static void Main(string[] args)
        {
            SQLiteConnection dbConnect;
            SQLiteCommand    cmd;
            SQLiteDataReader dbread = null;
            string           inputstring;
            string           cmc = ""; string power = "";
            StreamReader     inputReader = new StreamReader("input.txt");

            dbConnect = new SQLiteConnection("Data Source=C://Users/Korik/Documents/Visual Studio 2015/Projects/GAdeckbuilder/GAdeckbuilder/bin/Debug/mtg.db;");
            dbConnect.Open();
            string sql;
            bool   white = false, blue = false, black = false, red = false, green = false;

            while (inputReader.Peek() != -1)
            {
                inputstring = inputReader.ReadLine();
                sql         = "SELECT * FROM cards INNER JOIN colors ON cards.name = colors.name where cards.setcode = 'BFZ' AND colors.setcode = 'BFZ' AND cards.name = '" + inputstring + "';";
                // Console.WriteLine(sql);
                cmd    = new SQLiteCommand(sql, dbConnect);
                dbread = cmd.ExecuteReader();
                while (dbread.Read())
                {
                    //Console.WriteLine(dbread[1].ToString());
                    white = false; blue = false; black = false; red = false; green = false;
                    if (Convert.ToBoolean(dbread["white"].ToString()))
                    {
                        white = true;
                    }
                    if (Convert.ToBoolean(dbread["blue"].ToString()))
                    {
                        blue = true;
                    }
                    if (Convert.ToBoolean(dbread["black"].ToString()))
                    {
                        black = true;
                    }
                    if (Convert.ToBoolean(dbread["red"].ToString()))
                    {
                        red = true;
                    }
                    if (Convert.ToBoolean(dbread["green"].ToString()))
                    {
                        green = true;
                    }
                    // Console.WriteLine(dbread["cmc"].ToString());
                    cmc = dbread["cmc"].ToString();
                    //Console.WriteLine(cmc);
                    power = dbread["PowerLevel"].ToString();
                    //Console.WriteLine(power);
                }
                // Console.WriteLine(inputstring + white + blue + red + black + green + cmc + power);
                CardPool.Add(new Card(inputstring, white, blue, black, red, green, int.Parse(cmc), int.Parse(power)));
            }
            inputReader.Close();
            dbread.Close();
            dbConnect.Close();


            foreach (Card c in CardPool)
            {
                //   Console.WriteLine(c.White);
            }
            Console.ReadLine();

            var selection  = new EliteSelection();
            var crossover  = new OnePointCrossover();
            var mutation   = new ReverseSequenceMutation();
            var fitness    = new DeckFitness();
            var chromosome = new DeckChromosome();
            var population = new Population(400, 400, chromosome);

            var ga = new GeneticAlgorithm(population, fitness, selection, crossover, mutation);

            ga.Termination = new FitnessStagnationTermination(4000);

            ga.CrossoverProbability = 0.80f;
            ga.MutationProbability  = 1.00f;
            Console.WriteLine("GA running...");
            ga.Start();

            printDecklist(ga.BestChromosome);
            Console.WriteLine("Number of Generations " + ga.GenerationsNumber);
            Console.ReadLine();
            Console.ReadLine();
        }
Exemplo n.º 20
0
        public void Start()
        {
            var w   = new StreamWriter("C:\\Users\\Taylor\\source\\repos\\ComboProject\\ComboProject\\bin\\Debug\\genelog.csv");
            int gen = 1;

            // init chromosomes
            var chromosome = new FloatingPointChromosome(
                new double[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
                new double[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
                new int[] { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20 },
                new int[] { 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 });

            // gen population
            var population = new Population(50, 100, chromosome);

            // fitness function
            var fitness = new FuncFitness((c) =>
            {
                var fc = c as FloatingPointChromosome;

                var genes = fc.ToFloatingPoints();

                string combo = combogen.generateGeneticCombo(genes, 0);

                int damage = ComboSimulator.getComboDamage(combo, movelist);

                w.WriteLine(string.Format("{0},{1},{2},,{3},{4},{5},{6},{7},{8},{9},{10},{11},{12}",
                                          gen.ToString(),
                                          combo,
                                          damage.ToString(),
                                          genes[0],
                                          genes[1],
                                          genes[2],
                                          genes[3],
                                          genes[4],
                                          genes[5],
                                          genes[6],
                                          genes[7],
                                          genes[8],
                                          genes[9]));
                w.Flush();

                return(damage);
            });

            var selection = new EliteSelection();

            var crossover = new UniformCrossover(0.5f);

            var mutation = new ReverseSequenceMutation();

            var termination = new FitnessStagnationTermination(5000);

            var ga = new GeneticAlgorithm(
                population,
                fitness,
                selection,
                crossover,
                mutation);

            ga.Termination         = termination;
            ga.MutationProbability = 0.7f;

            Console.WriteLine("Generation: combo = damage");

            var latestFitness = 0.0;

            ga.GenerationRan += (sender, e) =>
            {
                var bestChromosome = ga.BestChromosome as FloatingPointChromosome;
                var bestFitness    = bestChromosome.Fitness.Value;

                if (bestFitness != latestFitness)
                {
                    latestFitness = bestFitness;
                    string combo = combogen.generateGeneticCombo(bestChromosome.ToFloatingPoints(), 0);

                    Console.WriteLine("Generation {0,2}: {1} = {2}",
                                      ga.GenerationsNumber,
                                      combo,
                                      bestFitness
                                      );
                }

                gen++;
            };

            ga.Start();

            Console.ReadKey();
        }
Exemplo n.º 21
0
        public static void CorretionCentroid()
        {
            //中心点数据
            Stopwatch sw = new Stopwatch();

            sw.Start();
            List <Coordinate> centroidPoints = new List <Coordinate>(80);
            StreamReader      sr             = new StreamReader(@"D:\MagicSong\OneDrive\2017研究生毕业设计\数据\项目用数据\中心点80.txt");

            sr.ReadLine();//读取标题行
            while (!sr.EndOfStream)
            {
                string[] line = sr.ReadLine().Split(',');
                centroidPoints.Add(new Coordinate(double.Parse(line[1]), double.Parse(line[2])));
            }
            sr.Close();
            //Bus数据,并且构造KD树
            KdTree            myKdtree      = new KdTree(2);
            IFeatureSet       busFS         = FeatureSet.Open(@"D:\MagicSong\OneDrive\2017研究生毕业设计\数据\项目用数据\BusStopGauss.shp");
            List <Coordinate> busStopPoints = new List <Coordinate>(busFS.NumRows());

            foreach (var item in busFS.Features)
            {
                var c = item.Coordinates[0];
                busStopPoints.Add(c);
                myKdtree.Insert(new double[] { c.X, c.Y }, item);
            }
            Console.WriteLine("数据读取完毕,开始构造遗传算法");
            IFeatureSet newCentroid = new FeatureSet(FeatureType.Point);

            newCentroid.Name       = "优化过的中心点";
            newCentroid.Projection = ProjectionInfo.FromEpsgCode(GAUSS_EPSG);
            newCentroid.DataTable.Columns.Add("name", typeof(string));
            //遗传算法,构造适应性函数
            MyProblemChromosome.CandiateNumber = 5;
            List <int[]> candinatesForEachControid = new List <int[]>(centroidPoints.Count);

            foreach (var item in centroidPoints)
            {
                object[] nearest = myKdtree.Nearest(new double[] { item.X, item.Y }, MyProblemChromosome.CandiateNumber);
                candinatesForEachControid.Add(nearest.Select((o) =>
                {
                    var f = o as IFeature;
                    return(f.Fid);
                }).ToArray());
            }
            MyProblemFitness    fitness = new MyProblemFitness(centroidPoints, busStopPoints, candinatesForEachControid);
            MyProblemChromosome mpc     = new MyProblemChromosome(centroidPoints.Count);
            //这边可以并行
            MyProblemChromosome globalBest = null;

            Console.WriteLine("遗传算法构造已经完成!");
            sw.Stop();
            Console.WriteLine("一共用时:{0}s", sw.Elapsed.TotalSeconds);
            int GACount = 8;

            Parallel.For(0, GACount, new Action <int>((index) =>
            {
                var selection  = new EliteSelection();
                var crossover  = new TwoPointCrossover();
                var mutation   = new ReverseSequenceMutation();
                var population = new Population(1000, 1200, mpc);
                var ga         = new GeneticAlgorithm(population, fitness, selection, crossover, mutation);
                ga.Termination = new GenerationNumberTermination(1000);
                Stopwatch sw1  = new Stopwatch();
                sw1.Start();
                Console.WriteLine("遗传算法任务{0}正在运行.......", index);
                ga.Start();
                var best = ga.BestChromosome as MyProblemChromosome;
                if (globalBest == null || globalBest.Fitness < best.Fitness)
                {
                    globalBest = best;
                }
                sw1.Stop();
                Console.WriteLine("第{0}次遗传算法已经完成,耗费时间为:{1}s,最终的fitness为:{2},有效个数为:{3}", index, sw1.Elapsed.TotalSeconds, best.Fitness, best.Significance);
            }));
            Console.WriteLine("Final Choose!");
            Console.WriteLine("最终的fitness为:{0},有效个数为:{1}", globalBest.Fitness, globalBest.Significance);
            for (int i = 0; i < globalBest.Length; i++)
            {
                int        index = candinatesForEachControid[i][(int)globalBest.GetGene(i).Value];
                Coordinate c     = busStopPoints[index];
                var        f     = newCentroid.AddFeature(new Point(c));
                f.DataRow.BeginEdit();
                f.DataRow["name"] = busFS.GetFeature(index).DataRow["name"];
                f.DataRow.EndEdit();
            }
            newCentroid.SaveAs("newCentroid.shp", true);
            Console.ReadKey();
        }