static void Main(string[] args) { Population populacja = new Population(5, 6, n => n * n, new Random()); int ilosc = 5;//ilosc pokoleń for (int i = 0; i < ilosc; i++) { for (int j = 0; j <= 2; i++) { foreach (var z in populacja.Individuals) { foreach (var x in populacja.Individuals) { var crossoverOperator = new OnePointCrossover(new Random()); crossoverOperator.Crossover(z, x); } } } var lambda = new OnePointCrossover(new Random()); var pokolenie = lambda.IndividualsLambda; foreach (var y in pokolenie) { populacja.Individuals.Add(y); } var top = populacja.Individuals.OrderByDescending(x => x.Fitness).Take(5); populacja = null; populacja.Individuals.Add(top); } }
static void Main(string[] args) { Stopwatch sw = new Stopwatch(); sw.Start(); Func <double, double> fitness = x => 2 * x + 1; var ga = new GeneticAlgorithm(1500, 500, new OnePointCrossover(), new ClassicMutationOperator(), new RouletteWheelSelection(), fitness); //ga.PrintStatistics = true; var result = ga.RunSimulation(500); Console.WriteLine($"x = {result.Chromosome.DecodedValue}, f = {result.Fitness}"); var ind = new Individual(10); ind.ReplaceGenes(new bool[] { true, true, true, true, true, true, true, true, true, true }); Console.WriteLine($"x = {ind.Chromosome.DecodedValue}, f = {fitness(ind.Chromosome.DecodedValue)}"); sw.Stop(); Console.WriteLine(sw.ElapsedMilliseconds + "ms"); Console.ReadLine(); return; var ind1 = new Individual(10); var ind2 = new Individual(10); Console.WriteLine("Individual 1: "); Console.WriteLine(ind1); Console.WriteLine("Individual 2: "); Console.WriteLine(ind2); var crossover = new OnePointCrossover(); crossover.Crossover(ind1, ind2); Console.WriteLine("Individual 1: "); Console.WriteLine(ind1); Console.WriteLine("Individual 2: "); Console.WriteLine(ind2); var mutation = new ClassicMutationOperator(); Console.WriteLine("--Before mutation: "); Console.WriteLine("Individual 1: "); Console.WriteLine(ind1); mutation.Mutation(ind1, 0.1); Console.WriteLine("--After mutation: "); Console.WriteLine("Individual 1: "); Console.WriteLine(ind1); }
public void OnePointCrossoverTest() { IChromosome<int> a = new DigitalChromosome().GenerateFromArray(new int[] { 1, 2, 3, 4 }); IChromosome<int> b = new DigitalChromosome().GenerateFromArray(new int[] { 4, 3, 2, 1 }); OnePointCrossover<int> cross = new OnePointCrossover<int>(2); IChromosome<int>[] res = cross.Crossover(a, b); IChromosome<int>[] exp = new IChromosome<int>[2] { new DigitalChromosome().GenerateFromArray(new int[] { 1, 2, 2, 1 }), new DigitalChromosome().GenerateFromArray(new int[] { 4, 3, 3, 4 }) }; CollectionAssert.AreEqual(res, exp); }
public void NoCommonRegionCrossoverTest() { var converter = new MathExpressionConverter(MathPrimitiveSets.Default); var prog1 = converter.FromNormalNotation("sin((1-2))"); var prog2 = converter.FromNormalNotation("((2+3)-1)"); Console.WriteLine($"{prog1}, {prog2}"); var op = new OnePointCrossover <MathProgram, double>(); var allProgs = new HashSet <MathProgram>(op.GetAllOffspring(prog1, prog2)); var prog = op.Crossover(prog1, prog2); Assert.IsTrue(allProgs.Contains(prog2), $"{prog} should be a valid crossover between {prog1} and {prog2}."); Assert.IsTrue(prog.Equals(prog2), $"{prog} should be the only valid crossover between {prog1} and {prog2}."); Assert.AreEqual(allProgs.Count, 1, double.Epsilon, $"Crossover between {prog1} and {prog2} should only have 1 element."); }