コード例 #1
0
        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));
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        // 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);
        }
コード例 #4
0
        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));
        }