如何在minimax树中存储最佳价值的第一步?

时间:2019-06-18 17:30:11

标签: minimax

我有一个极小极大树和一个评估函数。极小极大函数仅返回一个整数(最佳值)。我如何存储建立的最佳值的第一步? 这是我的代码:

    int Brain::MiniMax(GameBoard gb, int depth,int Turn,int lastcount) //0->Max 1->Min
{   
    if (depth == 5)
        return Evaluation(lastcount, gb);
    int bestval = 0;
    if (Turn == 0)
    {
        bestval = -100;
        vector<pair<int, pair<int, int>>> possibleFences = this->PossibleFences(gb);
        for (int i = 0; i < possibleFences.size(); i++)//ForFences
        {
            int cnt = 0;
            NextShortestPathMove(cnt, gb.OpponentPawn,gb);
            if (gb.CanPutFence(possibleFences[i].first, possibleFences[i].second.first, possibleFences[i].second.second) == 0)
                continue;
            gb.PutFence(possibleFences[i].second.first, possibleFences[i].second.second, possibleFences[i].first);          
            int value = MiniMax(gb, depth + 1,1, cnt);
            if (value > bestval)
            {
                bestval = value;
                move = possibleFences[i];
            }
        }
        return bestval;
    }
    else if (Turn == 1)
    {
        bestval = +100;
        int** possibleMoves = this->PossibleMoves(gb.OpponentPawn.Row, gb.OpponentPawn.Column, gb.OpponentPawn,gb);

        for (int i = 0; i < 6; i++)
        {
            if (possibleMoves[i][0] == -1)
                continue;
            int cnt = 0;
            NextShortestPathMove(cnt, gb.OpponentPawn,gb);
            gb.MoveOpponentPlayer(possibleMoves[i][0], possibleMoves[i][1]);
            int value = MiniMax(gb, depth + 1, 0,cnt);
            bestval = min(value, bestval);
        }
        return bestval;
    }   
}

例如,如果bestval = 10,最后我要选择此bestval的第一步。现在,我将移动存储在“移动”变量中,但无法正常工作。

1 个答案:

答案 0 :(得分:0)

在实际的极小极大算法实现中,哈希表用于输入评估的分数和动作,包括哈希键,该值对于玩家和棋子的每个位置都是唯一的。这在实施“强制移动”过程中也很有用。

在移动评估期间,哈希键,得分和移动位置都记录在结构和哈希表中。因此,在成功搜索之后,将返回整个结构以启用图形和游戏状态的更新。

典型的哈希条目如下所示:

struct HashEntry {
    int move;
    int score;
    int depth;
    uint64_t posKey;
    int flags;
};