コード例 #1
0
        public static GeneticSharp.Domain.GeneticAlgorithm DefaultGeneticAlgorithm(Func <double[], double> func, Tuple <double, double>[] minmax)
        {
            var population = new Population(20, 40, chromosome.CreateIntChromosone(minmax));

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

                var values = fc.ToFloatingPoints();
                return(func(values));
            });

            var selection = new EliteSelection();
            var crossover = new UniformCrossover(0.5f);
            var mutation  = new FlipBitMutation();

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

            var termination = new FitnessStagnationTermination(100);

            ga.Termination = termination;


            Console.WriteLine("Generation: (x1, y1), (x2, y2) = distance");

            return(ga);
        }
コード例 #2
0
        public AnalysisResults Optimize(PixelStructure structure)
        {
            var chromosome = new StructuralChromosome(structure.Pixels.Count);

            var population = new Population(5, 10, chromosome);

            var fitness = new StructuralFitness(structure);

            var selection   = new EliteSelection();
            var crossover   = new UniformCrossover(0.5f);
            var mutation    = new UniformMutation(); //FlipBitMutation();
            var termination = new FitnessStagnationTermination(10);

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

            ga.Termination = termination;

            ga.GenerationRan += GenerationRan;

            ga.Start();

            var structRes = ga.BestChromosome as StructuralChromosome;

            return(structRes.Results);
        }
コード例 #3
0
        public void InitiGA(GeneticAlgoritmConfig config)
        {
            Config = config;
            //IChromosome adamChromosome = new FloatingPointChromosome(config.MinChromosomeValue, config.MaxChromosomeValue, config.ChromosomeSize, config.ChromosomeFractionDigits);

            float       maxWidth       = 1000000;
            float       maxHeight      = 1000000;
            IChromosome adamChromosome = new FloatingPointChromosome(
                new double[] { 0, 0, 0, 0 },
                new double[] { maxWidth, maxHeight, maxWidth, maxHeight },
                new int[] { 64, 64, 64, 64 },
                new int[] { 2, 2, 2, 2 });

            Population population = new Population(config.MinPopulationSize, config.MinPopulationSize, adamChromosome);

            IFitness     fitness     = new SimpleFitness();
            ISelection   selection   = new EliteSelection();
            ICrossover   crossover   = new UniformCrossover(0.1f);
            IMutation    mutation    = new FlipBitMutation();
            ITermination termination = new FitnessStagnationTermination(config.StagnationGenerationCount);

            population.GenerationStrategy = new PerformanceGenerationStrategy();

            geneticAlgorithm = new GeneticAlgorithm(population, fitness, selection, crossover, mutation)
            {
                Termination = termination
            };

            geneticAlgorithm.CrossoverProbability = config.CrossoverProbability;
            geneticAlgorithm.MutationProbability  = config.MutationProbability;

            geneticAlgorithm.GenerationRan      += OnNewGeneration;
            geneticAlgorithm.TerminationReached += OnTermination;
            geneticAlgorithm.Start();
        }
コード例 #4
0
        public void HasReached_StagnantAndReachGenerationNumber_True()
        {
            var target = new FitnessStagnationTermination(3);
            var ga     = Substitute.For <IGeneticAlgorithm>();

            ga.BestChromosome.Returns(new ChromosomeStub()
            {
                Fitness = 0.2
            },
                                      new ChromosomeStub()
            {
                Fitness = 0.2
            },
                                      new ChromosomeStub()
            {
                Fitness = 0.3
            },
                                      new ChromosomeStub()
            {
                Fitness = 0.3
            },
                                      new ChromosomeStub()
            {
                Fitness = 0.3
            });

            Assert.IsFalse(target.HasReached(ga));
            Assert.IsFalse(target.HasReached(ga));
            Assert.IsFalse(target.HasReached(ga));
            Assert.IsFalse(target.HasReached(ga));
            Assert.IsTrue(target.HasReached(ga));
        }
コード例 #5
0
        public override ITermination CreateTermination()
        {
            var terminations = new TimeEvolvingTermination(TimeSpan.FromSeconds(this.settings.MaxOptimizationTimeSeconds));
            var fitnessStagnationTermination = new FitnessStagnationTermination(this.settings.MaxOptimizationStagnatingGenerations);

            return(new OrTermination(terminations, fitnessStagnationTermination));
        }
コード例 #6
0
        public void HasReached_StagnantButNotReachTheGenerationsNumber_False()
        {
            var target     = new FitnessStagnationTermination(4);
            var repository = new MockRepository();
            var ga         = repository.StrictMock <IGeneticAlgorithm>();

            using (repository.Ordered())
            {
                ga.Expect(g => g.BestChromosome).Return(new ChromosomeStub()
                {
                    Fitness = 0.1
                });
                ga.Expect(g => g.BestChromosome).Return(new ChromosomeStub()
                {
                    Fitness = 0.1
                });
                ga.Expect(g => g.BestChromosome).Return(new ChromosomeStub()
                {
                    Fitness = 0.1
                });
            }
            repository.ReplayAll();

            Assert.IsFalse(target.HasReached(ga));
            Assert.IsFalse(target.HasReached(ga));
            Assert.IsFalse(target.HasReached(ga));
        }
コード例 #7
0
        public ITermination FitnessStagnation()
        {
            var target = new FitnessStagnationTermination(2);
            var ga     = Substitute.For <IGeneticAlgorithm>();

            ga.BestChromosome.Returns(new TspChromosome(10)
            {
                Fitness = 1
            });
            target.HasReached(ga);
            target.HasReached(ga);

            return(target);
        }
コード例 #8
0
        public void Start_FloatingPoingChromosome_Evolved()
        {
            var chromosome = new FloatingPointChromosome(
                new double[] { 0, 0, 0, 0 },
                new double[] { 1000, 1000, 1000, 1000 },
                new int[] { 10, 10, 10, 10 },
                new int[] { 0, 0, 0, 0 });

            var population = new Population(25, 25, chromosome);

            var fitness = new FuncFitness((c) =>
            {
                var f = c as FloatingPointChromosome;

                var values = f.ToFloatingPoints();
                var x1     = values[0];
                var y1     = values[1];
                var x2     = values[2];
                var y2     = values[3];

                // Euclidean distance: https://en.wikipedia.org/wiki/Euclidean_distance
                return(Math.Sqrt(Math.Pow(x2 - x1, 2) + Math.Pow(y2 - y1, 2)));
            });

            var selection   = new EliteSelection();
            var crossover   = new UniformCrossover();
            var mutation    = new FlipBitMutation();
            var termination = new FitnessStagnationTermination(100);

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

            ga.Termination = termination;
            ga.Start();

            var bc     = ga.BestChromosome as FloatingPointChromosome;
            var points = bc.ToFloatingPoints();

            Assert.AreEqual(4, points.Length);

            Assert.AreEqual(1414.2135623730951, bc.Fitness);
            Assert.GreaterOrEqual(ga.GenerationsNumber, 100);
        }
コード例 #9
0
        public static GeneticAlgorithm GetGeneticAlgorithm()
        {
            var chromosome  = new ConfigurationChromosome();
            var population  = new Population(50, 100, chromosome);
            var fitness     = new CorrectPercentageFitness();
            var selection   = new EliteSelection();
            var crossover   = new UniformCrossover(0.5f);
            var mutation    = new FlipBitMutation();
            var termination = new FitnessStagnationTermination(100);

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

            return(ga);
        }
コード例 #10
0
        public void HasReached_StagnantButNotReachTheGenerationsNumber_False()
        {
            var target = new FitnessStagnationTermination(4);
            var ga     = Substitute.For <IGeneticAlgorithm>();

            ga.BestChromosome.Returns(
                new ChromosomeStub()
            {
                Fitness = 0.1
            },
                new ChromosomeStub()
            {
                Fitness = 0.1
            },
                new ChromosomeStub()
            {
                Fitness = 0.1
            });

            Assert.IsFalse(target.HasReached(ga));
            Assert.IsFalse(target.HasReached(ga));
            Assert.IsFalse(target.HasReached(ga));
        }
コード例 #11
0
ファイル: CPSetup.cs プロジェクト: guthx/ChinskiListonosz
        public CPSetup(int populationSize, string filename = "")
        {
            if (String.IsNullOrEmpty(filename))
            {
                Console.WriteLine("Podaj nazwę pliku z grafem: ");
                var builder = new StringBuilder();
                builder.Append("Data/");
                builder.Append(Console.ReadLine());
                filename = builder.ToString();
            }
            Graph = new Graph(@filename);
            int[] startValues = Graph.OddVertices.ToArray();
            Fitness     = new CPFitness();
            Chromosome  = new CPChromosome(startValues.Length, startValues, populationSize);
            Population  = new Population(populationSize, populationSize, Chromosome);
            Selection   = new EliteSelection();
            Crossover   = new CPCrossover();
            Mutation    = new CPMutation();
            Termination = new FitnessStagnationTermination(50);

            GA             = new GeneticAlgorithm(Population, Fitness, Selection, Crossover, Mutation);
            GA.Termination = Termination;
        }
コード例 #12
0
        public static FloatingPointChromosome EvolveGeneticAlgorithm(FloatingPointChromosome chromosome, IOthelloAgent agent, string chromosomeLabel = "")
        {
            IPopulation population = new TplPopulation(30, 60, chromosome);
            IFitness    fitness    = new EvaluationFitness(agent);
            ISelection  selection  = new RouletteWheelSelection(); //Guess
            ICrossover  crossover  = new UniformCrossover();       //Guess
            IMutation   mutation   = new UniformMutation();        //Guess


            ITermination stagnation = new FitnessStagnationTermination(500);
            ITermination threshold  = new FitnessThresholdTermination(.9);

            ITaskExecutor taskExecutor = new ParallelTaskExecutor()
            {
                MaxThreads = Environment.ProcessorCount,
                MinThreads = Environment.ProcessorCount / 2
            };


            GeneticAlgorithm algorithm = new GeneticAlgorithm(population, fitness, selection, crossover, mutation)
            {
                TaskExecutor        = new TplTaskExecutor(),
                MutationProbability = .2f
            };

            algorithm.TaskExecutor = taskExecutor;
            algorithm.Termination  = stagnation;

            algorithm.Start();

            SaveChromosome((FloatingPointChromosome)algorithm.BestChromosome, chromosomeLabel);

            Debug.WriteLine("finished Training, with {0} time spent on evolving", algorithm.TimeEvolving);
            Debug.WriteLine("fitness of this generation vs the last : {0}", algorithm.Fitness);

            return((FloatingPointChromosome)algorithm.BestChromosome);
        }
