public void TrainMiniBatch_ConvergenceTest_ValuesNOT01() { // Arrange ANeuralNetwork ANN = new ANeuralNetwork(); ANN.Load_Network("Test.net"); List <List <double> > InputData = new List <List <double> > { new List <double> { 10, 10 } }; List <List <double> > OutputData = new List <List <double> > { new List <double> { 10 } }; // Act ANN.Train_MiniBatch(InputData, OutputData, InputData.Count, "MiniBatch_Convergence.dat"); List <double> Result = ANN.Get_Network_Output(InputData[0]); // Assert Console.Write("Output = " + Result[0]); Assert.AreNotEqual(OutputData[0][0], Math.Round(Result[0], 1)); }
public void TrainMiniBatch_XORGateTest_SingleBatch() { // Arrange ANeuralNetwork ANN = new ANeuralNetwork(); ANN.Create_Network(new List <int> { 2, 3, 1 }); List <List <double> > InputData = new List <List <double> > { new List <double> { 1, 1 }, new List <double> { 0, 1 }, new List <double> { 1, 0 }, new List <double> { 0, 0 }, }; List <List <double> > OutputData = new List <List <double> > { new List <double> { 0 }, new List <double> { 1 }, new List <double> { 1 }, new List <double> { 0 } }; List <List <double> > ValidationData = new List <List <double> > { new List <double> { 1, 1 }, new List <double> { 0, 1 }, new List <double> { 1, 0 }, new List <double> { 0, 0 }, }; List <double> ExpectedOutput = new List <double> { 0, 1, 1, 0 }; // Act ANN.Train_MiniBatch(InputData, OutputData, InputData.Count, "XOR_SinleBatch.dat"); List <double> Results = new List <double> { }; for (int i = 0; i < 4; i++) { List <double> result = ANN.Get_Network_Output(ValidationData[i]); Results.Add(Math.Round(result[0], 0)); Console.Write("Output = " + Results[i] + " "); } // Assert CollectionAssert.AreEqual(ExpectedOutput, Results); }
// Main Functions public List <int> MakeMove(List <int> GameState, int Player, bool Training = false) { // Get all vaild moves List <double> GameBoard = GameState.Select <int, double>(i => i).ToList(); NormaliseData(GameBoard); List <double> MoveList = ANN.Get_Network_Output(GameBoard); // Remove impossible moves for (int Move = 0; Move < MoveList.Count; Move++) { if (GameState[Move] != 0) { MoveList[Move] = 0; } } // Select move int SelectedMove; if (Training == true) { //SelectedMove = MakeRandomMove(MoveList); // returns random move -> un directed search for optimal move //SelectedMove = MoveList.IndexOf(MoveList.Max()); // Selects only best move -> limits seach for optimal moves SelectedMove = SelectMoveBasedOnProbability(MoveList); // Employs sofmax function to choose move (only applies softmax to non 0 elements of MoveList). -> randomly selects move based on probility distrubution // Save move and score to episodedata to retrain network later List <double> ActionRow = new List <double> { }; ActionRow.AddRange(GameBoard); ActionRow.AddRange(MoveList); ActionRow.Add((SelectedMove + 9)); EpisodeData.Add(ActionRow); } else { SelectedMove = MoveList.IndexOf(MoveList.Max()); // Selects only best move -> limits seach for optimal moves } // build resulting game board List <int> NewGameBoard = new List <int> { }; for (int Square = 0; Square < GameBoard.Count; Square++) { if (Square == SelectedMove) { NewGameBoard.Add(Player); } else { NewGameBoard.Add(Convert.ToInt32(GameState[Square])); } } return(NewGameBoard); }
public void GetNetworkOutput_CheckOutputCorrect() { // Arrange ANeuralNetwork ANN = new ANeuralNetwork(); ANN.Load_Network("Test.net"); List <double> InputData = new List <double> { 0.1, 0.9 }; double DesiredOutput = 0.60761339; // Act List <double> Output = ANN.Get_Network_Output(InputData); // Assert Assert.AreEqual(DesiredOutput, Math.Round(Output[0], 8)); }