public override SolutionProgram search(TimeSpan timeLimit) { watch.Start(); SolutionProgram current = new SolutionProgram((DirectiveNode)SearchMethodsSupport.createRandomTree(NodeClass.directive, profile, 3)); int steps = 0; while (watch.Elapsed < timeLimit) { steps++; mutatedPrograms.Clear(); for (int i = 0; i < mutationsInStep; i++) { SolutionProgram mutated = (SolutionProgram)current.Clone(); mutator.modify(mutated); mutatedPrograms.Add(new EvaluatedEntity <SolutionProgram>(mutated, 0)); } mutatedPrograms.Add(new EvaluatedEntity <SolutionProgram>(new SolutionProgram((DirectiveNode)SearchMethodsSupport.createRandomTree(NodeClass.directive, profile, 3)), 0)); addEvaluation(batchSize, mutatedPrograms); var selected = selector.select(mutatedPrograms); if (selected.value >= 99) //more than 99% accuracy reached -> ending the search. { printMSG(selected.value.ToString()); return(selected.item); } printMSG("Steps: " + steps); printMSG("Best evaluation: " + mutatedPrograms.Max(p => p.value)); printMSG("Best program: " + mutatedPrograms.Where(p => p.value >= mutatedPrograms.Max(q => q.value)).First().item.ToString()); } watch.Stop(); return(mutatedPrograms.Where(p => p.value >= mutatedPrograms.Max(q => q.value)).First().item); }
/// <summary> /// To test the Clone() method /// </summary> /// <param name="args"></param> static void Main3(string[] args) { NodeTypeFrequencyProfile p = NodeTypeFrequencyProfile.createProfile(new List <SolutionProgram> { getProgram0(), getProgram1(), getProgram2() }, true); for (int i = 0; i < 50; i++) { Console.WriteLine("New random program:"); SolutionProgram pr = new SolutionProgram((DirectiveNode)SearchMethodsSupport.createRandomTree(NodeClass.directive, p, 10)); Console.WriteLine(pr.ToString()); new GraphVisualizer().visualizeDialog(ProgramTreeDrawer.createGraph(pr)); Console.WriteLine(); Console.WriteLine("CLONE:"); SolutionProgram clon = (SolutionProgram)pr.Clone(); Console.WriteLine(clon.ToString()); new GraphVisualizer().visualizeDialog(ProgramTreeDrawer.createGraph(clon)); Console.WriteLine(); } }