コード例 #13
0
        static void Main(string[] args)
        {
            string cadena;        //cadena leida por el usuario
            int    tam_cadena;    //tamaño de la cadena introducida
            string cadenana = ""; //cadena resultante generada por el algoritmo

            Console.WriteLine("Introduzca la cadena");
            cadena     = Console.ReadLine();
            cadena     = cadena.Trim();             //se eliminan espacios de la cadena introducida
            cadena     = cadena.ToLower();          //se pasa a minusculas todas las letras
            tam_cadena = cadena.Length;             //se obtiene le tamaño de la caden
            double[] min  = new double[tam_cadena]; //se generan
            double[] max  = new double[tam_cadena]; //rangos minimos y maximos para que trabaje el AG
            int[]    arr  = new int[tam_cadena];    //se generan los arreglos
            int[]    arr2 = new int[tam_cadena];    // de numero de digits , bits

            for (int i = 0; i < tam_cadena; i++)    //se debe de llenar una posicion del arreglo por cada gen(cada caracter de la cadena )
            {
                min[i]  = 97;                       //minimo -> a
                max[i]  = 122;                      //maximo -> z
                arr[i]  = 64;
                arr2[i] = 3;
            }
            var cromosoma = new FloatingPointChromosome(min, max, arr, arr2); //se instancia la nueva cromosoma

            var aptitud = new FuncFitness((c) => {                            //se define la funcion de aptitud
                var fc         = c as FloatingPointChromosome;
                var x          = fc.ToFloatingPoints();
                string cad_obt = "";
                double porcentaje;
                for (int i = 0; i < tam_cadena; i++)        //para cada gen
                {
                    cad_obt += (char)Convert.ToInt32(x[i]); //se debe de concatenar a la cadena obtenida, convirtiendo de float a int y despues
                }
                //casteando a caracter
                double dist = Math.Exp(-LevenshteinDistance(cadena, cad_obt, out porcentaje)); //se realiza el calculo
                return(1f / 1f + dist);                                                        //de la aptitud
            });
            var poblacion   = new Population(100, 1000, cromosoma);                            //se crea la poblacon con minimo 100 individuos y maximo 1000
            var cruza       = new UniformCrossover(0.3f);                                      //se define como se realizara la cruza
            var mutacion    = new FlipBitMutation();                                           //como se realizara la mutacion
            var seleccion   = new RouletteWheelSelection();                                    //se elige el metodo de seleccion a utilizar
            var terminacion = new FitnessStagnationTermination(1000);                          //se determina el parametro de termino para el algoritmo genetico
            //var ga = new GeneticSharp
            var ga = new GeneticAlgorithm(poblacion, aptitud, seleccion, cruza, mutacion);     //se crea el algoritmo genetico

            ga.Termination = terminacion;                                                      //se asigna la condicion de termino a el AG

            var latestFitness = 0.0;                                                           //variable para guardar fitness anterior

            ga.GenerationRan += (sender, e) =>                                                 //funcion para estar verificando como es que evoluciona el AG
            {
                var bestchromosome = ga.BestChromosome as FloatingPointChromosome;             //se obtiene la cromosoma
                var bestFitness    = bestchromosome.Fitness.Value;                             //se obtiene el fitness de la cromosoma

                if (bestFitness != latestFitness)                                              //se comprueba que el fitness actual sea distinto al anterior
                {
                    latestFitness = bestFitness;                                               //el anterior fitness se vuelve el mejor ahora, para asi comprobar que le fitness mejora
                    // var phenotype = bestchromosome.ToFloatingPoints();//se obtienen los valores que reprsenta la cromosoma

                    Console.WriteLine("Generation {0}", ga.GenerationsNumber); //se imprime el numero de generacion
                    // Console.WriteLine("X = {0}", bestchromosome.ToFloatingPoint());
                    var x = bestchromosome.ToFloatingPoints();                 //se obtienen los valores que reprsenta la cromosoma
                    cadenana = "";
                    for (int i = 0; i < tam_cadena; i++)                       //se obtiene el valor
                    {
                        cadenana += (char)Convert.ToInt32(x[i]);               // que representa el fenotipo en terminos de caracteres para
                    }
                    //formar la cadena resultante

                    //  Console.WriteLine("F(x) =  {0}", (char)((int)bestFitness));
                    Console.WriteLine("Palabra Obtenida " + cadenana);//imprime la mejor aproximacion hasta ahora
                }
            };
            ga.Start();                                                                             //se Inicia el AG
            Console.WriteLine("\nEjecucion Terminada \n");
            Console.WriteLine("La Mejor Aproximacion a la solucion encontrada es :\n " + cadenana); //se imprime la mejor solucion encontrada
            Console.ReadLine();                                                                     //esto es para hacer un pausa y se pueda ver el resultado tranquilamente
        }
コード例 #14
0
        private void Iniciar_Click(object sender, RoutedEventArgs e)
        {
            Bitmap bmpDest = new Bitmap(bmpObj.Width, bmpObj.Height);

            Int32[] solucion = new Int32[bmpObj.Width * bmpObj.Height];
            int     i        = 0;

            for (int y = 0; y < bmpObj.Height; y++)
            {
                for (int x = 0; x < bmpObj.Width; x++)
                {
                    System.Drawing.Color color = bmpObj.GetPixel(x, y);
                    solucion[i] = color.ToArgb();
                    i++;
                    //bmpDest.SetPixel(x, y, System.Drawing.Color.FromArgb(acolor));
                }
            }

            int tam = bmpObj.Width * bmpObj.Height;

            double[] minArray = new double[tam];
            double[] maxArray = new double[tam];
            int[]    bits     = new int[tam];
            int[]    b2       = new int[tam];
            for (int j = 0; j < tam; j++)
            {
                minArray[j] = -16777216;
                maxArray[j] = -1;
                bits[j]     = 64;
                b2[j]       = 0;
            }
            var chromosome = new FloatingPointChromosome(
                minArray,
                maxArray,
                bits,
                b2
                );

            var fitness = new FuncFitness((c) =>
            {
                var fc          = c as FloatingPointChromosome;
                double[] values = fc.ToFloatingPoints();
                //Int32[] valuesAux = new Int32[values.Length];
                //for (int b = 0; b < values.Length; b++) {
                //   valuesAux[b] = Convert.ToInt32(values[b]);
                //}
                double acum;
                acum = 0;
                for (int j = 0; j < values.Length; j++)
                {
                    byte[] bA  = BitConverter.GetBytes(Convert.ToInt32(values[j]));
                    byte[] bA2 = BitConverter.GetBytes(solucion[j]);
                    int ac     = 0;
                    for (int b = 0; b < 4; b++)
                    {
                        ac += Math.Abs(bA[b] - bA2[b]);
                    }
                    acum += ac;
                }
                if (acum == 0)
                {
                    return(Int32.MaxValue);
                }
                else
                {
                    return(1 / acum);
                }
            }
                                          );

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

            var selection   = new EliteSelection();
            var crossover   = new UniformCrossover(0.7f);
            var mutation    = new FlipBitMutation();
            var termination = new FitnessStagnationTermination(1000);

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

            ga.Termination = termination;



            var latestFitness = 0.0;

            ga.MutationProbability = 0.3f;
            ga.GenerationRan      += (a, b) =>
            {
                var bestChromosome = ga.BestChromosome as FloatingPointChromosome;
                var bestFitness    = bestChromosome.Fitness.Value;

                if (bestFitness != latestFitness)
                {
                    latestFitness = bestFitness;
                    var phenotype = bestChromosome.ToFloatingPoints();

                    Dispatcher.BeginInvoke((Action)(() =>
                    {
                        int pos = 0;
                        for (int y = 0; y < bmpObj.Height; y++)
                        {
                            for (int x = 0; x < bmpObj.Width; x++)
                            {
                                var aas = phenotype[pos];
                                bmpDest.SetPixel(x, y, System.Drawing.Color.FromArgb(Convert.ToInt32(phenotype[pos])));
                                pos++;
                            }
                        }
                        BitmapSource bs = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
                            bmpDest.GetHbitmap(),
                            IntPtr.Zero,
                            System.Windows.Int32Rect.Empty,
                            BitmapSizeOptions.FromWidthAndHeight(bmpDest.Width, bmpDest.Height));
                        ImageBrush ib = new ImageBrush(bs);
                        Destino.Source = bs;


                        //Resta
                        Bitmap resta = new Bitmap(bmpObj.Width, bmpObj.Height);
                        pos = 0;
                        for (int y = 0; y < bmpObj.Height; y++)
                        {
                            for (int x = 0; x < bmpObj.Width; x++)
                            {
                                if (phenotype[pos] - solucion[pos] != 0)
                                {
                                    resta.SetPixel(x, y,
                                                   System.Drawing.Color.FromArgb(-16777216)
                                                   );
                                }

                                pos++;
                            }
                        }
                        BitmapSource bs2 = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
                            resta.GetHbitmap(),
                            IntPtr.Zero,
                            System.Windows.Int32Rect.Empty,
                            BitmapSizeOptions.FromWidthAndHeight(bmpDest.Width, bmpDest.Height));
                        RestaM.Source = bs2;
                    }));
                }
            };

            Task.Run(() => {
                ga.Start();
            });
        }
コード例 #15
0
ファイル: Trainer.cs プロジェクト: tkhs-dev/Tetris
        public void Start(TrainerConfig config)
        {
            var dirInfo = "results/" + DateTime.Now.ToString("yyyy-MM-dd-HHmmss");

            logger.Info(config.ToString());
            logger.Info("Start training...");
            Stopwatch sw1 = new Stopwatch();
            Stopwatch sw2 = new Stopwatch();

            sw1.Start();
            var termination = new FitnessStagnationTermination(50);
            TetrisChromosome adamChromosome = initialChromosome ?? new TetrisChromosome();
            GeneticAlgorithm ga             = new GeneticAlgorithm(new TplPopulation(config.PopulationSize, config.PopulationSize * 2, adamChromosome)
            {
                GenerationStrategy = new PerformanceGenerationStrategy()
            }, new TetrisFitness(config.NumSample, config.MaxRound, config.UseVarianceOfFitness), new RouletteWheelSelection(), new TetrisCrossover(45, 0.8f, 0.2f), new UniformMutation())
            {
                OperatorsStrategy = new TplOperatorsStrategy()
            };

            ga.TimeEvolving.Add(initialTime);
            ga.Termination = termination;
            var terminationName = ga.Termination.GetType().Name;

            ga.CrossoverProbability = config.CrossoverProbability;
            ga.MutationProbability  = config.MutationProbability;
            ga.TaskExecutor         = new TplTaskExecutor()
            {
            };
            ga.GenerationRan += delegate
            {
                var time = sw2.Elapsed;
                if (ga.Population.GenerationsNumber % 1 == 0)
                {
                    var genResult = GenerationResult.Create(ga, time);
                    genResult.Save(dirInfo + "/generation_result", genResult.CreateFileName());
                    (ga.Population.BestChromosome as TetrisChromosome).GetParameter().Save(dirInfo, $"params-{genResult.Generation}.nnprm");
                }
                var bestChromosome = ga.Population.BestChromosome;
                logger.Info($"Termination: {terminationName}");
                logger.Info($"Generations: {ga.Population.GenerationsNumber + initialGeneration}");
                logger.Info($"Fitness: {bestChromosome.Fitness}");
                logger.Info($"Time:{time}");
                logger.Info($"EvolvingTime: {ga.TimeEvolving}");
                logger.Info($"Speed (gen/sec): {ga.Population.GenerationsNumber / ga.TimeEvolving.TotalSeconds}");

                sw2.Restart();
                logger.Info($"Start Generation {ga.GenerationsNumber + initialGeneration}....");
            };
            ga.TerminationReached += delegate
            {
                var total_time = sw1.Elapsed;
                sw1.Stop();
                sw2.Stop();
                var param = (ga.Population.BestChromosome as TetrisChromosome).GetParameter();
                logger.Info("Training Finished!!");
                logger.Info($"TotalGeneration:{ga.GenerationsNumber}");
                logger.Info($"Time:{total_time}");
                logger.Info("-----Result-----");
                logger.Info(param.MiddleLayerWeight);
                logger.Info(param.OutputLayerWeight);
            };
            logger.Info($"Start Generation {ga.GenerationsNumber + initialGeneration}....");
            sw2.Start();
            ga.Start();
        }
コード例 #16
0
        static void Main(string[] args)
        {
            float largMax = 998f; //largura maxima ou maxWidht do retângulo
            float altMax  = 680f; //altura maxima ou maxHeight do retângulo


            var cromossomo = new FloatingPointChromosome //Criando um cromossomo de distância euclidiana
                             (
                new double[] { 0, 0, 0, 0 },
                new double[] { largMax, altMax, largMax, altMax },
                new int[] { 10, 10, 10, 10 },
                new int[] { 0, 0, 0, 0 }
                             );

            var population = new Population(50, 100, cromossomo); // população, de no minimo 50 e no maximo 100, criada usando o cromossomo

            var fitness = new FuncFitness((c) =>                  // criando uma função fitness
            {
                var fc = c as FloatingPointChromosome;

                var valores = fc.ToFloatingPoints();
                var x1      = valores[0];
                var y1      = valores[1];
                var x2      = valores[2];
                var y2      = valores[3];

                return(Math.Sqrt(Math.Pow(x2 - x1, 2) + Math.Pow(y2 - y1, 2))); //retorno
            });

            var peneira = new EliteSelection();                                                   // seletor "peneira" do tipo ELITE ou seja só os melhores passarão >>>> Besides this, you can use the already implemented classic selections: Elite, Roulete Wheel, Stochastic Universal Sampling and Tournament.

            var crossover = new UniformCrossover(0.5f);                                           // aqui ocorre a união dos cromossomos para gerar novas possibilidades de soluções da proxima geração

            var mutacao = new FlipBitMutation();                                                  // classe de mutação

            var terminator = new FitnessStagnationTermination(100);                               // essa parte passa uma "régua" no cromossomo e para de executar quando ele gera o melhor cromossomo 100 vezes.

            var creator = new GeneticAlgorithm(population, fitness, peneira, crossover, mutacao); // instaciei o algoritmo genetico>>>>

            creator.Termination = terminator;                                                     // parametros de terminação passados atraves do terminator

            //creator.Start();// mando ele iniciar o algoritmo daqui pra baixo da pra apagar que vai funcionar

            Console.WriteLine("Generation: (x1, y1), (x2, y2) = distance");

            var latestFitness = 0.0;

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

                if (bestFitness != latestFitness)
                {
                    latestFitness = bestFitness;
                    var phenotype = bestChromosome.ToFloatingPoints();

                    Console.WriteLine(
                        "Generation {0,2}: ({1},{2}),({3},{4}) = {5}",
                        creator.GenerationsNumber,
                        phenotype[0],
                        phenotype[1],
                        phenotype[2],
                        phenotype[3],
                        bestFitness
                        );
                }
            };

            creator.Start();

            Console.ReadKey();
        }
