コード例 #1
0
        private async Task OnClassifyWann()
        {
            try
            {
                var trainer     = new NeatTrainer();
                var unitedArray = new double[FirstClass.Vector.GetLength(0) + SecondClass.Vector.GetLength(0), 3];

                var counter = 0;

                for (var i = 0; i < FirstClass.Vector.GetLength(0); i++)
                {
                    unitedArray[counter, 0] = FirstClass.Vector[i, 0];
                    unitedArray[counter, 1] = FirstClass.Vector[i, 1];
                    unitedArray[counter, 2] = 0;
                    counter++;
                }

                for (var i = 0; i < SecondClass.Vector.GetLength(0); i++)
                {
                    unitedArray[counter, 0] = SecondClass.Vector[i, 0];
                    unitedArray[counter, 1] = SecondClass.Vector[i, 1];
                    unitedArray[counter, 2] = 1;
                    counter++;
                }

                var index = 0;
                while (index < unitedArray.GetLength(0))
                {
                    var selectedIndexFrom = random.Next(unitedArray.GetLength(0));
                    var x1  = unitedArray[index, 0];
                    var x2  = unitedArray[index, 1];
                    var cls = unitedArray[index, 2];
                    unitedArray[index, 0]             = unitedArray[selectedIndexFrom, 0];
                    unitedArray[index, 1]             = unitedArray[selectedIndexFrom, 1];
                    unitedArray[index, 2]             = unitedArray[selectedIndexFrom, 2];
                    unitedArray[selectedIndexFrom, 0] = x1;
                    unitedArray[selectedIndexFrom, 1] = x2;
                    unitedArray[selectedIndexFrom, 2] = cls;
                    index++;
                }

                var trainInput    = new double[unitedArray.GetLength(0) / 2][];
                var trainExpected = new double[unitedArray.GetLength(0) / 2][];

                for (var i = 0; i < trainInput.GetLength(0); i++)
                {
                    trainInput[i]    = new[] { unitedArray[i, 0], unitedArray[i, 1] };
                    trainExpected[i] = new[] { unitedArray[i, 2] };
                }

                var weights = new[] { -2.0, -1.0, -0.5, 0.5, 1.0, 2.0 };
                trainer.Train(trainInput, trainExpected, weights, 0.1);
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message, "Error", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }
コード例 #2
0
ファイル: Program.cs プロジェクト: alexjneves/Neuromon
        private static void Main()
        {
            var neuromonExperimentSettingsJson = File.ReadAllText(NeuromonExperimentSettingsFileName);
            var evolutionAlgorithmParametersJson = File.ReadAllText(EvolutionAlgorithmParametersFileName);
            var trainingGameSettingsJson = File.ReadAllText(TrainingGameSettingsFileName);

            var experimentSettings = JsonConvert.DeserializeObject<ExperimentSettings>(neuromonExperimentSettingsJson);
            var evolutionAlgorithmParameters =
                JsonConvert.DeserializeObject<NeatEvolutionAlgorithmParameters>(evolutionAlgorithmParametersJson);
            var trainingGameSettings = JsonConvert.DeserializeObject<TrainingGameSettings>(trainingGameSettingsJson);

            var neatTrainer = new NeatTrainer(experimentSettings, evolutionAlgorithmParameters, trainingGameSettings);

            neatTrainer.OnStatusUpdate += (generation, highestFitness, averageFitness) =>
            {
                if (!_quit)
                {
                    System.Console.WriteLine($"Generation: {generation}, Best Fitness: {highestFitness:000.000}, Average Fitness: {averageFitness:000.000}");
                    _trainingStopped = false;
                }
            };

            neatTrainer.OnTrainingPaused += () =>
            {
                System.Console.WriteLine($"Training has been paused. Press {ResumeKey} to resume.");
                _trainingStopped = true;
            };

            if (experimentSettings.StopTrainingOnStagnationDetection)
            {
                neatTrainer.OnStagnationDetected += () =>
                {
                    System.Console.WriteLine("Stagnation detected, stopping training...");
                    neatTrainer.StopTraining();
                };
            }
            else
            {
                neatTrainer.OnStagnationDetected += () => System.Console.WriteLine("Stagnation detected.");
            }

            neatTrainer.OnHighestFitnessAchieved += fitness =>
            {
                _highestFitness = fitness;
            };

            neatTrainer.OnDesiredFitnessAchieved += () =>
            {
                System.Console.WriteLine(
                    $"Desired fitness of {experimentSettings.DesiredFitness} has been achieved. Training will be stopped.");
            };

            System.Console.WriteLine($"Press {QuitKey} to quit, {PauseKey} to pause and {ResumeKey} to resume training.");

            neatTrainer.StartTraining();

            var keyPressed = ResumeKey;
            while (keyPressed != QuitKey)
            {
                keyPressed = System.Console.ReadKey().Key;
                System.Console.WriteLine();

                switch (keyPressed)
                {
                    case ResumeKey:
                    {
                        if (_trainingStopped)
                        {
                            System.Console.WriteLine("Resuming training...");
                            neatTrainer.StartTraining();
                        }
                        else
                        {
                            System.Console.WriteLine("Already training.");
                        }
                    }
                    break;
                    case PauseKey:
                    {
                        if (!_trainingStopped)
                        {
                            System.Console.WriteLine("Stopping training...");
                            neatTrainer.StopTraining();
                        }
                        else
                        {
                            System.Console.WriteLine("Already stopped.");
                        }
                    }
                    break;
                    case QuitKey:
                    {
                        _quit = true;
                        System.Console.WriteLine("Quitting training...");

                        if (!_trainingStopped)
                        {
                            neatTrainer.StopTraining();
                        }
                    }
                    break;
                }
            }

            System.Console.WriteLine("Saving...");

            neatTrainer.SavePopulation(experimentSettings.OutputPopulationFilePath);
            neatTrainer.SaveChampionGenome(experimentSettings.OutputChampionFilePath);

            System.Console.WriteLine($"Saved population to {Path.GetFullPath(experimentSettings.OutputPopulationFilePath)}");
            System.Console.WriteLine($"Saved champion to to {Path.GetFullPath(experimentSettings.OutputChampionFilePath)}");

            System.Console.WriteLine();
            System.Console.WriteLine($"Highest fitness achieved: {_highestFitness}");
        }
コード例 #3
0
        private void ResetState()
        {
            if (_trainingState == TrainingState.Paused)
            {
                _trainingProgressBox.WriteLine("Destroying previous session...");
                _sessionStatistics.Reset();
            }

            _neatTrainer = null;
            _trainingState = TrainingState.Uninitialised;
        }
コード例 #4
0
        private void CreateSessionButton_Click(object sender, RoutedEventArgs e)
        {
            if (_trainingState == TrainingState.AutoSaving)
            {
                _trainingProgressBox.WriteLine("Please wait for auto save to complete.");
                return;
            }

            if (!(_trainingState == TrainingState.Paused || _trainingState == TrainingState.Uninitialised))
            {
                _trainingProgressBox.WriteLine("Please pause the current session before creating a new one.");
                return;
            }

            _trainingProgressBox.Clear();
            ResetState();

            if (!ValidateFields())
            {
                _trainingProgressBox.WriteLine("Could not create session. Please fix the invalid configuration settings.");
                return;
            }

            _neatTrainer = CreateTrainingSession();
            _trainingState = TrainingState.Paused;

            _trainingProgressBox.WriteLine("Created a new training session.");
        }
コード例 #5
0
        private NeatTrainer CreateTrainingSession()
        {
            var neatTrainer = new NeatTrainer(TrainerViewModel.ExperimentSettings, TrainerViewModel.NeatEvolutionAlgorithmParameters, TrainerViewModel.TrainingGameSettings);

            neatTrainer.OnStatusUpdate += (generation, highestFitness, averageFitness) =>
            {
                if (_trainingState == TrainingState.AwaitingTraining)
                {
                    _trainingState = TrainingState.Training;
                }

                _sessionStatistics.CurrentGeneration = generation;
                _sessionStatistics.CurrentAverageFitness = averageFitness;

                _trainingProgressBox.WriteStatusUpdate(generation, highestFitness, averageFitness);
            };

            neatTrainer.OnTrainingPaused += () =>
            {
                _sessionStatistics.StopTimer();
                _dispatcherTimer.Stop();

                if (_trainingState == TrainingState.AutoSaving)
                {
                    PerformAutoSave();
                }
                else
                {
                    _trainingState = TrainingState.Paused;
                    _trainingProgressBox.WriteLine("Training paused.");
                }
            };

            var stagnationDetectedMessage =
                $"Stagnation detected: Previous {TrainerViewModel.ExperimentSettings.StagnationDetectionTriggerValue} generations had the same fitness value.";

            if (TrainerViewModel.ExperimentSettings.StopTrainingOnStagnationDetection)
            {
                neatTrainer.OnStagnationDetected += () =>
                {
                    OnStagnationDetected(stagnationDetectedMessage);

                    if (_trainingState == TrainingState.Training)
                    {
                        _trainingProgressBox.WriteLine("Auto stop enabled, training will now be paused...");
                        PauseTraining();
                    }
                };
            }
            else
            {
                neatTrainer.OnStagnationDetected += () => OnStagnationDetected(stagnationDetectedMessage);
            }

            neatTrainer.OnHighestFitnessAchieved += fitness =>
            {
                _sessionStatistics.OverallHighestFitness = fitness;
            };

            neatTrainer.OnDesiredFitnessAchieved += () =>
            {
                _sessionStatistics.DesiredFitnessAchieved = true;
                _trainingProgressBox.WriteLine("Desired fitness has been achieved.");
            };

            return neatTrainer;
        }