Ejemplo n.º 1
0
    /// <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");
    }
Ejemplo n.º 2
0
    // 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);
    }
Ejemplo n.º 3
0
    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);
    }
Ejemplo n.º 4
0
    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);
    }
Ejemplo n.º 5
0
 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]);
 }
Ejemplo n.º 6
0
 public void TrainNet(FFData _prevRun, FFData _currRun, double _alpha, double _lambda)
 {
     net.BackPropagate(_prevRun, _currRun, _alpha, _lambda);
 }
Ejemplo n.º 7
0
    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]);
    }