public GeneticAlgorithm(int _genome_size, IProcreator <T> _procreator, ISelector <T> _selector, IPopulationGenerator <T> _generator, Goal _goal, Random _random, string _name) { procreator = _procreator; selector = _selector; generator = _generator; goal = _goal; genome_size = _genome_size; name = _name; random = _random; }
public void Step(int survivors, ISelector selector, IProcreator procreator, IEvaluator evaluator, Random random) { pooledPopulation.Clear(); for (int i = 0; i < survivors; i++) { pooledPopulation.Append().GetChromosome().AddRange(CurrentPopulation.ReadOnlyIndividuals[i].Chromosome); } selector.Initialize(CurrentPopulation); while (pooledPopulation.Individuals.Count < CurrentPopulation.ReadOnlyIndividuals.Count) { procreator.Procreate(pooledPopulation.Append().GetChromosome(), selector, random); } pooledPopulation.Freeze(evaluator); Population temp = (Population)CurrentPopulation; CurrentPopulation = pooledPopulation; GenerationCount++; pooledPopulation = temp; }
private void ensureInitialized() { if (precedenceTree == null) { precedenceTree = new PathTree(paths); evaluator = new TravelCostEvaluator(precedenceTree); selector = new RouletteWheelSelector(); IMutator mutator = new ReverseSequenceMutator(); procreator = new SexualProcreator(new ShortestTravelCrossover(precedenceTree), mutator, 0.5); Population genesis = new Population(); Individual individual0 = genesis.Append(); IReadOnlyList <PathNode> nodes = precedenceTree.NearestNeighborTraversal(); List <int> chromosome0 = individual0.GetChromosome(); chromosome0.AddRange(nodes.Select(node => node.Id)); //chromosome0.AddRange(Enumerable.Range(0, precedenceTree.Nodes.Count)); evaluator.Baseline(chromosome0); //List<int> lastChromosome = chromosome0; for (int i = 1; i < 100; i++) { List <int> chromosome = genesis.Append().GetChromosome(); chromosome.AddRange(chromosome0); //chromosome.AddRange(lastChromosome); mutator.Mutate(chromosome, random); //lastChromosome = chromosome; } genesis.Freeze(evaluator); optimizer = new GeneticOptimizer(genesis); maxFitness = double.MinValue; optimalPriorities = new List <int>(); } }