public Wave GetPossibleSolution() { int waveCount = _random.Next(maxWaves) + 1; var wave = new ResultWave(); for (int i = 0; i < waveCount; i++) { Wave newWave = null; switch (_random.Next(2)) { case 0: newWave = GetNewSquareWave(); break; case 1: newWave = GetNewTriangleWave(); break; } wave.AddWave(newWave); } return(wave); }
public static void Main() { var random = new Random(); _engine = new Engine <Wave>(new EngineParameters <Wave> { MutationRate = 50, PopulationSize = 1000, BestParents = 5, Survivors = 20, FitnessFunction = AbsoluteDifference, RandomSolutionFactory = new RandomWaveFactory() }); _myWave = new ResultWave(); _myWave.AddWave(new SquareWave(127, 64, 40, 10)); _myWave.AddWave(new TriangleWave(63, 25, 25, 0, 5)); _constWave = new byte[Length]; _constWave = _myWave.Generate(Length); _engine.AddCrossover((w1, w2) => { var result = new ResultWave(); foreach (var wave in w1.Waves()) { if (random.Next(2) == 0) { result.AddWave(wave); } } foreach (var wave in w2.Waves()) { if (random.Next(2) == 0) { result.AddWave(wave); } } return(result); } ); _engine.AddMutation(m => { if (m is ResultWave && m.Waves().Count > 0) { m.Waves().RemoveAt(random.Next(m.Waves().Count)); } }); _engine.AddMutation(m => { if (m is ResultWave) { m.Waves().Add(RandomWaveFactory.GetNewSquareWave()); } }); _engine.AddMutation(m => { if (m is ResultWave) { m.Waves().Add(RandomWaveFactory.GetNewTriangleWave()); } }); var window = new RenderWindow(VideoMode.DesktopMode, "Test"); window.Closed += OnClosed; window.KeyPressed += OnKeyPressed; var task = new Task(() => _engine.RunIterations(new Termination <Wave>[] { new NumberOfIterationsTermination <Wave>(100) })); task.Start(); while (window.IsOpen()) { window.DispatchEvents(); window.Clear(); RenderWaves(window); RenderGeneration(window); window.Display(); } }