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); } }
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}"); }
private void ResetState() { if (_trainingState == TrainingState.Paused) { _trainingProgressBox.WriteLine("Destroying previous session..."); _sessionStatistics.Reset(); } _neatTrainer = null; _trainingState = TrainingState.Uninitialised; }
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."); }
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; }