private IList <CheckersMove> GetNewMoves() { InitializeGA(); var termination = new GenerationNumberTermination(GA.GenerationsNumber + m_generationNumber); GA.Termination = termination; Debug.Log("Running GA..."); if (GA.State == GeneticAlgorithmState.NotStarted) { GA.Start(); } else { GA.Resume(); } Debug.Log("Fitness: " + GA.BestChromosome.Fitness); Debug.Log("Generations: " + GA.GenerationsNumber); if (GA.BestChromosome.Fitness <= 0) { Debug.LogError("Lower than zero."); } if (GA.BestChromosome.Fitness == 0) { HudController.IsGameOver = true; } return((GA.BestChromosome as CheckersChromosome).Moves); }
public void HasReached_GenerationNumberLowerThanCondition_False() { var repository = new MockRepository(); var ga = repository.StrictMock <IGeneticAlgorithm>(); using (repository.Ordered()) { ga.Expect(g => g.GenerationsNumber).Return(1); ga.Expect(g => g.GenerationsNumber).Return(2); ga.Expect(g => g.GenerationsNumber).Return(3); ga.Expect(g => g.GenerationsNumber).Return(4); ga.Expect(g => g.GenerationsNumber).Return(5); ga.Expect(g => g.GenerationsNumber).Return(6); ga.Expect(g => g.GenerationsNumber).Return(7); ga.Expect(g => g.GenerationsNumber).Return(8); ga.Expect(g => g.GenerationsNumber).Return(0); } repository.ReplayAll(); var target = new GenerationNumberTermination(10); Assert.IsFalse(target.HasReached(ga)); for (int i = 0; i < 8; i++) { Assert.IsFalse(target.HasReached(ga)); } }
public GeneticSharpSolver Setup() { var chromosome = new FloatingPointChromosome( _decisions.Select(d => d.LowerBound).ToArray(), _decisions.Select(d => d.UpperBound).ToArray(), _decisions.Select(d => d.TotalBits).ToArray(), _decisions.Select(d => d.FractionDigits).ToArray()); var population = new Population(_populationSize, _populationSize + _offspringNumber, chromosome); var fitness = new FuncFitness((c) => { return(_objective(c as FloatingPointChromosome, this)); }); var selection = new EliteSelection(); var crossover = new UniformCrossover(0.5f); var mutation = new FlipBitMutation(); var termination = new GenerationNumberTermination(_maxGenerations); _ga = new GeneticAlgorithm( population, fitness, selection, crossover, mutation); _ga.Termination = termination; if (_generationCallback != null) { _ga.GenerationRan += (sender, e) => _generationCallback(_ga); } return(this); }
public static GeneticSharp.Domain.GeneticAlgorithm MakeDefault(Func <double[], double> func, Tuple <double, double>[] minmax) { var population = new Population(20, 40, chromosome.CreateFloatChromosone(minmax)); var fitness = new FuncFitness((c) => { var fc = c as FloatingPointChromosome; var values = fc.ToFloatingPoints(); return(func(values)); }); var selection = new RouletteWheelSelection(); var crossover = new UniformCrossover(0.5f); var mutation = new FlipBitMutation(); var ga = new GeneticSharp.Domain.GeneticAlgorithm( population, fitness, selection, crossover, mutation); var termination = new GenerationNumberTermination(1000); ga.Termination = termination; Console.WriteLine("Generation: (x1, y1), (x2, y2) = distance"); return(ga); }
static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); //Application.Run(new Painter()); //setupNext(); var chromosome = new FloatingPointChromosome( //lvl, hp, food, ruletype, rule, seed, tempo, pitch, r1, r2, r3 new double[] { 0, 0, 0, 7, 30, 32, 23, 23, 0, 0, 0 }, //min values new double[] { 50, 500, 5, 1800, 999999999, 9999999, 288, 72, 999, 999, 999 }, //max values new int[] { 6, 9, 3, 11, 34, 27, 9, 7, 10, 10, 10 }, //bits required for values new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } //bits for fractals ); var population = new Population(5, 25, chromosome); //min-max population var fitness = new myFitness(); var selection = new EliteSelection(); var crossover = new TwoPointCrossover(); var mutation = new FlipBitMutation(); var termination = new GenerationNumberTermination(10); var ga = new GeneticAlgorithm( population, fitness, selection, crossover, mutation); ga.Termination = termination; ga.Start(); }
/// <summary> /// Initializes a new instance of the <see cref="GeneticSharp.Domain.GeneticAlgorithm"/> class. /// </summary> /// <param name="population">The chromosomes population.</param> /// <param name="fitness">The fitness evaluation function.</param> /// <param name="selection">The selection operator.</param> /// <param name="crossover">The crossover operator.</param> /// <param name="mutation">The mutation operator.</param> public GeneticAlgorithm( IPopulation population, IFitness fitness, ISelection selection, ICrossover crossover, IMutation mutation) { ExceptionHelper.ThrowIfNull("population", population); ExceptionHelper.ThrowIfNull("fitness", fitness); ExceptionHelper.ThrowIfNull("selection", selection); ExceptionHelper.ThrowIfNull("crossover", crossover); ExceptionHelper.ThrowIfNull("mutation", mutation); Population = population; Fitness = fitness; Selection = selection; Crossover = crossover; Mutation = mutation; Reinsertion = new ElitistReinsertion(); Termination = new GenerationNumberTermination(1); CrossoverProbability = DefaultCrossoverProbability; MutationProbability = DefaultMutationProbability; TimeEvolving = TimeSpan.Zero; State = GeneticAlgorithmState.NotStarted; TaskExecutor = new LinearTaskExecutor(); }
public ITermination GenerationNumber() { var target = new GenerationNumberTermination(1); var ga = Substitute.For <IGeneticAlgorithm>(); ga.GenerationsNumber.Returns(1); target.HasReached(ga); return(target); }
public void OptimizeAI() { if (frequency != turnsSinceLastOptimization) { turnsSinceLastOptimization++; return; } GenerateScoreData(); int maxSize = GetMaxSize(); AiSettingsChromosome intelligenceChromosome = new AiSettingsChromosome(3); Population population = new Population(maxSize, maxSize, intelligenceChromosome); FuncFitness fitness; if (HistoryManagr.Instance.savingHistory == true) { fitness = new FuncFitness((c) => { return(GetHistoryFitness(c)); }); } else { fitness = new FuncFitness((c) => { return(GetFitness(c)); }); } var selection = new EliteSelection(); var crossover = new UniformCrossover(0.5f); var mutation = new DisplacementMutation(); var termination = new GenerationNumberTermination(2); var ga = new GeneticAlgorithm(population, fitness, selection, crossover, mutation); List <IChromosome> savedChromosomes = new List <IChromosome>(); ga.Termination = termination; ga.GenerationRan += (sender, e) => { if (ga.GenerationsNumber == 2) { savedChromosomes = (List <IChromosome>)ga.Population.CurrentGeneration.Chromosomes; } }; ga.Start(); turnsSinceLastOptimization = 0; settingsScoreData.Clear(); settingsData.Clear(); SetGeneratedData(savedChromosomes); foreach (PlayerData player in PlayerManager.Instance.players) { EventSaverManager.Instance.SaveDDAEvolutionAIEvent(player.id); } }
public void HasReached_GenerationNumberGreaterOrEqualThanCondition_True() { var ga = Substitute.For <IGeneticAlgorithm>(); ga.GenerationsNumber.Returns(10, 11); var target = new GenerationNumberTermination(10); Assert.IsTrue(target.HasReached(ga)); Assert.IsTrue(target.HasReached(ga)); }
public void HasReached_Returns_True_WhenGenerationCountIsLargerThanMaximalNumberOfGenerations() { var sot = new GenerationNumberTermination(10); var state = new GenerationCountState(); for (var i = 0; i < 10; i++) { Assert.False(sot.HasReached(null, state)); state.UpdateOnGenerationRan(null); } Assert.True(sot.HasReached(null, state)); }
public void HasReached_GenerationNumberLowerThanCondition_False() { var ga = Substitute.For <IGeneticAlgorithm>(); ga.GenerationsNumber.Returns(1, 2, 3, 4, 5, 6, 7, 8, 0); var target = new GenerationNumberTermination(10); Assert.IsFalse(target.HasReached(ga)); for (int i = 0; i < 8; i++) { Assert.IsFalse(target.HasReached(ga)); } }
public void HasReached_GenerationNumberGreaterOrEqualThanCondition_True() { var repository = new MockRepository(); var ga = repository.StrictMock <IGeneticAlgorithm> (); using (repository.Ordered()) { ga.Expect(g => g.GenerationsNumber).Return(10); ga.Expect(g => g.GenerationsNumber).Return(11); } repository.ReplayAll(); var target = new GenerationNumberTermination(10); Assert.IsTrue(target.HasReached(ga)); Assert.IsTrue(target.HasReached(ga)); }
public void Start_ParallelManyGenerations_Faster() { var selection = new EliteSelection(); var crossover = new OnePointCrossover(2); var mutation = new UniformMutation(); var chromosome = new ChromosomeStub(); var fitness = new FitnessStub() { SupportsParallel = true, ParallelSleep = 1 }; var generationStrategy = new TrackingGenerationStrategy(); var termination = new GenerationNumberTermination(100); // we test linear first var target = new GeneticAlgorithm(new Population(10, 10, chromosome), fitness , selection, crossover, mutation); target.Population.GenerationStrategy = generationStrategy; target.Termination = termination; target.TaskExecutor = new LinearTaskExecutor(); target.Start(); Assert.AreEqual(100, target.Population.Generations.Count); var linearTime = target.TimeEvolving.TotalMilliseconds; //then parallel target = new GeneticAlgorithm(new Population(10, 10, chromosome), fitness , selection, crossover, mutation); target.Population.GenerationStrategy = generationStrategy; target.Termination = termination; target.TaskExecutor = new TplTaskExecutor(); target.Start(); Assert.AreEqual(100, target.Population.Generations.Count); var parallelTime = target.TimeEvolving.TotalMilliseconds; Assert.Less(parallelTime, linearTime); }
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)); }
/// <summary> /// Initializes a new instance of the <see cref="AlgorithmOptimumFinder"/> class /// </summary> /// <param name="start">Algorithm start date</param> /// <param name="end">Algorithm end date</param> /// <param name="fitScore">Argument of <see cref="FitnessScore"/> type. Fintess function to rank the backtest results</param> /// <param name="filterEnabled">Indicates whether to apply fitness filter to backtest results</param> public AlgorithmOptimumFinder(DateTime start, DateTime end, FitnessScore fitScore, bool filterEnabled) { // Assign Dates and Criteria to sort the results StartDate = start; EndDate = end; FitnessScore = fitScore; // Common properties var selection = new RouletteWheelSelection(); // Properties specific to optimization modes IFitness fitness; PopulationBase population; ITaskExecutor executor; ITermination termination; // Task execution mode switch (Shared.Config.TaskExecutionMode) { // Enable fitness filtering while searching for optimum parameters case TaskExecutionMode.Linear: executor = new LinearTaskExecutor(); fitness = new OptimizerFitness(StartDate, EndDate, fitScore, filterEnabled); break; case TaskExecutionMode.Parallel: executor = new ParallelTaskExecutor(); fitness = new OptimizerFitness(StartDate, EndDate, fitScore, filterEnabled); break; case TaskExecutionMode.Azure: executor = new ParallelTaskExecutor(); fitness = new AzureFitness(StartDate, EndDate, fitScore, filterEnabled); break; default: throw new Exception("Executor initialization failed"); } // Optimization mode switch (Shared.Config.OptimizationMode) { case OptimizationMode.BruteForce: { // Create cartesian population population = new PopulationCartesian(Shared.Config.GeneConfigArray); termination = new GenerationNumberTermination(1); break; } case OptimizationMode.Genetic: { // Create random population population = new PopulationRandom(Shared.Config.GeneConfigArray, Shared.Config.PopulationInitialSize) { GenerationMaxSize = Shared.Config.GenerationMaxSize }; // Logical terminaton var localTerm = new LogicalOrTermination(); localTerm.AddTermination(new FruitlessGenerationsTermination(3)); if (Shared.Config.Generations.HasValue) { localTerm.AddTermination(new GenerationNumberTermination(Shared.Config.Generations.Value)); } if (Shared.Config.StagnationGenerations.HasValue) { localTerm.AddTermination(new FitnessStagnationTermination(Shared.Config.StagnationGenerations.Value)); } termination = localTerm; break; } default: throw new Exception("Optimization mode specific objects were not initialized"); } // Create GA itself GenAlgorithm = new GeneticAlgorithm(population, fitness, executor) { // Reference types Selection = selection, Termination = termination, // Values types CrossoverParentsNumber = Shared.Config.CrossoverParentsNumber, CrossoverMixProbability = Shared.Config.CrossoverMixProbability, MutationProbability = Shared.Config.MutationProbability }; }
public static void BuildTestGA() { //Create chromosome length = 20 BinaryChromosome chrom = new BinaryChromosome(20); //Create population = [2,100] var population = new Population(2, 100, chrom); //Console.WriteLine(chrom.Length); //Console.WriteLine(chrom.ToString()); //create Fitness Function (функция приспособления) var fitness = new FuncFitness( (c) => { var fc = c as BinaryChromosome; double result = 0.0; foreach (Gene gene in fc.GetGenes()) { result += Convert.ToDouble(gene.Value.ToString()); } return(result); } ); //create selection //var selection = new EliteSelection(); var selection = new TournamentSelection(); //var selection = new RouletteWheelSelection(); //var selection = new StochasticUniversalSamplingSelection(); //create crossover var crossover = new UniformCrossover(0.5f); //var crossover = new CutAndSpliceCrossover(); //только с EliteSelection() //var crossover = new OnePointCrossover(); //var crossover = new TwoPointCrossover(); //var crossover = new CycleCrossover(); // new OrderBasedCrossover(); new OrderedCrossover(); new PositionBasedCrossover(); new PartiallyMappedCrossover(); //может использоваться только с упорядоченными хромосомами. Указанная хромосома имеет повторяющиеся гены //var crossover = new ThreeParentCrossover(); //ОДНУ Итерацию выполняет //create mutation var mutation = new FlipBitMutation(); //var mutation = new UniformMutation(); //1 перегрузка принимает индексы генов для мутации, 2-я все гены мутируют //var mutation = new TworsMutation(); //Слабая //var mutation = new ReverseSequenceMutation(); //Слабая //create termination (Количество итераций) var termination = new GenerationNumberTermination(100); //var termination = new FitnessStagnationTermination(50); // var termination = new FitnessThresholdTermination(50); //Постоянно зацикливается //TimeSpan time = new TimeSpan(0, 0, 10); //10 секунд //var termination = new TimeEvolvingTermination(time); //Сам генетический алгоритм var ga = new GeneticAlgorithm( population, fitness, selection, crossover, mutation); ga.Termination = termination; Console.WriteLine("Generation: = distance"); var latestFitness = 0.0; ga.GenerationRan += (sender, e) => { var bestChromosome = ga.BestChromosome as BinaryChromosome; var bestFitness = bestChromosome.Fitness.Value; if (bestFitness != latestFitness) { latestFitness = bestFitness; var phenotype = bestChromosome.GetGenes(); //Console.WriteLine( // "Generation {0,2}: ({1},{2}),({3},{4}) = {5}", // ga.GenerationsNumber, // phenotype[0], // phenotype[1], // phenotype[2], // phenotype[3], // bestFitness //); Console.WriteLine("Generation {0,2}. Best Fitness = {1}", ga.GenerationsNumber, bestFitness); Console.Write("Chromosome: "); foreach (Gene g in phenotype) { Console.Write(g.Value.ToString() + ""); } Console.WriteLine(); } }; ga.Start(); }
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 void Constructor_Sets_Fields_Correctly() { var sot = new GenerationNumberTermination(10); Assert.AreEqual(10, sot.MaximalNumberOfGenerations); }