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); }
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); }
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(); }
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)); }
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)); }
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)); }
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); }
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); }
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); }
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)); }
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; }
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); }
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 }
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(); }); }
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(); }
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(); }
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(); }); }
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(); }
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(); }
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(); }
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(); }
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(); }
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(); }
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)); }
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); }
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()); } }
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(); }
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(); }
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(); }