我想知道是否有人可以帮助我理解如何将换位表合并到Hypermax算法中。任何示例,伪代码,技巧或实现参考都将不胜感激!
一些背景知识:
在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;
}
}
}
参考:
答案 0 :(得分:0)
问题很广泛,所以答案也差不多-如果有特定的问题,请说明您不明白的地方。
在多人游戏中,不能保证换位表是正确的,但是如果认真实现,就可以。本文对此进行了简要讨论:
Multi-Player Games, Algorithms and Approaches
总而言之,关于移调需要注意三件事 多人游戏树中的游戏桌。首先,他们要求我们 与我们的节点顺序一致。其次,它们可以更少 比两人游戏更有效,因为它需要更多的时间 移动发生换位。最后,推测性修剪可以 受益于换位表,因为它们可以抵消 重新搜索游戏树的各个部分。
除了订购问题外,您可能还需要存储诸如分支下的搜索深度,下一个要玩的玩家以及用于修剪子树的范围之类的内容。例如,如果您在第一次搜索中修剪树的界限不同,那么在第二次搜索中可能无法产生正确的结果。
HyperMax只是Max ^ n的少量变体,具有推测性修剪功能,因此您可能需要查看该上下文,看看是否可以在Max ^ n中实现。