예제 #1
0
        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);
        }
예제 #2
0
        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();
            }
        }