コード例 #17
0
        private void EvolveGeneticStrategyButton_Click(object sender, RoutedEventArgs e)
        {
            OutputTextBlock.Text = "Evolving...";

            Task.Run(() =>
            {
                var chromosome = new BlackjackChromosome();
                var fitness    = new BlackjackFitness();
                var population = new Population(Settings.GeneticSettings.MinPopulationSize, Settings.GeneticSettings.MaxPopulationSize, chromosome);

                ISelection selection;

                switch (Settings.GeneticSettings.SelectionType)
                {
                case SelectionType.Elite:
                    selection = new EliteSelection();
                    break;

                case SelectionType.RouletteWheel:
                    selection = new RouletteWheelSelection();
                    break;

                case SelectionType.StochasticUniversalSampling:
                    selection = new StochasticUniversalSamplingSelection();
                    break;

                case SelectionType.Tournament:
                    selection = new TournamentSelection(Settings.GeneticSettings.TournamentSize);
                    break;

                default:
                    throw new InvalidOperationException();
                }

                ICrossover crossover;

                switch (Settings.GeneticSettings.CrossoverType)
                {
                case CrossoverType.AlternatingPosition:
                    crossover = new AlternatingPositionCrossover();
                    break;

                case CrossoverType.CutAndSplice:
                    crossover = new CutAndSpliceCrossover();
                    break;

                case CrossoverType.Cycle:
                    crossover = new CycleCrossover();
                    break;

                case CrossoverType.OnePoint:
                    crossover = new OnePointCrossover();
                    break;

                case CrossoverType.TwoPoint:
                    crossover = new TwoPointCrossover();
                    break;

                case CrossoverType.OrderBased:
                    crossover = new OrderBasedCrossover();
                    break;

                case CrossoverType.Ordered:
                    crossover = new OrderedCrossover();
                    break;

                case CrossoverType.PartiallyMapped:
                    crossover = new PartiallyMappedCrossover();
                    break;

                case CrossoverType.PositionBased:
                    crossover = new PositionBasedCrossover();
                    break;

                case CrossoverType.ThreeParent:
                    crossover = new ThreeParentCrossover();
                    break;

                case CrossoverType.Uniform:
                    crossover = new UniformCrossover(Settings.Current.GeneticSettings.MixProbability);
                    break;

                case CrossoverType.VotingRecombination:
                    crossover = new VotingRecombinationCrossover();
                    break;

                default:
                    throw new InvalidOperationException();
                }

                var mutation     = new UniformMutation();
                var termination  = new FitnessStagnationTermination(Settings.Current.GeneticSettings.NumStagnantGenerations);
                var taskExecutor = new ParallelTaskExecutor();

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

                ga.Termination          = termination;
                ga.TaskExecutor         = taskExecutor;
                ga.MutationProbability  = Settings.GeneticSettings.MutationProbability;
                ga.CrossoverProbability = Settings.GeneticSettings.CrossoverProbability;

                var latestFitness = double.MinValue;

                ga.GenerationRan += (s, o) =>
                {
                    geneticStrategy = (IStrategy)ga.BestChromosome;

                    var generationNumber = ga.GenerationsNumber;
                    var bestFitness      = ga.BestChromosome.Fitness.Value;
                    var avgFitness       = ga.Population.CurrentGeneration.Chromosomes.Average(c => c.Fitness.Value);

                    Dispatcher.Invoke(() =>
                    {
                        if (generationNumber == 1)
                        {
                            OutputTextBlock.Text = string.Empty;
                        }

                        OutputTextBlock.Text = $"Gen: {generationNumber}\tFit: {bestFitness}\tAvg: {avgFitness.ToString("0")}\n" + OutputTextBlock.Text;

                        if (bestFitness != latestFitness)
                        {
                            latestFitness = bestFitness;

                            var savedImageName = Settings.Current.GeneticSettings.SaveImagePerGeneration ? "gen" + generationNumber : null;

                            StrategyViewer.Draw(GeneticStrategyCanvas, geneticStrategy, $"Best from generation {generationNumber}", savedImageName);
                        }
                    }, DispatcherPriority.Background);
                };

                ga.TerminationReached += (s, o) =>
                {
                    Dispatcher.Invoke(() =>
                    {
                        OutputTextBlock.Text = "Termination reached.\n" + OutputTextBlock.Text;
                        TestGeneticStrategyButton.IsEnabled = true;
                    }, DispatcherPriority.Background);
                };

                ga.Start();
            });
        }
コード例 #18
0
        static void Main(string[] args)
        {
            TestData.GetData(out var servers, out var services);

            var chromosome = new MyChromosome(servers, services);

            var populationSize = 9;
            var population     = new Population(populationSize, populationSize, chromosome);

            var fitness = new FuncFitness((c) =>
            {
                var mc = (MyChromosome)c;

                var genes   = mc.GetGenes();
                var servers = genes.Select(x => (Server)x.Value).ToList();

                var freeServersTerm     = servers.Count(x => x.IsFree) * 2.5;
                var negativeHddFreeTerm = servers.Where(x => x.HddFree < 0).Select(x => x.HddFree * 3).Sum();
                var positiveHddFreeTerm = servers.Where(x => x.HddFree > 0).Select(x => x.HddFree * 0.2).Sum();
                var negativeRamFreeTerm = servers.Where(x => x.RamFree < 0).Select(x => x.RamFree * 3).Sum();
                var positiveRamFreeTerm = servers.Where(x => x.RamFree > 0).Select(x => x.RamFree * 0.2).Sum();
                var negativeCpuFreeTerm = servers.Where(x => x.CpuFree < 0).Select(x => x.CpuFree * 3).Sum();
                var positiveCpuFreeTerm = servers.Where(x => x.CpuFree > 0).Select(x => x.CpuFree * 0.2).Sum();

                var fitness = freeServersTerm + negativeHddFreeTerm + positiveHddFreeTerm + negativeRamFreeTerm +
                              positiveRamFreeTerm + negativeCpuFreeTerm + positiveCpuFreeTerm;

                //по каждому серверу нужно вычислить коэффициент заполненности
                var serversFill = new List <double>();
                foreach (var server in servers)
                {
                    var serverFill = ((server.HddFull - server.HddFree) / server.HddFull) * 0.2 +
                                     ((server.RamFull - server.RamFree) / server.RamFull) * 0.4 +
                                     ((server.CpuFull - server.CpuFree) / server.CpuFull) * 0.4;
                    serversFill.Add(serverFill);
                }
                serversFill = serversFill.OrderByDescending(x => x).ToList();
                //отладочная строка
                //var serversFill = new List<double> { 0.9d, 0.9d, 0.6d, 0.2d,0 };
                //среднее значение заполненности серверов
                var averageFill = serversFill.Sum() / servers.Count();
                //рассчитаем дисперсию у serversFill
                var dispersion = serversFill.Select(eachFill => (eachFill - averageFill) * (eachFill - averageFill)).Sum() / servers.Count;

                return((dispersion * 3) + fitness);
            });

            var selection = new EliteSelection();
            //сделал свой кроссовер, похожий на UniformCrossover
            var crossover = new MyCrossover();
            //строка для отладки кроссовера
            //crossover.Cross(new List<IChromosome> {chromosome.CreateNew(), chromosome.CreateNew()});

            var mutation = new MyMutation();
            //mutation.Mutate(chromosome, Single.Epsilon);

            var termination = new FitnessStagnationTermination(100);

            var ga = new GeneticSharp.Domain.GeneticAlgorithm(
                population,
                fitness,
                selection,
                crossover,
                mutation)
            {
                Termination         = termination,
                MutationProbability = 0.3f
            };

            var latestFitness = 0.0;

            ga.GenerationRan += (sender, e) =>
            {
                var ga = (GeneticSharp.Domain.GeneticAlgorithm)sender;
                Console.Write("Номер итерации: " + ga.GenerationsNumber + "  " + "Время работы: " + ga.TimeEvolving);
                Console.WriteLine();

                var bestChromosome = ga.BestChromosome as MyChromosome;
                var bestFitness    = bestChromosome.Fitness.Value;

                if (bestFitness != latestFitness)
                {
                    latestFitness = bestFitness;
                    var phenotype = bestChromosome.GetGenes()
                                    .Select(x => (Server)x.Value).ToList();

                    Console.Write("Фитнес: " + bestFitness);
                    Console.WriteLine();

                    foreach (var server in phenotype)
                    {
                        Console.Write("Сервер: " + server.Name +
                                      ", HddFull: " + server.HddFull +
                                      ", RamFull: " + server.RamFull +
                                      ", HddFree: " + server.HddFree +
                                      ", RamFree: " + server.RamFree +
                                      ", CpuFree: " + server.CpuFree +
                                      ", сервисы: ");
                        Console.Write(" Заполненность Hdd: " + Math.Round(100 - (server.HddFree / server.HddFull * 100)) + "%");
                        Console.Write(" Заполненность Ram: " + Math.Round(100 - (server.RamFree / server.RamFull * 100)) + "%");
                        Console.Write(" Заполненность Cpu: " + Math.Round(100 - server.CpuFree) + "%");
                        foreach (var service in server.Services)
                        {
                            Console.Write(service.Name + ", ");
                        }
                        Console.WriteLine();
                        Console.WriteLine();

                        //получить хромосомы на этой итерации и смотреть, равны ли они.
                        //Хромосомы равны, если равны их фитнесы.
                        //Если равны, алгоритм преждевременно сходится (вырождается популяция)
                        var chromosomesFitnessCollection = ga.Population.CurrentGeneration.Chromosomes;
                    }
                }
            };

            ga.Start();
        }
コード例 #19
0
        public void TestMethod1()
        {
            float maxWidth  = 998f;
            float maxHeight = 680f;

            var chromosome = new FloatingPointChromosome(
                new double[] { 0, 0, 0, 0 },
                new double[] { maxWidth, maxHeight, maxWidth, maxHeight },
                new int[] { 10, 10, 10, 10 },
                new int[] { 0, 0, 0, 0 });

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

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

                var values = fc.ToFloatingPoints();
                var x1     = values[0];
                var y1     = values[1];
                var x2     = values[2];
                var y2     = values[3];

                return(Math.Sqrt(Math.Pow(x2 - x1, 2) + Math.Pow(y2 - y1, 2)));
            });

            var selection   = new EliteSelection();
            var crossover   = new UniformCrossover(0.5f);
            var mutation    = new FlipBitMutation();
            var termination = new FitnessStagnationTermination(100);

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

            ga.Termination = termination;

            Console.WriteLine("Generation: (x1, y1), (x2, y2) = distance");

            var latestFitness = 0.0;

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

                if (bestFitness != latestFitness)
                {
                    latestFitness = bestFitness;
                    var phenotype = bestChromosome.ToFloatingPoints();

                    Trace.WriteLine(string.Format(
                                        "Generation {0,2}: ({1},{2}),({3},{4}) = {5}",
                                        ga.GenerationsNumber,
                                        phenotype[0],
                                        phenotype[1],
                                        phenotype[2],
                                        phenotype[3],
                                        bestFitness
                                        ));
                }
            };

            ga.Start();
        }
コード例 #20
0
        static void Main(string[] args)
        {
            float maxWidth  = 998f;
            float maxHeight = 680f;

            var chromosome = new FloatingPointChromosome(
                new double[] { 0, 0, 0, 0 },
                new double[] { maxWidth, maxHeight, maxWidth, maxHeight },
                new int[] { 10, 10, 10, 10 },
                new int[] { 0, 0, 0, 0 });
            var population = new Population(50, 100, chromosome);
            var fitness    = new FuncFitness((c) =>
            {
                var fc = c as FloatingPointChromosome;

                var values = fc.ToFloatingPoints();
                var x1     = values[0];
                var y1     = values[1];
                var x2     = values[2];
                var y2     = values[3];

                return(Math.Sqrt(Math.Pow(x2 - x1, 2) + Math.Pow(y2 - y1, 2)));
            });
            //TODO посмотреть, сколькл хромосом из общего числа выбрано
            var selection   = new EliteSelection();
            var crossover   = new UniformCrossover(0.5f);
            var mutation    = new FlipBitMutation();
            var termination = new FitnessStagnationTermination(100);

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

            ga.Termination = termination;

            Console.WriteLine("Generation: (x1, y1), (x2, y2) = distance");

            var latestFitness = 0.0;

            ga.GenerationRan += (sender, e) =>
            {
                var bestChromosome = ga.BestChromosome as FloatingPointChromosome;
                var bestFitness    = bestChromosome.Fitness.Value;
                //TODO если фитнес равна нулю, мы ее можем записывать

                if (bestFitness != latestFitness)
                {
                    latestFitness = bestFitness;
                    var phenotype = bestChromosome.ToFloatingPoints();

                    Console.WriteLine(
                        "Generation {0,2}: ({1},{2}),({3},{4}) = {5}",
                        ga.GenerationsNumber,
                        phenotype[0],
                        phenotype[1],
                        phenotype[2],
                        phenotype[3],
                        bestFitness
                        );
                }
            };

            ga.Start();

            Console.ReadKey();
        }
