/// <summary> /// Reset the board and variables for new match /// </summary> public void InitNewGame() { p1.NewGame(); p2.NewGame(); turnCount = 0; prevRuns = new List <FFData>(); currRun = new FFData(); prevStates = new List <Board>(); matchOver = false; noMovesFound = false; turnComplete = false; firstTurn = true; //Reset elgibility trace if (training) { p1.ResetNNTraceValues(); } //initialise board (This will generate a board with initial game setup by default) boardState = new Board(); activeSide = 1; //If player is human, generate valid move list if ((activeSide == p1Side && p1.GetType() == PlayerType.Human) || (activeSide == (3 - p1Side) && p2.GetType() == PlayerType.Human)) { validMoves = GenerateValidMoveList(boardState, activeSide); if (validMoves.Count == 0) { turnComplete = true; } } EventManager.TriggerEvent("gameReset"); }
// Update is called once per frame public FFData FeedForward(double[] _inputFeatures) { FFData data = new FFData(); data.input = _inputFeatures; //Add bias unit to input array data.a1 = DenseMatrix.Create(1, 1, 1).Append(DenseVector.OfArray(_inputFeatures).ToRowMatrix()); //Multiple input array (a1) by weights for each node in hidden layer to produce number at each node data.z2 = data.a1.Multiply(theta1.Transpose()); //Run logistic function on results to squash data.a2 = MatrixSigmoid(data.z2); //Add bias unit to results of hidden layer data.a2 = DenseMatrix.Create(1, 1, 1).Append(data.a2); //Multiply results of hidden layer with weights for output node to produce final result data.z3 = data.a2.Multiply(theta2.Transpose()); //Squash final result data.a3 = MatrixSigmoid(data.z3); //As we are using only 1 output, result is a 1x1 matrix return(data); }
public void BackPropagate(FFData prevRun, FFData currRun, double alpha, double lambda) { theta2 = theta2 + alpha * (currRun.a3[0, 0] - prevRun.a3[0, 0]) * e_theta2.Transpose(); theta1 = theta1 + alpha * (currRun.a3[0, 0] - prevRun.a3[0, 0]) * e_theta1; FFData newRun = FeedForward(currRun.input); e_theta2 = lambda * e_theta2 + (1 - newRun.a3[0, 0]) * newRun.a3[0, 0] * newRun.a2.Transpose(); e_theta1 = lambda * e_theta1 + ((1 - newRun.a3[0, 0]) * newRun.a3[0, 0] * (((1 - newRun.a2.RemoveColumn(0)).PointwiseMultiply(newRun.a2.RemoveColumn(0))).PointwiseMultiply(theta2.RemoveColumn(0)).Transpose()) * newRun.a1); }
public FFData Clone() { FFData returnData = new FFData(); returnData.input = (double[])input.Clone(); returnData.a1 = a1.Clone(); returnData.z2 = z2.Clone(); returnData.a2 = a2.Clone(); returnData.z3 = z3.Clone(); returnData.a3 = a3.Clone(); return(returnData); }
static public void LogInputFeatures(FFData data) { UnityEngine.Debug.Log("pieceAdvantage: " + data.input[0]); UnityEngine.Debug.Log("pieceDisadvantage: " + data.input[1]); UnityEngine.Debug.Log("pieceTake: " + data.input[2]); UnityEngine.Debug.Log("pieceThreat: " + data.input[3]); UnityEngine.Debug.Log("doubleDiagonal: " + data.input[4]); UnityEngine.Debug.Log("enemyDoubleDiagonal: " + data.input[5]); UnityEngine.Debug.Log("backRowBridge: " + data.input[6]); UnityEngine.Debug.Log("centreControl: " + data.input[7]); UnityEngine.Debug.Log("enemyCentreControl: " + data.input[8]); UnityEngine.Debug.Log("kingCentreControl: " + data.input[9]); UnityEngine.Debug.Log("enemyKingCentreControl: " + data.input[10]); UnityEngine.Debug.Log("stoneCount: " + data.input[11]); UnityEngine.Debug.Log("enemystoneCount: " + data.input[12]); UnityEngine.Debug.Log("kingCount: " + data.input[13]); UnityEngine.Debug.Log("enemyKingCount: " + data.input[14]); }
public void TrainNet(FFData _prevRun, FFData _currRun, double _alpha, double _lambda) { net.BackPropagate(_prevRun, _currRun, _alpha, _lambda); }
public float GetBoardRating(Board board, int _activePlayer, out FFData data) { //pieceAdvantage : 0; //pieceDisadvantage : 1; //pieceTake : 2; //pieceThreat : 3; //doubleDiagonal : 4; //enemyDoubleDiagonal : 5; //backRowBridge : 6; //centreControl : 7; //enemyCentreControl : 8; //kingCentreControl : 9; //enemyKingCentreControl: 10; //stoneCount : 11; //enemystoneCount : 12; //kingCount : 13; //enemyKingCount : 14; double[] dataArray = new double[15]; for (int i = 0; i < dataArray.Length; i++) { dataArray[i] = 0; } if (_activePlayer == 1) { if ((board.state[0] == TileState.BlackKing || board.state[0] == TileState.BlackPiece) && (board.state[2] == TileState.BlackKing || board.state[2] == TileState.BlackPiece)) { dataArray[6] = 1; } for (int i = 0; i < centreTiles.Length; i++) { TileState state = board.state[centreTiles[i]]; if (state == 0) { continue; } if (state == TileState.BlackPiece) { dataArray[7]++; dataArray[11]++; } else if (state == TileState.WhitePiece) { dataArray[8]++; dataArray[12]++; } else if (state == TileState.BlackKing) { dataArray[9]++; dataArray[13]++; } else if (state == TileState.WhiteKing) { dataArray[10]++; dataArray[14]++; } } for (int i = 0; i < doubleDiagonals.Length; i++) { TileState state = board.state[doubleDiagonals[i]]; if (state == 0) { continue; } if (state == TileState.BlackPiece) { dataArray[4]++; dataArray[11]++; } else if (state == TileState.WhitePiece) { dataArray[5]++; dataArray[12]++; } else if (state == TileState.BlackKing) { dataArray[4]++; dataArray[13]++; } else if (state == TileState.WhiteKing) { dataArray[5]++; dataArray[14]++; } } for (int i = 0; i < centreDoubleDiagonals.Length; i++) { TileState state = board.state[centreDoubleDiagonals[i]]; if (state == 0) { continue; } if (state == TileState.BlackPiece) { dataArray[7]++; dataArray[4]++; dataArray[11]++; } else if (state == TileState.WhitePiece) { dataArray[8]++; dataArray[5]++; dataArray[12]++; } else if (state == TileState.BlackKing) { dataArray[9]++; dataArray[4]++; dataArray[13]++; } else if (state == TileState.WhiteKing) { dataArray[10]++; dataArray[5]++; dataArray[14]++; } } for (int i = 0; i < otherTiles.Length; i++) { TileState state = board.state[otherTiles[i]]; if (state == 0) { continue; } if (state == TileState.BlackPiece) { dataArray[11]++; } else if (state == TileState.WhitePiece) { dataArray[12]++; } else if (state == TileState.BlackKing) { dataArray[13]++; } else if (state == TileState.WhiteKing) { dataArray[14]++; } } } else { if ((board.state[34] == TileState.WhiteKing || board.state[34] == TileState.WhitePiece) && (board.state[32] == TileState.WhiteKing || board.state[32] == TileState.WhitePiece)) { dataArray[6] = 1; } for (int i = 0; i < centreTiles.Length; i++) { TileState state = board.state[centreTiles[i]]; if (state == 0) { continue; } if (state == TileState.BlackPiece) { dataArray[8]++; dataArray[12]++; } else if (state == TileState.WhitePiece) { dataArray[7]++; dataArray[11]++; } else if (state == TileState.BlackKing) { dataArray[10]++; dataArray[14]++; } else if (state == TileState.WhiteKing) { dataArray[9]++; dataArray[13]++; } } for (int i = 0; i < doubleDiagonals.Length; i++) { TileState state = board.state[doubleDiagonals[i]]; if (state == 0) { continue; } if (state == TileState.BlackPiece) { dataArray[5]++; dataArray[12]++; } else if (state == TileState.WhitePiece) { dataArray[4]++; dataArray[11]++; } else if (state == TileState.BlackKing) { dataArray[5]++; dataArray[14]++; } else if (state == TileState.WhiteKing) { dataArray[4]++; dataArray[13]++; } } for (int i = 0; i < centreDoubleDiagonals.Length; i++) { TileState state = board.state[centreDoubleDiagonals[i]]; if (state == 0) { continue; } if (state == TileState.BlackPiece) { dataArray[8]++; dataArray[5]++; dataArray[12]++; } else if (state == TileState.WhitePiece) { dataArray[7]++; dataArray[4]++; dataArray[11]++; } else if (state == TileState.BlackKing) { dataArray[10]++; dataArray[5]++; dataArray[14]++; } else if (state == TileState.WhiteKing) { dataArray[9]++; dataArray[4]++; dataArray[13]++; } } for (int i = 0; i < otherTiles.Length; i++) { TileState state = board.state[otherTiles[i]]; if (state == 0) { continue; } if (state == TileState.BlackPiece) { dataArray[12]++; } else if (state == TileState.WhitePiece) { dataArray[11]++; } else if (state == TileState.BlackKing) { dataArray[14]++; } else if (state == TileState.WhiteKing) { dataArray[13]++; } } } dataArray[0] = dataArray[11] + dataArray[13] - dataArray[12] - dataArray[14]; dataArray[1] = -dataArray[0]; if (dataArray[0] < 0) { dataArray[0] = 0; } if (dataArray[1] < 0) { dataArray[1] = 0; } dataArray[2] = board.GetCapThreats(_activePlayer); dataArray[3] = board.GetCapThreats(3 - _activePlayer); data = net.FeedForward(dataArray); int winner; if (CheckersMain.CheckForWinner(board, _activePlayer, out winner)) { if (winner == _activePlayer) { return(1); } else if (winner == 3 - _activePlayer) { return(0); } } return((float)data.a3[0, 0]); }