public Organism MakeCrossOver( Organism father ) { Organism child = this.Clone(); MathOp fatherDna = (MathOp)father.GetRandomNode().Clone(); MathOp motherDna = child.GetRandomNode(); motherDna.Left = fatherDna.Left; motherDna.Right = fatherDna.Right; return child; }
public Organism Clone() { Organism clone = new Organism( problem ); clone.root = (MathFunction)this.root.Clone(); return clone; }
static void Main( string[] args ) { int generations = 0; Problem problem = new Problem(); /* problem.Cases.Add( new Case( 2, 2, 6.3 - 2 * 0.7 ) ); problem.Cases.Add( new Case( 1, 2, 2.3 - 1 * 0.7 ) ); problem.Cases.Add( new Case( 3, 1, 4.3 - 3 * 0.7 ) ); problem.Cases.Add( new Case( 1, 1, 0.3 - 1 * 0.7 ) ); problem.Cases.Add( new Case( 10, 10, 198.3 - 10 * 0.7 ) ); */ problem.Cases.Add( new Case( 1, 2, ( 1 * 2 ) + 5 ) ); // 7 problem.Cases.Add( new Case( 2, 4, ( 2 * 4 ) + 5 ) ); // 13 problem.Cases.Add( new Case( 6, 6, ( 6 * 6 ) + 5 ) ); // 41 problem.Cases.Add( new Case( 18, 7, ( 18 * 7 ) + 5 ) ); // 131 List<Organism> organisms = new List<Organism>(); for( int i = 0; i < 20; i++ ) { Organism organism = new Organism( problem ); organisms.Add( organism ); } bool done = false; double bestError = double.MaxValue; double previousError = bestError; Organism bestOrganism = null; double minError = 0.000000000001; double worstError = double.MinValue; Organism worstOrganism = null; while( done == false ) { generations++; foreach( Organism organism in organisms ) { organism.Tick(); if( organism.Error < bestError ) { bestError = organism.Error; bestOrganism = organism; } if( organism.Error > worstError ) { worstError = organism.Error; worstOrganism = organism; } if( organism.Error < minError ) { done = true; break; } } if( Tool.GetInt( 10 ) == 1 ) { organisms.Remove( worstOrganism ); Organism clone = bestOrganism.Clone(); organisms.Add( clone ); } else if( Tool.GetInt( 30 ) == 1 ) { organisms.Remove( worstOrganism ); int index = Tool.GetInt( organisms.Count ); Organism clone = organisms[ index ].Clone(); organisms.Add( clone ); } else if( Tool.GetInt( 100 ) == 1 ) { organisms.Remove( worstOrganism ); int index = Tool.GetInt( organisms.Count ); Organism mother = bestOrganism; Organism father = organisms[ index ]; Organism child = mother.MakeCrossOver( father ); organisms.Add( child ); } worstOrganism = null; worstError = double.MinValue; if( bestError != previousError ) { if( bestOrganism != null ) { Console.ForegroundColor = ConsoleColor.White; if( bestError / previousError < 0.95 ) Console.ForegroundColor = ConsoleColor.Red; else if( bestError / previousError < 0.98 ) Console.ForegroundColor = ConsoleColor.Yellow; Console.WriteLine( "Current Error level {0} - {1}", bestError.ToString( "0.000000000000000" ), bestOrganism.ToString() ); Console.ForegroundColor = ConsoleColor.White; } previousError = bestError; } } Console.WriteLine( "Generations: {0}", generations ); Console.WriteLine(); Console.WriteLine( "solved..." ); Console.WriteLine( bestOrganism ); Console.WriteLine(); Console.WriteLine( "Proof:" ); int oldLength = bestOrganism.ToString().Length; foreach( Case currentCase in problem.Cases ) { double res = bestOrganism.Evaluate( currentCase.X, currentCase.Y ); Console.WriteLine( "x = {0} , y = {1} , goal = {2} , actual = {3}", currentCase.X, currentCase.Y, currentCase.Result, res ); } bestOrganism.Collapse(); while( true ) { bestOrganism.Tick(); int l = bestOrganism.ToString().Length; if( l < oldLength ) { Console.WriteLine( bestOrganism.ToString() ); oldLength = l; } } Console.ReadLine(); }