コード例 #21
0
        private void btnStart_Click(object sender, EventArgs e)
        {
            Models.Instance i = new Models.Instance();
            i.Days    = 7;
            i.Doctors = doctors;

            int min = (int)numMin.Value;
            int max = (int)numMax.Value;

            var        chromosome = new Models.Chromosome(21, i, r);
            var        population = new Population(min, max, chromosome);
            var        fitness    = new Models.Fitness();
            IMutation  mutation   = new TworsMutation();
            ISelection selection  = new RouletteWheelSelection();
            ICrossover crossover  = new OnePointCrossover(r.Next(20));

            if (cbxMutation.SelectedItem.ToString() == "Insertion")
            {
                mutation = new InsertionMutation();
            }
            else if (cbxMutation.SelectedItem.ToString() == "Partial Shuffle")
            {
                mutation = new PartialShuffleMutation();
            }
            else if (cbxMutation.SelectedItem.ToString() == "Reverse Sequence")
            {
                mutation = new ReverseSequenceMutation();
            }

            if (cbxSelection.SelectedItem.ToString() == "Elitizam")
            {
                selection = new EliteSelection();
            }

            if (cbxCrossover.SelectedItem.ToString() == "Two-point")
            {
                int p1 = r.Next(19);
                int p2 = r.Next(p1 + 1, 20);
                crossover = new TwoPointCrossover(p1, p2);
            }
            else if (cbxCrossover.SelectedItem.ToString() == "Uniform")
            {
                crossover = new UniformCrossover();
            }

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

            ITermination termination = new FitnessStagnationTermination(50);

            if (cbxTermination.SelectedItem.ToString() == "Generation number")
            {
                termination = new GenerationNumberTermination(200);
            }

            ga.Termination = termination;

            ga.MutationProbability = (float)numProbability.Value;

            ga.Start();

            Gene[] g = ga.BestChromosome.GetGenes();

            dataView.Rows.Clear();
            for (int j = 0; j < 7; j++)
            {
                string[] row = new string[] { ((List <int>)g[j * 3].Value)[0].ToString() + "   " + ((List <int>)g[j * 3].Value)[1].ToString(),
                                              ((List <int>)g[j * 3 + 1].Value)[0].ToString() + "   " + ((List <int>)g[j * 3 + 1].Value)[1].ToString(),
                                              ((List <int>)g[j * 3 + 2].Value)[0].ToString() + "   " + ((List <int>)g[j * 3 + 2].Value)[1].ToString() };

                dataView.Rows.Add(row);
                dataView.Rows[j].HeaderCell.Value = (j + 1).ToString();
            }

            lblFitness.Text = ga.BestChromosome.Fitness.ToString() + "  , generacija broj " + ga.GenerationsNumber.ToString();
        }
コード例 #22
0
        public static void Main(string[] args)
        {
            //Inicjujemy zmienne które będą granicznymi wartościami dla naszych punktów x1,x2,y1,y2.
            double maxWidth = 9999;

            double maxHeight = 8765;

            //Tworzymy strukture pojedyńczego chormosomu
            var chromosome = new FloatingPointChromosome(
                new double[] { -1000, -1000, -1000, -1000 },               //Warości początkowe dla x1,x2,y1,y2
                new double[] { maxWidth, maxHeight, maxWidth, maxHeight }, //Wartości maksymalne dla x1,x2,y1,y2
                new int[] { 64, 64, 64, 64 },                              //Liczba bitów użytych do uzyskania wyniku
                new int[] { 0, 0, 0, 0 });

            var population = new Population(10, 50, chromosome);            //Określamy ilość chromosomów
            //(x,y,chromosome) x=minimalna liczba chromosomów, y=maksymalna liczba chormosomów
            //chromosome=odniesienie się do wyżej utworzonego chromosomu



            var fitness = new FuncFitness((c) =>                                //Implementacja funkcji fitness z chormosomem w zmiennej "c"
            {
                var fc = c as FloatingPointChromosome;                          //Rzutowanie powyższego chormosomu na FloatingPointChromosme

                var values = fc.ToFloatingPoints();                             //konwertowanie FloatingPointChromosome do jego fenotypu

                var x1 = values[0];                                             //konwertowanie FloatingPointChromosome do jego fenotypu x1

                var y1 = values[1];                                             //konwertowanie FloatingPointChromosome do jego fenotypu y1

                var x2 = values[2];                                             //konwertowanie FloatingPointChromosome do jego fenotypu x2

                var y2 = values[3];                                             //konwertowanie FloatingPointChromosome do jego fenotypu y2

                return(Math.Sqrt(Math.Pow(x2 - x1, 2) + Math.Pow(y2 - y1, 2))); //Przekazanie wartości do naszej funkcji
            });

            var selection = new EliteSelection();             //Selekcja odpowiada za wybór chormosomów o największym dystanisie

            var crossover = new UniformCrossover(0.5f);       //Ta sekcja pozwala na krzyżowanie się chromosomów aby generować nowe rozwiązania dla kolejnej generacji
            //Potomstwo przy parametrze 0.5 posiada mniej więcej połowę genów rodziców.

            var mutation = new FlipBitMutation();            //Mutacja uniemożliwa "utknięcie" naszego algorytmu w optimum lokalnym, mutacja Flip-Bit lodowo wybiera
            //gen i odwraca jego wartości, gen o wartości 1 stanie się genem o wartości 0

            var termination = new FitnessStagnationTermination(1000);            //Warunek zakończenia działania algorytmu
            //Jeżeli nasz program wygeneruje w ciągu 1000 pokoleń taką samą wartość funkcji fitness to działanie programu zostanie zakończone.

            //Poniższy fragment odpowiada ze wywołanie zdefiniowanych przez nas wartości komenda ga.Start() spodowuje rozpoczęcie działania funkcji
            var ga = new GeneticAlgorithm(
                population,
                fitness,
                selection,
                crossover,
                mutation);

            ga.Termination = termination;
            //Cały poniższy blok kodu podowuje wyświetlenie kolejnych kroków wyliczania AG na ekranie konsoli
            Console.WriteLine("Generation: (x1, y1), (x2, y2) = distance");

            var latestFitness = 0.0;

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

                if (bestFitness != latestFitness)
                {
                    latestFitness = bestFitness;
                    var phenotype = bestChromosome.ToFloatingPoints();

                    Console.WriteLine(
                        "Generation {0,2}: (X1={1},Y1={2}),(X2={3},Y2={4}) = Największy dystans między punktami {5}",
                        ga.GenerationsNumber,
                        phenotype[0],
                        phenotype[1],
                        phenotype[2],
                        phenotype[3],
                        bestFitness
                        );
                }
            };

            ga.Start();

            Console.ReadKey();
        }
コード例 #23
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();
        }
コード例 #24
0
        private static IAlgoritmo CriaAlgoritmoGenetico(Dictionary <string, string[]> dict, List <string> flat, Problema problema)
        {
            int         populacaoMin, populacaoMax;
            IPopulation population;

            ISelection   selection;
            ICrossover   crossover;
            IMutation    mutation;
            ITermination termination;
            IReinsertion reinsertion;
            float        crossoverProbability, mutationProbability;



            var p = dict.ValueOrDefault("p", "50,100").Split(new[] { ',' });

            if (p.Length != 2 || !int.TryParse(p[0], out populacaoMin) || !int.TryParse(p[1], out populacaoMax))
            {
                throw new ArgumentException("Faixa de população inválida.");
            }

            population = new Population(populacaoMin, populacaoMax, new CromossomoViajante(problema.Mapa.Locais.Count));

            switch (dict.ValueOrDefault("s", "t"))
            {
            case "e":
                selection = new EliteSelection();
                break;

            case "r":
                selection = new RouletteWheelSelection();
                break;

            case "s":
                selection = new StochasticUniversalSamplingSelection();
                break;

            case "t":
                selection = new TournamentSelection();
                break;

            default:
                throw new ArgumentException("Seleção inválida.");
            }

            switch (dict.ValueOrDefault("c", "o"))
            {
            case "s":
                crossover = new CutAndSpliceCrossover();
                break;

            case "c":
                crossover = new CycleCrossover();
                break;

            case "o":
                crossover = new OrderedCrossover();
                break;

            case "ob":
                crossover = new OrderBasedCrossover();
                break;

            case "op":
                crossover = new OnePointCrossover();
                break;

            case "pm":
                crossover = new PartiallyMappedCrossover();
                break;

            case "p":
                crossover = new PositionBasedCrossover();
                break;

            case "tpa":
                crossover = new ThreeParentCrossover();
                break;

            case "tp":
                crossover = new TwoPointCrossover();
                break;

            case "u":
                crossover = new UniformCrossover();
                break;

            default:
                throw new ArgumentException("Crossover inválido.");
            }

            switch (dict.ValueOrDefault("m", "r"))
            {
            case "d":
                mutation = new DisplacementMutation();
                break;

            case "f":
                mutation = new FlipBitMutation();
                break;

            case "i":
                mutation = new InsertionMutation();
                break;

            case "s":
                mutation = new PartialShuffleMutation();
                break;

            case "r":
                mutation = new ReverseSequenceMutation();
                break;

            case "t":
                mutation = new TworsMutation();
                break;

            case "u":
                mutation = new UniformMutation();
                break;

            default:
                throw new ArgumentException("Mutação inválida.");
            }

            switch (dict.ValueOrDefault("t", "s"))
            {
            case "s":
                termination = new FitnessStagnationTermination();
                break;

            case "t":
                termination = new FitnessThresholdTermination();
                break;

            case "g":
                termination = new GenerationNumberTermination();
                break;

            default:
                throw new ArgumentException("Terminação inválida.");
            }

            switch (dict.ValueOrDefault("e", "e"))
            {
            case "e":
                reinsertion = new ElitistReinsertion();
                break;

            case "p":
                reinsertion = new PureReinsertion();
                break;

            case "u":
                reinsertion = new UniformReinsertion();
                break;

            default:
                throw new ArgumentException("Reinserção inválida.");
            }

            if (!float.TryParse(dict.ValueOrDefault("cp", "0,75"), out crossoverProbability))
            {
                throw new ArgumentException("Probabilidade de crossover inválida.");
            }

            if (!float.TryParse(dict.ValueOrDefault("mp", "0,25"), out mutationProbability))
            {
                throw new ArgumentException("Probabilidade de mutação inválida.");
            }


            return(new AlgoritmoGenetico(problema, population, selection, crossover, crossoverProbability, mutation, mutationProbability, termination, reinsertion));
        }
