换位表如何与Hypermax一起使用?

时间:2019-07-10 15:17:23

标签: artificial-intelligence multiplayer minimax

我想知道是否有人可以帮助我理解如何将换位表合并到Hypermax算法中。任何示例,伪代码,技巧或实现参考都将不胜感激!

一些背景知识:

  • Hypermax是用于n玩家的递归游戏树搜索算法 游戏,通常适合3岁以上的玩家。这是minimax和 alpha beta修剪。
  • 通常在游戏树的每个节点上 当前的玩家(选择器)将查看其可以做出的所有动作 然后选择一个最大化自身功能的工具。不同于 minimax / negamax。
  • 我了解换位表的工作原理,但是我 不知道如何使用存储在其中的值来初始化 找到换位表条目时的截止时间。换位 在具有换位和alpha-beta修剪的minimax中,该标志是必需的。 我似乎无法确定如何合并 在这里。

在Javascript中没有换位表的Hypermax算法:

/**
 * @param {*} state A game state object.
 * @param {number[]} alphaVector The alpha vector.
 * @returns {number[]} An array of utility values for each player.
 */
function hypermax(state, alphaVector) {
    // If terminal return the utilities for all of the players
    if (state.isTerminal()) {
        return state.calculateUtilities();
    }

    // Play out each move
    var moves = state.getLegalMoves();
    var bestUtilityVector = null;
    for (var i = 0; i < moves.length; ++i) {
        var move = moves[i];
        state.doMove(move);     // move to child state - updates game board and advances player 1
        var utilityVector = hypermax(state, alphaVector.slice(0));  // copy the alpha values down
        state.undoMove(move);   // return to this state - remove board updates and rollsback player 1

        // Select this as best utility if first found
        if (i === 0) {
            bestUtilityVector = utilityVector;
        }

        // Update alpha
        if (utilityVector[state.currentPlayer] > alpha[state.currentPlayer]) {
            alpha[state.currentPlayer] = utilities[state.currentPlayer];
            bestUtilities = utilityVector;
        }

        // Alpha prune
        var sum = 0;
        for (var j = 0; j < alphaVector.length; ++j) {
            sum += alpha[j];
        }
        if (sum >= 0) {
            break;
        }
    }
}

参考:

1 个答案:

答案 0 :(得分:0)

问题很广泛,所以答案也差不多-如果有特定的问题,请说明您不明白的地方。

在多人游戏中,不能保证换位表是正确的,但是如果认真实现,就可以。本文对此进行了简要讨论:

Multi-Player Games, Algorithms and Approaches

  

总而言之,关于移调需要注意三件事   多人游戏树中的游戏桌。首先,他们要求我们   与我们的节点顺序一致。其次,它们可以更少   比两人游戏更有效,因为它需要更多的时间   移动发生换位。最后,推测性修剪可以   受益于换位表,因为它们可以抵消   重新搜索游戏树的各个部分。

除了订购问题外,您可能还需要存储诸如分支下的搜索深度,下一​​个要玩的玩家以及用于修剪子树的范围之类的内容。例如,如果您在第一次搜索中修剪树的界限不同,那么在第二次搜索中可能无法产生正确的结果。

HyperMax只是Max ^ n的少量变体,具有推测性修剪功能,因此您可能需要查看该上下文,看看是否可以在Max ^ n中实现。