public MelodySequence Generate() { NoteGene baseGene = new NoteGene(GPGeneType.Function); baseGene.Function = NoteGene.FunctionTypes.Concatenation; GPCustomTree tree = new GPCustomTree(baseGene); if (base_seq != null) { tree.Generate(base_seq.ToArray()); tree.Mutate(); tree.Crossover(tree); int length = base_seq.Length; int depth = (int)Math.Ceiling(Math.Log(length, 2)); GPCustomTree.MaxInitialLevel = depth - 2; GPCustomTree.MaxLevel = depth + 5; } var selection = new EliteSelection(); pop = new Population(30, tree, fitnessFunction, selection); pop.AutoShuffling = true; pop.CrossoverRate = 0.9; pop.MutationRate = 0.1; int percentage = MaxGenerations / 100; for (int i = 0; i < MaxGenerations; i++) { if(i>percentage) { if (OnPercentage != null) OnPercentage(this, i, pop.FitnessAvg); percentage += MaxGenerations / 100; } pop.RunEpoch(); if ((int)(i) % 100 == 0) Console.WriteLine(i / (float)MaxGenerations * 100 + "% : " + pop.FitnessAvg); } GPCustomTree best = pop.BestChromosome as GPCustomTree; var notes = best.GenerateNotes(); return new MelodySequence(notes); }
/// <summary> /// Initializes a new instance of the <see cref="GPTreeChromosome"/> class. /// </summary> /// /// <param name="source">Source genetic tree to clone from.</param> /// /// <remarks><para>This constructor creates new genetic tree as a copy of the /// specified <paramref name="source"/> tree.</para></remarks> /// protected GPCustomTree(GPCustomTree source) { root = (GPCustomTreeNode)source.root.Clone(); fitness = source.fitness; }