コード例 #25
0
ファイル: Basic.cs プロジェクト: majasinski/Evo
        public static DynamoGeneticAlgorithm CreateGeneticAlgorithm(Population population,
                                                                    [DefaultArgument("Evo.DynamoGeneticAlgorithm.Default()")] object selection,
                                                                    [DefaultArgument("Evo.DynamoGeneticAlgorithm.Default()")] object crossover,
                                                                    [DefaultArgument("Evo.DynamoGeneticAlgorithm.Default()")] object mutation,
                                                                    [DefaultArgument("Evo.DynamoGeneticAlgorithm.Default()")] object termination,
                                                                    [DefaultArgument("Evo.DynamoGeneticAlgorithm.Default()")] int?selectionSize,
                                                                    double crossoverProbability = DynamoGeneticAlgorithm.DefaultCrossoverProbability,
                                                                    double mutationProbability  = DynamoGeneticAlgorithm.DefaultMutationProbability)
        {
            IChromosome    exemplaryChromome = population.CurrentGeneration.Chromosomes[0];
            ChromosomeType chromosomeType    = 0;

            if (exemplaryChromome is BinaryChromosome)
            {
                chromosomeType = ((BinaryChromosome)exemplaryChromome).ChromosomeType;
            }
            else if (exemplaryChromome is CombinatorialChromosome)
            {
                chromosomeType = ((CombinatorialChromosome)exemplaryChromome).ChromosomeType;
            }
            else if (exemplaryChromome is DoubleChromosome)
            {
                chromosomeType = ((DoubleChromosome)exemplaryChromome).ChromosomeType;
            }

            ISelection selectionMethod = null;

            if (selection == null)
            {
                selectionMethod = new EliteSelection();
            }
            else
            {
                if (selection is EliteSelection)
                {
                    selectionMethod = selection as EliteSelection;
                }
                else if (selection is RouletteWheelSelection)
                {
                    selectionMethod = selection as RouletteWheelSelection;
                }
                else if (selection is StochasticUniversalSamplingSelection)
                {
                    selectionMethod = selection as StochasticUniversalSamplingSelection;
                }
                else if (selection is TournamentSelection)
                {
                    selectionMethod = selection as TournamentSelection;
                }
                else
                {
                    throw new CrossoverException("Invalid selection input. A valid object returned by a node of the Selections category should be used.");
                }
            }

            ICrossover crossoverMethod = null;

            if (crossover == null)
            {
                crossoverMethod = new UniformCrossover(0.5f);
            }
            else
            {
                if (crossover is AlternatingPositionCrossover)
                {
                    if (chromosomeType != ChromosomeType.CombinatorialChromosome)
                    {
                        throw new CrossoverException("The Alternating-position Crossover (AP) can be only used with combinatorial chromosomes. The specified individuals are not combinatorial chromosomes.");
                    }
                    crossoverMethod = crossover as AlternatingPositionCrossover;
                }
                else if (crossover is CutAndSpliceCrossover)
                {
                    if (chromosomeType == ChromosomeType.DoubleChromosome)
                    {
                        throw new CrossoverException("The Cut and Splice Crossover (AP) can be only used with binary and combinatorial chromosomes. The specified individuals are double chromosomes.");
                    }
                    crossoverMethod = crossover as CutAndSpliceCrossover;
                }
                else if (crossover is CycleCrossover)
                {
                    if (chromosomeType != ChromosomeType.CombinatorialChromosome)
                    {
                        throw new CrossoverException("The Cycle Crossover (CX) can be only used with combinatorial chromosomes. The specified individuals are not combinatorial chromosomes.");
                    }
                    crossoverMethod = crossover as CycleCrossover;
                }
                else if (crossover is OnePointCrossover)
                {
                    if (chromosomeType == ChromosomeType.DoubleChromosome)
                    {
                        throw new CrossoverException("The One-point Crossover can be only used with binary and combinatorial chromosomes. The specified individuals are double chromosomes.");
                    }
                    crossoverMethod = crossover as OnePointCrossover;
                }
                else if (crossover is OrderBasedCrossover)
                {
                    if (chromosomeType != ChromosomeType.CombinatorialChromosome)
                    {
                        throw new CrossoverException("The Order Based Crossover (OX2) can be only used with combinatorial chromosomes. The specified individuals are not combinatorial chromosomes.");
                    }
                    crossoverMethod = crossover as OrderBasedCrossover;
                }
                else if (crossover is OrderedCrossover)
                {
                    if (chromosomeType != ChromosomeType.CombinatorialChromosome)
                    {
                        throw new CrossoverException("The Ordered Crossover (OX1) can be only used with combinatorial chromosomes. The specified individuals are not combinatorial chromosomes.");
                    }
                    crossoverMethod = crossover as OrderedCrossover;
                }
                else if (crossover is PartiallyMappedCrossover)
                {
                    if (chromosomeType != ChromosomeType.CombinatorialChromosome)
                    {
                        throw new CrossoverException("The Partially-mapped Crossover (PMX) can be only used with combinatorial chromosomes. The specified individuals are not combinatorial chromosomes.");
                    }
                    crossoverMethod = crossover as PartiallyMappedCrossover;
                }
                else if (crossover is PositionBasedCrossover)
                {
                    if (chromosomeType != ChromosomeType.CombinatorialChromosome)
                    {
                        throw new CrossoverException("The Position Based Crossover (POS) can be only used with combinatorial chromosomes. The specified individuals are not combinatorial chromosomes.");
                    }
                    crossoverMethod = crossover as PositionBasedCrossover;
                }
                else if (crossover is SimulatedBinaryCrossover)
                {
                    if (chromosomeType != ChromosomeType.DoubleChromosome)
                    {
                        throw new CrossoverException("The Simulated Binary Crossover (SBX) can be only used with double chromosomes. The specified individuals are not double chromosomes.");
                    }
                    crossoverMethod = crossover as SimulatedBinaryCrossover;
                }
                else if (crossover is ThreeParentCrossover)
                {
                    if (chromosomeType == ChromosomeType.DoubleChromosome)
                    {
                        throw new CrossoverException("The Three-parent Crossover can be only used with binary and combinatorial chromosomes. The specified individuals are double chromosomes.");
                    }
                    crossoverMethod = crossover as ThreeParentCrossover;
                }
                else if (crossover is TwoPointCrossover)
                {
                    if (chromosomeType == ChromosomeType.DoubleChromosome)
                    {
                        throw new CrossoverException("The Two-point Crossover can be only used with binary and combinatorial chromosomes. The specified individuals are double chromosomes.");
                    }
                    crossoverMethod = crossover as TwoPointCrossover;
                }
                else if (crossover is UniformCrossover)
                {
                    if (chromosomeType == ChromosomeType.DoubleChromosome)
                    {
                        throw new CrossoverException("The Uniform Crossover can be only used with binary and combinatorial chromosomes. The specified individuals are double chromosomes.");
                    }
                    crossoverMethod = crossover as UniformCrossover;
                }
                else if (crossover is VotingRecombinationCrossover)
                {
                    if (chromosomeType == ChromosomeType.DoubleChromosome)
                    {
                        throw new CrossoverException("The Voting Recombination Crossover (VR) can be only used with binary and combinatorial chromosomes. The specified individuals are double chromosomes.");
                    }
                    crossoverMethod = crossover as VotingRecombinationCrossover;
                }
                else
                {
                    throw new CrossoverException("Invalid crossover input. A valid object returned by a node of the Crossovers category should be used.");
                }
            }

            IMutation mutationMethod = null;

            if (mutation == null)
            {
                mutationMethod = new FlipBitMutation();
            }
            else
            {
                if (mutation is DisplacementMutation)
                {
                    if (chromosomeType == ChromosomeType.DoubleChromosome)
                    {
                        throw new CrossoverException("The Displacement Mutation can be only used on binary and combinatorial chromosomes. The specified individuals are double chromosomes.");
                    }
                    mutationMethod = mutation as DisplacementMutation;
                }
                else if (mutation is FlipBitMutation)
                {
                    if (chromosomeType != ChromosomeType.BinaryChromosome)
                    {
                        throw new CrossoverException("The Flip Bit Mutation can be only used on binary chromosomes. The specified individuals are not binary chromosomes.");
                    }
                    mutationMethod = mutation as FlipBitMutation;
                }
                else if (mutation is GaussianMutation)
                {
                    if (chromosomeType != ChromosomeType.DoubleChromosome)
                    {
                        throw new CrossoverException("The Gaussian Mutation can be only used on double chromosomes. The specified individuals are not double chromosomes.");
                    }
                    mutationMethod = mutation as GaussianMutation;
                }
                else if (mutation is InsertionMutation)
                {
                    if (chromosomeType == ChromosomeType.DoubleChromosome)
                    {
                        throw new CrossoverException("The Displacement Mutation can be only used on binary and combinatorial chromosomes. The specified individuals are double chromosomes.");
                    }
                    mutationMethod = mutation as InsertionMutation;
                }
                else if (mutation is PartialShuffleMutation)
                {
                    if (chromosomeType == ChromosomeType.DoubleChromosome)
                    {
                        throw new CrossoverException("The Displacement Mutation (PSM) can be only used on binary and combinatorial chromosomes. The specified individuals are double chromosomes.");
                    }
                    mutationMethod = mutation as PartialShuffleMutation;
                }
                else if (mutation is PolynomialMutation)
                {
                    if (chromosomeType != ChromosomeType.DoubleChromosome)
                    {
                        throw new CrossoverException("The Polynomial Mutation can be only used on double chromosomes. The specified individuals are not double chromosomes.");
                    }
                    mutationMethod = mutation as PolynomialMutation;
                }
                else if (mutation is ReverseSequenceMutation)
                {
                    if (chromosomeType == ChromosomeType.DoubleChromosome)
                    {
                        throw new CrossoverException("The Displacement Mutation (RSM) can be only used on binary and combinatorial chromosomes. The specified individuals are double chromosomes.");
                    }
                    mutationMethod = mutation as ReverseSequenceMutation;
                }
                else if (mutation is TworsMutation)
                {
                    if (chromosomeType == ChromosomeType.DoubleChromosome)
                    {
                        throw new CrossoverException("The Displacement Mutation can be only used on binary and combinatorial chromosomes. The specified individuals are double chromosomes.");
                    }
                    mutationMethod = mutation as TworsMutation;
                }
                else if (mutation is UniformMutation)
                {
                    if (chromosomeType != ChromosomeType.BinaryChromosome)
                    {
                        throw new CrossoverException("The Uniform Mutation can be only used on binary chromosomes. The specified individuals are not binary chromosomes.");
                    }
                    mutationMethod = mutation as UniformMutation;
                }
                else
                {
                    throw new CrossoverException("Invalid mutation input. A valid object returned by a node of Mutations category should be used.");
                }
            }

            ElitistReinsertion reinsertionMethod = new ElitistReinsertion();

            ITermination terminationMethod = null;

            if (termination == null)
            {
                terminationMethod = new FitnessStagnationTermination(100);
            }
            else
            {
                if (termination is FitnessStagnationTermination)
                {
                    terminationMethod = termination as FitnessStagnationTermination;
                }
                else if (termination is FitnessThresholdTermination)
                {
                    terminationMethod = termination as FitnessThresholdTermination;
                }
                else if (termination is GenerationNumberTermination)
                {
                    terminationMethod = termination as GenerationNumberTermination;
                }
                else if (termination is TimeEvolvingTermination)
                {
                    terminationMethod = termination as TimeEvolvingTermination;
                }
                else if (termination is AndTermination)
                {
                    terminationMethod = termination as AndTermination;
                }
                else if (termination is OrTermination)
                {
                    terminationMethod = termination as OrTermination;
                }
                else
                {
                    throw new CrossoverException("Invalid termination input. An object returned by nodes of Terminations library should be used.");
                }
            }

            if (selectionSize == null)
            {
                selectionSize = (int)Math.Round(0.5 * population.MaxSize);
            }
            else if (!(selectionSize is int))
            {
                throw new CrossoverException("Defined selection size is not an integer.");
            }
            else if (selectionSize > population.MaxSize)
            {
                throw new CrossoverException("Selection size cannot be greater than population size.");
            }

            var algorithm = new DynamoGeneticAlgorithm(population, selectionMethod, crossoverMethod, mutationMethod, reinsertionMethod, terminationMethod)
            {
                SelectionSize        = (int)selectionSize,
                CrossoverProbability = (float)crossoverProbability,
                MutationProbability  = (float)mutationProbability,

                Timer = Stopwatch.StartNew()
            };

            algorithm.Timer.Start();
            return(algorithm);
        }
コード例 #26
0
        public IGraphColoringResponse ColorGraph(IGraphColoringRequest graphColoringRequest)
        {
            try
            {
                Graph graph = graphColoringRequest.Graph;
                GraphProvider.SetGraph(graph);

                Console.WriteLine(graph.PrintGraphInOriginalForm());

                CPChromosome                 chromosome  = new CPChromosome(graphColoringRequest.StartValues.Length, graphColoringRequest.StartValues, graphColoringRequest.Population);
                Population                   population  = new Population(graphColoringRequest.PopulationSize, graphColoringRequest.PopulationSize, chromosome);
                CPFitness                    fitness     = new CPFitness();
                EliteSelection               selection   = new EliteSelection();
                OnePointCrossover            crossover   = new OnePointCrossover();
                CPMutation                   mutation    = new CPMutation();
                FitnessStagnationTermination termination = new FitnessStagnationTermination(50);
                GeneticAlgorithm             ga          = new GeneticAlgorithm(population, fitness, selection, crossover, mutation)
                {
                    Termination = termination, MutationProbability = 0.1f
                };
                int          latestFitness  = int.MinValue;
                int          bestFitness    = 0;
                CPChromosome bestChromosome = null;
                ga.GenerationRan += (sender, e) =>
                {
                    bestChromosome = ga.BestChromosome as CPChromosome;
                    bestFitness    = (int)-bestChromosome.Fitness.Value;

                    if (bestFitness == latestFitness)
                    {
                        return;
                    }
                    latestFitness = bestFitness;
                    bestChromosome.GetValues();
                    Console.WriteLine("Current Generation Result : {0}", bestFitness);
                };
                ga.TerminationReached += (sender, e) => { Console.WriteLine("This is the end of generations"); };
                ga.Start();

                Console.WriteLine("End");

                if (bestFitness > graph.Vertexes.Count)
                {
                    return(new GraphColoringResponse());
                }

                int[] resultGenType = bestChromosome.GetValues();

                IDictionary <int, int> coloredVertex = new Dictionary <int, int>(graph.Vertexes.Count);

                foreach (int vertex in graph.Vertexes)
                {
                    coloredVertex.Add(vertex, resultGenType[vertex - 1]);
                }
                GraphWithColoredVertexes coloredGraph = new GraphWithColoredVertexes(graph, coloredVertex);

                return(new GraphColoringResponse(coloredGraph));
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
                return(new GraphColoringResponse());
            }
        }
