MiniMax搜索递归不正确

时间:2016-10-16 04:56:19

标签: c++11 recursion minimax

我正在尝试编写一个AI来玩ConnectK(连接4游戏,需要连接k个部分,重力可以打开或关闭)。这是我使用Minimax算法获得最佳移动的功能。

struct MoveNode //This struct is defined in header file
{
    MoveNode() {};
    MoveNode(int Score) : score(Score) {}
    Move move;
    int score;
};

MoveNode AIShell::getBestMove(int depth, int player) {//Find the best move using MiniMax
    if (depth <= 0) 
        return MoveNode(heuristic());
    else if (boardIsFull() && getWinner() == 0)//Tie
        return 0;
    else if (getWinner() == AI_PIECE)
        return 100000;
    else if (getWinner() == HUMAN_PIECE)
        return -100000;

    std::vector<MoveNode> mds;

    for (auto i : getMoveList()) {//For each available move
        MoveNode md;
        md.move = i; //i is Move(col,row)
        gameState[i.col][i.row] = player;
        if (player == AI_PIECE) {
            md.score = getBestMove(depth - 1, HUMAN_PIECE).score;
        }
        else {
            md.score = getBestMove(depth - 1, AI_PIECE).score;
        }
        mds.push_back(md);
    }

    //Get the best move after recursion
    int best_move_index = 0;
    if (player == AI_PIECE) {
        int best_score = -1000000;
        for (int i = 0; i < mds.size(); i++) {
            if (mds[i].score > best_score) {
                best_move_index = i;
                best_score = mds[i].score;
            }
        }
    } else if (player == HUMAN_PIECE) {
        int best_score = 1000000;
        for (int i = 0; i < mds.size(); i++) {
            if (mds[i].score < best_score) {
                best_move_index = i;
                best_score = mds[i].score;
            }
        }
    }
    return mds[best_move_index];
} 

getBestMove()函数似乎正在做一些我不太喜欢的事情。该函数将尝试在递归之前获得最佳移动,并且AI转向和人类转向不会被递归地均匀处理。我花了很长时间调试这个功能,但仍然无法解决这个问题。抱歉我的英语不好,但我真的很感激这里的帮助。提前致谢。

1 个答案:

答案 0 :(得分:0)

您正在返回最佳移动指数。 minimax树必须返回节点值(best_score),而不是最佳移动。您应该返回最佳移动的唯一时间是在根节点处,以便通过为您提供最佳移动来终止搜索。