コード例 #27
0
        public void Optimize(bool parallel = false)
        {
            Console.WriteLine("Running optimization");
            // Rank StopGain StopLoss MinEpsGrowth

            var chromosome = new SimChromosome();
            var population = new Population(25, 50, chromosome);

            var fitness = new SimFitness(List, Dbfile);

            var selection   = new EliteSelection();
            var crossover   = new UniformCrossover(0.5f);
            var mutation    = new UniformMutation();
            var termination = new FitnessStagnationTermination(100);

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

            if (parallel)
            {
                var taskExecutor = new ParallelTaskExecutor();
                taskExecutor.MinThreads = 4;
                taskExecutor.MaxThreads = 12;
                ga.TaskExecutor         = taskExecutor;
            }

            ga.Termination = termination;

            Console.WriteLine("Generation: (minRank, stopGain, stopLoss) = value");

            var latestFitness = 0.0;

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

                if (bestFitness != latestFitness)
                {
                    latestFitness = bestFitness;
                    var Rank      = (double)bestChromosome.GetGene(0).Value;
                    var StopGain  = (double)bestChromosome.GetGene(1).Value;
                    var StopLoss  = (double)bestChromosome.GetGene(2).Value;
                    var MinGrowth = (double)bestChromosome.GetGene(3).Value;
                    Console.WriteLine(
                        "Generation {0,2}: ({1},{2},{3}) = {4}",
                        ga.GenerationsNumber,
                        Rank,
                        StopGain,
                        StopLoss,
                        bestFitness
                        );
                }
            };

            ga.Start();
        }
コード例 #28
0
        public void functionOptimizationWithGeneticsharp()
        {
            /* example from
             * http://diegogiacomelli.com.br/function-optimization-with-geneticsharp/
             */
            float maxWidth  = 998f;
            float maxHeight = 680f;

            var chromosome = new FloatingPointChromosome(
                new double[] { 0, 0, 0, 0 },
                new double[] { maxWidth, maxHeight, maxWidth, maxHeight },
                new int[] { 12, 12, 12, 12 },
                new int[] { 0, 0, 0, 0 });

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

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

                var values = fc.ToFloatingPoints();
                var x1     = values[0];
                var y1     = values[1];
                var x2     = values[2];
                var y2     = values[3];

                return(Math.Sqrt(Math.Pow(x2 - x1, 2) + Math.Pow(y2 - y1, 2)));
            });

            var selection   = new RouletteWheelSelection();
            var crossover   = new ThreeParentCrossover();
            var mutation    = new PartialShuffleMutation();
            var termination = new FitnessStagnationTermination(100);

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

            ga.Termination = termination;

            Console.WriteLine("Generation: (x1, y1), (x2, y2) = distance");

            var latestFitness = 0.0;

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

                if (bestFitness != latestFitness)
                {
                    latestFitness = bestFitness;
                    var phenotype = bestChromosome.ToFloatingPoints();
                    var s         = string.Format("Generation {0,2}: ({1},{2}),({3},{4}) = {5}",
                                                  ga.GenerationsNumber,
                                                  phenotype[0],
                                                  phenotype[1],
                                                  phenotype[2],
                                                  phenotype[3],
                                                  bestFitness);
                    Console.WriteLine(
                        s
                        );
                }
            };

            ga.Start();
        }
コード例 #29
0
        static void Main(string[] args)
        {
            #region Excel Input
            FileInfo      InputFile       = new FileInfo(@"D:\InputPLASH.xlsx");
            List <double> InputPrecipUp   = new List <double>();
            List <double> InputPrecipDown = new List <double>();
            List <double> InputQObs       = new List <double>();
            List <double> InputEvap       = new List <double>();
            using (ExcelPackage package = new ExcelPackage(InputFile))
            {
                ExcelWorksheet worksheet = package.Workbook.Worksheets[1];
                int            ColCount  = worksheet.Dimension.End.Column;
                int            RowCount  = worksheet.Dimension.End.Row;
                for (int row = 2; row <= RowCount; row++)
                {
                    InputPrecipUp.Add(Convert.ToDouble(worksheet.Cells[row, 2].Value));
                    InputPrecipDown.Add(Convert.ToDouble(worksheet.Cells[row, 3].Value));
                    InputQObs.Add(Convert.ToDouble(worksheet.Cells[row, 4].Value));
                    InputEvap.Add(Convert.ToDouble(worksheet.Cells[row, 5].Value));

                    //Console.WriteLine("PrecipUp: {0}, PrecipDown: {1}, Evap: {2}, QObos: {3}", Math.Round(InputPrecipUp[row - 2],3), Math.Round(InputPrecipDown[row - 2], 3), Math.Round(InputQObs[row - 2],3), Math.Round(InputEvap[row - 2],3));
                }
            }


            #endregion Excel Input


            #region PLASH Simulation

            #region Genetic Algorithm
            int    SimulationLength = InputPrecipUp.Count;
            double Timestep         = 24;

            var chromosome = new FloatingPointChromosome(
                new double[] { 0, 0, 2, 24, 0, //Param Upstream
                               0, 0, 0, 120, 6,
                               0, 0, 0, 0,

                               0, 0, 0, 0,     //Initial Upstream

                               0, 0, 2, 24, 0, //Param Downstream
                               0, 0, 0, 120, 6,
                               0, 0, 0, 0,

                               0, 0, 0, 0, //Initial Downstream

                               12, 0.01    //Param Muskingum
                },
                new double[] {
                10, 10, 10, 240, 300,
                0.5, 0.5, 10, 3600, 120,
                3, 500, 1, 1,

                10, 10, 10, 10,

                10, 10, 10, 240, 300,
                0.5, 0.5, 10, 3600, 120,
                20, 200, 1, 1,

                10, 10, 10, 10,

                180, 0.5
            },
                new int[] { 64, 64, 64, 64, 64,
                            64, 64, 64, 64, 64,
                            64, 64, 64, 64,

                            64, 64, 64, 64,

                            64, 64, 64, 64, 64,
                            64, 64, 64, 64, 64,
                            64, 64, 64, 64,

                            64, 64, 64, 64,

                            64, 64 },
                new int[] { 3, 3, 3, 3, 3,
                            3, 3, 3, 3, 3,
                            3, 3, 3, 3,

                            3, 3, 3, 3,

                            3, 3, 3, 3, 3,
                            3, 3, 3, 3, 3,
                            3, 3, 3, 3,

                            3, 3, 3, 3,

                            3, 3 });

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

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

                var values = fc.ToFloatingPoints();
                if (values[12] < values[13] || values[30] < values[31])
                {
                    return(double.NegativeInfinity);
                }
                DateTime[] TimeSeries = new DateTime[SimulationLength];
                TimeSeries[0]         = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day);
                for (int i = 1; i < TimeSeries.Length; i++)
                {
                    TimeSeries[i] = TimeSeries[0].AddHours(Timestep * i);
                }

                PLASHInput InputUp = new PLASHInput
                {
                    DTE_Arr_TimeSeries   = TimeSeries,
                    FLT_Arr_PrecipSeries = InputPrecipUp.ToArray(),
                    FLT_Arr_EPSeries     = InputEvap.ToArray(),
                    FLT_Arr_QtObsSeries  = InputQObs.ToArray(),
                    FLT_Arr_QtUpstream   = new double[SimulationLength]
                };

                PLASHParameters ParamUp = new PLASHParameters
                {
                    FLT_AD       = 861.42252,
                    FLT_AI       = 0.02,
                    FLT_AP       = 0.95,
                    FLT_TimeStep = 24,

                    FLT_DI   = values[0],
                    FLT_IP   = values[1],
                    FLT_DP   = values[2],
                    FLT_KSup = values[3],
                    FLT_CS   = values[4],
                    FLT_CC   = values[5],
                    FLT_CR   = values[6],
                    FLT_PP   = values[7],
                    FLT_KSub = values[8],
                    FLT_KCan = values[9],
                    FLT_CH   = values[10],
                    FLT_FS   = values[11],
                    FLT_PS   = values[12],
                    FLT_UI   = values[13]
                };

                PLASHInitialConditions Res0Up = new PLASHInitialConditions()
                {
                    RImp0 = values[14],
                    RInt0 = values[15],
                    RSup0 = values[16],
                    RCan0 = values[17]
                };

                PLASHReservoir ReservoirUp = new PLASHReservoir();

                PLASHOutput OutputUp = new PLASHOutput();

                PLASH.Run(InputUp, ParamUp, Res0Up, ReservoirUp, OutputUp);


                Muskingum Musk = new Muskingum()
                {
                    FLT_K             = values[36],
                    FLT_X             = values[37],
                    FLT_Timestep      = Timestep,
                    FLT_Arr_InputFlow = OutputUp.FLT_Arr_Qt_Calc
                };


                PLASHInput InputDown = new PLASHInput()
                {
                    DTE_Arr_TimeSeries   = TimeSeries,
                    FLT_Arr_PrecipSeries = InputPrecipDown.ToArray(),
                    FLT_Arr_EPSeries     = InputEvap.ToArray(),
                    FLT_Arr_QtObsSeries  = InputQObs.ToArray(),
                    FLT_Arr_QtUpstream   = Muskingum.ProcessDamping(Musk)
                };

                PLASHParameters ParamDown = new PLASHParameters
                {
                    FLT_AD       = 727.8917, //Watershed Area (km2)
                    FLT_AI       = 0.02,     //Impervious Area Fraction (km2/km2)
                    FLT_AP       = 0.95,     //Pervious Area Fraction (km2/km2)
                    FLT_TimeStep = 24,


                    FLT_DI   = values[18], //Maximum Impervious Detention (mm)
                    FLT_IP   = values[19], //Maximum Interception (mm)
                    FLT_DP   = values[20], //Maximum Pervious Detention (mm)
                    FLT_KSup = values[21], //Surface Reservoir Decay (h)
                    FLT_CS   = values[22], //Soil Saturation Capacity (mm)
                    FLT_CC   = values[23], //Field Capacity (%)
                    FLT_CR   = values[24], //Recharge Capacity (%)
                    FLT_PP   = values[25], //Deep Percolation (mm/h)
                    FLT_KSub = values[26], //Aquifer Reservoir Decay (d)
                    FLT_KCan = values[27], //Channel Reservoir Decay (h)
                    FLT_CH   = values[28], //Hydraulic Conductivity (mm/h)
                    FLT_FS   = values[29], //Soil Capilarity Factor (mm)
                    FLT_PS   = values[30], //Soil Porosity (cm3/cm3)
                    FLT_UI   = values[31]  //Initial Moisture (cm3/cm3)
                };

                PLASHInitialConditions Res0Down = new PLASHInitialConditions()
                {
                    RImp0 = values[32],
                    RInt0 = values[33],
                    RSup0 = values[34],
                    RCan0 = values[35]
                };

                PLASHReservoir ReservoirDown = new PLASHReservoir();

                PLASHOutput OutputDown = new PLASHOutput();

                PLASH.Run(InputDown, ParamDown, Res0Down, ReservoirDown, OutputDown);

                if (ReservoirDown.FLT_Arr_ESSup.Sum() < 30 || ReservoirUp.FLT_Arr_ESSup.Sum() < 30)
                {
                    return(double.NegativeInfinity);
                }

                //double objectiveNashSut = 1;

                //double MeanSimulatedFlow = OutputDown.FLT_Arr_Qt_Calc.Average();

                //double NashSutUpper = 0;
                //double NashSutLower = 0;


                //for(int i = 0; i < OutputDown.FLT_Arr_Qt_Calc.Length; i++)
                //{
                //    NashSutUpper += Math.Pow(OutputDown.FLT_Arr_Qt_Calc[i] - InputDown.FLT_Arr_QtObsSeries[i], 2);
                //    NashSutLower += Math.Pow(InputDown.FLT_Arr_QtObsSeries[i] - MeanSimulatedFlow, 2);
                //}

                //objectiveNashSut -= (NashSutUpper / NashSutLower);

                double objectiveSquareSum = 0;
                for (int i = 0; i < OutputDown.FLT_Arr_Qt_Calc.Length; i++)
                {
                    objectiveSquareSum += Math.Pow(OutputDown.FLT_Arr_Qt_Calc[i] - InputDown.FLT_Arr_QtObsSeries[i], 2);
                }

                //double objectiveAbsSum = 0;
                //for(int i = 0; i < OutputDown.FLT_Arr_Qt_Calc.Length; i++)
                //{
                //    objectiveAbsSum +=  Math.Abs(OutputDown.FLT_Arr_Qt_Calc[i] - InputDown.FLT_Arr_QtObsSeries[i]);
                //}

                //return objectiveAbsSum * -1;

                return(objectiveSquareSum * -1);

                //return objectiveNashSut;
            });

            var selection   = new EliteSelection();
            var crossover   = new UniformCrossover(0.3f);
            var mutation    = new FlipBitMutation();
            var termination = new FitnessStagnationTermination(250);

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

            ga.Termination = termination;

            //Console.WriteLine("Generation: (x1, y1), (x2, y2) = distance");
            Console.WriteLine("Genetic algorithm tests");
            var latestFitness = 0.0;

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

                if (bestFitness != latestFitness)
                {
                    latestFitness = bestFitness;
                    var phenotype = bestChromosome.ToFloatingPoints();

                    Console.WriteLine("Generation {0}: {1}",

                                      ga.GenerationsNumber,
                                      bestFitness);

                    //Console.WriteLine(
                    //    "Generation {0,2}: ({1},{2}),({3},{4}) = {5}",
                    //    ga.GenerationsNumber,
                    //    phenotype[0],
                    //    phenotype[1],
                    //    phenotype[2],
                    //    phenotype[3],
                    //    bestFitness
                    //);
                }
            };

            ga.Start();

            Console.WriteLine("GA Over!");

            #endregion Genetic Algorithm
            var bestChrom = ga.BestChromosome as FloatingPointChromosome;
            var bestVal   = bestChrom.ToFloatingPoints();


            PLASHInput InputUpstream = new PLASHInput()
            {
                DTE_Arr_TimeSeries   = new DateTime[SimulationLength],
                FLT_Arr_PrecipSeries = InputPrecipUp.ToArray(),
                FLT_Arr_EPSeries     = InputEvap.ToArray(),
                FLT_Arr_QtObsSeries  = InputQObs.ToArray(),
                FLT_Arr_QtUpstream   = new double[SimulationLength]
            };

            PLASHParameters ParametersUpstream = new PLASHParameters()
            {
                FLT_AD       = 861.42252, //Watershed Area (km2)
                FLT_AI       = 0.02,      //Impervious Area Fraction (km2/km2)
                FLT_AP       = 0.95,      //Pervious Area Fraction (km2/km2)
                FLT_TimeStep = 24,

                //Parameters
                FLT_DI   = bestVal[0],      //Maximum Impervious Detention (mm)
                FLT_IP   = bestVal[1],      //Maximum Interception (mm)
                FLT_DP   = bestVal[2],      //Maximum Pervious Detention (mm)
                FLT_KSup = bestVal[3],      //Surface Reservoir Decay (h)
                FLT_CS   = bestVal[4],      //Soil Saturation Capacity (mm)
                FLT_CC   = bestVal[5],      //Field Capacity (%)
                FLT_CR   = bestVal[6],      //Recharge Capacity (%)
                FLT_PP   = bestVal[7],      //Deep Percolation (mm/h)
                FLT_KSub = bestVal[8],      //Aquifer Reservoir Decay (d)
                FLT_KCan = bestVal[9],      //Channel Reservoir Decay (h)
                FLT_CH   = bestVal[10],     //Hydraulic Conductivity (mm/h)
                FLT_FS   = bestVal[11],     //Soil Capilarity Factor (mm)
                FLT_PS   = bestVal[12],     //Soil Porosity (cm3/cm3)
                FLT_UI   = bestVal[13]      //Initial Moisture (cm3/cm3)
            };

            InputUpstream.DTE_Arr_TimeSeries[0] = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day);
            for (int i = 1; i < InputUpstream.DTE_Arr_TimeSeries.Length; i++)
            {
                InputUpstream.DTE_Arr_TimeSeries[i] = InputUpstream.DTE_Arr_TimeSeries[0].AddHours(ParametersUpstream.FLT_TimeStep * i);
            }

            PLASHReservoir ReservoirUpstream = new PLASHReservoir();

            PLASHInitialConditions InitialUpstream = new PLASHInitialConditions()
            {
                RImp0 = bestVal[14],
                RInt0 = bestVal[15],
                RSup0 = bestVal[16],
                RCan0 = bestVal[17]
            };

            PLASHOutput OutputUpstream = new PLASHOutput();

            PLASH.Run(InputUpstream, ParametersUpstream, InitialUpstream, ReservoirUpstream, OutputUpstream);


            PLASHInput InputDownstream = new PLASHInput()
            {
                DTE_Arr_TimeSeries   = new DateTime[SimulationLength],
                FLT_Arr_PrecipSeries = InputPrecipDown.ToArray(),
                FLT_Arr_EPSeries     = InputEvap.ToArray(),
                FLT_Arr_QtObsSeries  = InputQObs.ToArray()
            };

            PLASHParameters ParametersDownstream = new PLASHParameters()
            {
                FLT_AD       = 727.8917, //Watershed Area (km2)
                FLT_AI       = 0.02,     //Impervious Area Fraction (km2/km2)
                FLT_AP       = 0.95,     //Pervious Area Fraction (km2/km2)
                FLT_TimeStep = 24,

                //Parameters
                FLT_DI   = bestVal[18],      //Maximum Impervious Detention (mm)
                FLT_IP   = bestVal[19],      //Maximum Interception (mm)
                FLT_DP   = bestVal[20],      //Maximum Pervious Detention (mm)
                FLT_KSup = bestVal[21],      //Surface Reservoir Decay (h)
                FLT_CS   = bestVal[22],      //Soil Saturation Capacity (mm)
                FLT_CC   = bestVal[23],      //Field Capacity (%)
                FLT_CR   = bestVal[24],      //Recharge Capacity (%)
                FLT_PP   = bestVal[25],      //Deep Percolation (mm/h)
                FLT_KSub = bestVal[26],      //Aquifer Reservoir Decay (d)
                FLT_KCan = bestVal[27],      //Channel Reservoir Decay (h)
                FLT_CH   = bestVal[28],      //Hydraulic Conductivity (mm/h)
                FLT_FS   = bestVal[29],      //Soil Capilarity Factor (mm)
                FLT_PS   = bestVal[30],      //Soil Porosity (cm3/cm3)
                FLT_UI   = bestVal[31]       //Initial Moisture (cm3/cm3)
            };


            InputDownstream.DTE_Arr_TimeSeries[0] = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day);
            for (int i = 1; i < InputDownstream.DTE_Arr_TimeSeries.Length; i++)
            {
                InputDownstream.DTE_Arr_TimeSeries[i] = InputDownstream.DTE_Arr_TimeSeries[0].AddHours(ParametersDownstream.FLT_TimeStep * i);
            }

            PLASHReservoir ReservoirDownstream = new PLASHReservoir();

            PLASHInitialConditions InitialDownstream = new PLASHInitialConditions()
            {
                RImp0 = bestVal[32],
                RInt0 = bestVal[33],
                RSup0 = bestVal[34],
                RCan0 = bestVal[35]
            };

            PLASHOutput OutputDownstream = new PLASHOutput();

            Muskingum DampenedUpstream = new Muskingum()
            {
                FLT_K             = bestVal[36],
                FLT_X             = bestVal[37],
                FLT_Timestep      = 24,
                FLT_Arr_InputFlow = OutputUpstream.FLT_Arr_Qt_Calc
            };

            DampenedUpstream.FLT_Arr_OutputFlow = Muskingum.ProcessDamping(DampenedUpstream);

            InputDownstream.FLT_Arr_QtUpstream = DampenedUpstream.FLT_Arr_OutputFlow;

            PLASH.Run(InputDownstream, ParametersDownstream, InitialDownstream, ReservoirDownstream, OutputDownstream);


            Console.ReadKey();



            //Console.WriteLine("");
            //Console.ReadKey();

            #endregion PLASH Simulation

            #region Buwo Simulation

            List <Buildup_Washoff> UsesUpstream   = Buildup_Washoff.BuwoUpstreamList(Timestep, ReservoirUpstream.FLT_Arr_ESSup);
            List <Buildup_Washoff> UsesDownstream = Buildup_Washoff.BuwoDownstreamList(Timestep, ReservoirDownstream.FLT_Arr_ESSup);

            foreach (Buildup_Washoff Use in UsesUpstream)
            {
                Buildup_Washoff.fncBuildupWashoffProcess(Use);
            }

            Buildup_Washoff BuwoUpstream = Buildup_Washoff.AggregateUses(UsesUpstream, 863.178D);

            foreach (Buildup_Washoff Use in UsesDownstream)
            {
                Buildup_Washoff.fncBuildupWashoffProcess(Use);
            }

            Buildup_Washoff BuwoDownstream = Buildup_Washoff.AggregateUses(UsesDownstream, 729.018D);



            Buildup_Washoff Aggregate = Buildup_Washoff.Transport(BuwoUpstream, BuwoDownstream);


            #endregion Buwo Simulation



            //#region Excel Output
            using (ExcelPackage excel = new ExcelPackage())
            {
                excel.Workbook.Worksheets.Add("Param_PLASHUp");
                excel.Workbook.Worksheets.Add("Param_PLASHDown");
                excel.Workbook.Worksheets.Add("PLASHReservoirUp");
                excel.Workbook.Worksheets.Add("PLASHReservoirDown");
                excel.Workbook.Worksheets.Add("PLASHInitialUp");
                excel.Workbook.Worksheets.Add("PLASHInitialDown");
                excel.Workbook.Worksheets.Add("Results_PLASHUp");
                excel.Workbook.Worksheets.Add("Results_PLASHDown");
                excel.Workbook.Worksheets.Add("Param_Muskingum");
                excel.Workbook.Worksheets.Add("Results_Muskingum");
                excel.Workbook.Worksheets.Add("Results_BuWo");

                #region Parameters

                var HeaderRowPLASHParam = new List <string[]>()
                {
                    new string[]
                    {
                        "DI", "IP", "DP", "KSup", "CS", "CC", "CR", "PP", "Ksub", "KCan", "CH", "FS", "PS", "UI"
                    }
                };

                string headerRangePLASHParam = "A1:" + Char.ConvertFromUtf32(HeaderRowPLASHParam[0].Length + 64) + 1;

                var worksheet = excel.Workbook.Worksheets["Param_PLASHUp"];

                worksheet.Cells[headerRangePLASHParam].LoadFromArrays(HeaderRowPLASHParam);

                List <object[]> cellDataPLASHParamUP = new List <object[]>();

                cellDataPLASHParamUP.Add(new object[]
                {
                    ParametersUpstream.FLT_DI, ParametersUpstream.FLT_IP, ParametersUpstream.FLT_DP, ParametersUpstream.FLT_KSup, ParametersUpstream.FLT_CS,
                    ParametersUpstream.FLT_CC, ParametersUpstream.FLT_CR, ParametersUpstream.FLT_PP, ParametersUpstream.FLT_KSub, ParametersUpstream.FLT_KCan,
                    ParametersUpstream.FLT_CH, ParametersUpstream.FLT_FS, ParametersUpstream.FLT_PS, ParametersUpstream.FLT_UI
                });

                worksheet.Cells[2, 1].LoadFromArrays(cellDataPLASHParamUP);

                worksheet = excel.Workbook.Worksheets["Param_PLASHDown"];

                worksheet.Cells[headerRangePLASHParam].LoadFromArrays(HeaderRowPLASHParam);

                List <object[]> cellDataPLASHParamDown = new List <object[]>();

                cellDataPLASHParamDown.Add(new object[]
                {
                    ParametersDownstream.FLT_DI, ParametersDownstream.FLT_IP, ParametersDownstream.FLT_DP, ParametersDownstream.FLT_KSup, ParametersDownstream.FLT_CS,
                    ParametersDownstream.FLT_CC, ParametersDownstream.FLT_CR, ParametersDownstream.FLT_PP, ParametersDownstream.FLT_KSub, ParametersDownstream.FLT_KCan,
                    ParametersDownstream.FLT_CH, ParametersDownstream.FLT_FS, ParametersDownstream.FLT_PS, ParametersDownstream.FLT_UI
                });

                worksheet.Cells[2, 1].LoadFromArrays(cellDataPLASHParamDown);

                #endregion Parameters

                #region Reservoir
                var HeaderRowPLASHreservoir = new List <string[]>()
                {
                    new string[]
                    {
                        "ImpRes", "ImpEvap", "ImpFlow",
                        "IntRes", "IntEvap", "IntFlow",
                        "SurfRes", "SurfEvap", "SurfFlow",
                        "Inf", "InfCum", "IAE", "TP", "IAEAdim", "TPAdim",
                        "SoilRes", "SoilEvap", "SoilUpFlow", "SoilDownFlow",
                        "AquiRes", "AquiPerc", "AquiFlow",
                        "ChanRes", "ChanEvap", "ChanUpFlow", "ChanDownFlow"
                    }
                };

                string HeaderRangePLASHReservoir = "A1:" + Char.ConvertFromUtf32(HeaderRowPLASHreservoir[0].Length + 64) + 1;

                worksheet = excel.Workbook.Worksheets["PLASHReservoirUp"];

                worksheet.Cells[HeaderRangePLASHReservoir].LoadFromArrays(HeaderRowPLASHreservoir);

                List <object[]> cellDataPLASHResUp = new List <object[]>();

                for (int i = 0; i < SimulationLength; i++)
                {
                    cellDataPLASHResUp.Add(new object[]
                    {
                        ReservoirUpstream.FLT_Arr_RImp[i], ReservoirUpstream.FLT_Arr_ERImp[i], ReservoirUpstream.FLT_Arr_ESImp[i],
                        ReservoirUpstream.FLT_Arr_RInt[i], ReservoirUpstream.FLT_Arr_ERInt[i], ReservoirUpstream.FLT_Arr_ESInt[i],
                        ReservoirUpstream.FLT_Arr_RSup[i], ReservoirUpstream.FLT_Arr_ERSup[i], ReservoirUpstream.FLT_Arr_ESSup[i],
                        ReservoirUpstream.FLT_Arr_Infiltration[i], ReservoirUpstream.FLT_Arr_Infiltration_Cumulative[i], ReservoirUpstream.FLT_Arr_IAE[i], ReservoirUpstream.FLT_Arr_TP[i], ReservoirUpstream.FLT_Arr_IAEAdim[i], ReservoirUpstream.FLT_Arr_TPAdim[i],
                        ReservoirUpstream.FLT_Arr_RSol[i], ReservoirUpstream.FLT_Arr_ERSol[i], ReservoirUpstream.FLT_Arr_EESol[i], ReservoirUpstream.FLT_Arr_ESSol[i],
                        ReservoirUpstream.FLT_Arr_RSub[i], ReservoirUpstream.FLT_Arr_PPSub[i], ReservoirUpstream.FLT_Arr_EESub[i],
                        ReservoirUpstream.FLT_Arr_RCan[i], ReservoirUpstream.FLT_Arr_ERCan[i], ReservoirUpstream.FLT_Arr_EECan[i], ReservoirUpstream.FLT_ARR_ESCan[i]
                    });
                }

                worksheet.Cells[2, 1].LoadFromArrays(cellDataPLASHResUp);


                worksheet = excel.Workbook.Worksheets["PLASHReservoirDown"];

                worksheet.Cells[HeaderRangePLASHReservoir].LoadFromArrays(HeaderRowPLASHreservoir);

                List <object[]> cellDataPLASHResDown = new List <object[]>();

                for (int i = 0; i < SimulationLength; i++)
                {
                    cellDataPLASHResDown.Add(new object[]
                    {
                        ReservoirDownstream.FLT_Arr_RImp[i], ReservoirDownstream.FLT_Arr_ERImp[i], ReservoirDownstream.FLT_Arr_ESImp[i],
                        ReservoirDownstream.FLT_Arr_RInt[i], ReservoirDownstream.FLT_Arr_ERInt[i], ReservoirDownstream.FLT_Arr_ESInt[i],
                        ReservoirDownstream.FLT_Arr_RSup[i], ReservoirDownstream.FLT_Arr_ERSup[i], ReservoirDownstream.FLT_Arr_ESSup[i],
                        ReservoirDownstream.FLT_Arr_Infiltration[i], ReservoirDownstream.FLT_Arr_Infiltration_Cumulative[i], ReservoirDownstream.FLT_Arr_IAE[i], ReservoirDownstream.FLT_Arr_TP[i], ReservoirDownstream.FLT_Arr_IAEAdim[i], ReservoirDownstream.FLT_Arr_TPAdim[i],
                        ReservoirDownstream.FLT_Arr_RSol[i], ReservoirDownstream.FLT_Arr_ERSol[i], ReservoirDownstream.FLT_Arr_EESol[i], ReservoirDownstream.FLT_Arr_ESSol[i],
                        ReservoirDownstream.FLT_Arr_RSub[i], ReservoirDownstream.FLT_Arr_PPSub[i], ReservoirDownstream.FLT_Arr_EESub[i],
                        ReservoirDownstream.FLT_Arr_RCan[i], ReservoirDownstream.FLT_Arr_ERCan[i], ReservoirDownstream.FLT_Arr_EECan[i], ReservoirDownstream.FLT_ARR_ESCan[i]
                    });
                }

                worksheet.Cells[2, 1].LoadFromArrays(cellDataPLASHResDown);

                #endregion Reservoir

                #region Initial Conditions
                var HeaderRowPLASHInitial = new List <string[]>()
                {
                    new string[] { "RImp0", "RInt0", "RSup0", "RCan0" }
                };

                string headerRangePLASHInitial = "A1:" + Char.ConvertFromUtf32(HeaderRowPLASHInitial[0].Length + 64) + 1;

                worksheet = excel.Workbook.Worksheets["PLASHInitialUp"];

                worksheet.Cells[headerRangePLASHInitial].LoadFromArrays(HeaderRowPLASHInitial);

                List <object[]> cellDataPLASHInitialUp = new List <object[]>();

                cellDataPLASHInitialUp.Add(new object[] { InitialUpstream.RImp0, InitialUpstream.RInt0, InitialUpstream.RSup0, InitialUpstream.RCan0 });

                worksheet.Cells[2, 1].LoadFromArrays(cellDataPLASHInitialUp);


                worksheet = excel.Workbook.Worksheets["PLASHInitialDown"];

                worksheet.Cells[headerRangePLASHInitial].LoadFromArrays(HeaderRowPLASHInitial);

                List <object[]> cellDataPLASHInitialDown = new List <object[]>();

                cellDataPLASHInitialDown.Add(new object[] { InitialDownstream.RImp0, InitialDownstream.RInt0, InitialDownstream.RSup0, InitialDownstream.RCan0 });

                worksheet.Cells[2, 1].LoadFromArrays(cellDataPLASHInitialDown);

                #endregion Initial Conditions

                #region Results

                //PLASH Upstream
                var HeaderRowPLASH = new List <string[]>()
                {
                    new string[] { "Precipitation", "Evapotranspiration", "Observed Flow",
                                   "Impervious Reservoir", "Interception Reservoir", "Surface Reservoir", "Soil Reservoir", "Aquifer Reservoir", "Channel Reservoir",
                                   "Calculated Basic Flow", "Calculated Surface Flow", "Calculated Total Flow" },
                };

                string headerRangePLASH = "A1:" + Char.ConvertFromUtf32(HeaderRowPLASH[0].Length + 64) + 1;

                worksheet = excel.Workbook.Worksheets["Results_PLASHUp"];

                worksheet.Cells[headerRangePLASH].LoadFromArrays(HeaderRowPLASH);

                List <object[]> cellDataPLASHUp = new List <object[]>();

                for (int i = 0; i < SimulationLength; i++)
                {
                    cellDataPLASHUp.Add(new object[] { InputUpstream.FLT_Arr_PrecipSeries[i], InputUpstream.FLT_Arr_EPSeries[i], InputUpstream.FLT_Arr_QtObsSeries[i],
                                                       ReservoirUpstream.FLT_Arr_RImp[i], ReservoirUpstream.FLT_Arr_RInt[i], ReservoirUpstream.FLT_Arr_RSup[i], ReservoirUpstream.FLT_Arr_RSol[i], ReservoirUpstream.FLT_Arr_RSub[i], ReservoirUpstream.FLT_Arr_RCan[i],
                                                       OutputUpstream.FLT_Arr_QBas_Calc[i], OutputUpstream.FLT_Arr_QSup_Calc[i], OutputUpstream.FLT_Arr_Qt_Calc[i] });
                }

                worksheet.Cells[2, 1].LoadFromArrays(cellDataPLASHUp);

                //PLASH Downstream

                worksheet = excel.Workbook.Worksheets["Results_PLASHDown"];

                worksheet.Cells[headerRangePLASH].LoadFromArrays(HeaderRowPLASH);

                List <object[]> cellDataPLASHDown = new List <object[]>();


                for (int i = 0; i < SimulationLength; i++)
                {
                    cellDataPLASHDown.Add(new object[] { InputDownstream.FLT_Arr_PrecipSeries[i], InputDownstream.FLT_Arr_EPSeries[i], InputDownstream.FLT_Arr_QtObsSeries[i],
                                                         ReservoirDownstream.FLT_Arr_RImp[i], ReservoirDownstream.FLT_Arr_RInt[i], ReservoirDownstream.FLT_Arr_RSup[i], ReservoirDownstream.FLT_Arr_RSol[i], ReservoirDownstream.FLT_Arr_RSub[i], ReservoirDownstream.FLT_Arr_RCan[i],
                                                         OutputDownstream.FLT_Arr_QBas_Calc[i], OutputDownstream.FLT_Arr_QSup_Calc[i], OutputDownstream.FLT_Arr_Qt_Calc[i] });
                }

                worksheet.Cells[2, 1].LoadFromArrays(cellDataPLASHDown);

                #endregion Results


                #region Muskingum Parameters
                //Muskingum

                var HeaderRowMuskingumParam = new List <string[]>()
                {
                    new string[] { "K", "X" },
                };

                string headerRangeMuskingumParam = "A1:" + Char.ConvertFromUtf32(HeaderRowMuskingumParam[0].Length + 64) + 1;


                worksheet = excel.Workbook.Worksheets["Param_Muskingum"];

                worksheet.Cells[headerRangeMuskingumParam].LoadFromArrays(HeaderRowMuskingumParam);

                List <object[]> cellDataMuskingumParam = new List <object[]>();

                cellDataMuskingumParam.Add(new object[] { DampenedUpstream.FLT_K, DampenedUpstream.FLT_X });


                worksheet.Cells[2, 1].LoadFromArrays(cellDataMuskingumParam);

                #endregion Muskingum Parameters

                #region Muskingum
                var HeaderRowMuskingum = new List <string[]>()
                {
                    new string[] { "Upstream Flow", "Downstream Flow" },
                };

                string headerRangeMuskingum = "A1:" + Char.ConvertFromUtf32(HeaderRowMuskingum[0].Length + 64) + 1;


                worksheet = excel.Workbook.Worksheets["Results_Muskingum"];

                worksheet.Cells[headerRangeMuskingum].LoadFromArrays(HeaderRowMuskingum);

                List <object[]> cellDataMuskingum = new List <object[]>();


                for (int i = 0; i < SimulationLength; i++)
                {
                    cellDataMuskingum.Add(new object[] { DampenedUpstream.FLT_Arr_InputFlow[i], DampenedUpstream.FLT_Arr_OutputFlow[i] });
                }

                worksheet.Cells[2, 1].LoadFromArrays(cellDataMuskingum);

                #endregion Muskingum

                #region BuWo
                //Buwo

                var HeaderRow2 = new List <string[]>()
                {
                    new string[] { "Precipitation", "Surface Flow", "Buildup", "Effective Washoff" },
                };

                string headerRange2 = "A1:" + Char.ConvertFromUtf32(HeaderRow2[0].Length + 64) + 1;

                worksheet = excel.Workbook.Worksheets["Results_BuWo"];

                worksheet.Cells[headerRange2].LoadFromArrays(HeaderRow2);

                List <object[]> cellDataBuwo = new List <object[]>();

                for (int i = 0; i < SimulationLength; i++)
                {
                    cellDataBuwo.Add(new object[] { InputUpstream.FLT_Arr_PrecipSeries[i], ReservoirDownstream.FLT_Arr_ESSup[i], Aggregate.FLT_Arr_Buildup[i], Aggregate.FLT_Arr_EffectiveWashoff[i] });
                }

                worksheet.Cells[2, 1].LoadFromArrays(cellDataBuwo);

                #endregion BuWo

                FileInfo excelFile = new FileInfo(@"D:\dataGA.xlsx");
                excel.SaveAs(excelFile);
            }

            ////Console.WriteLine("Excel processed");

            //#endregion Excel Output

            //Console.ReadKey();
        }