如何知道何时可以停止增加使用negamax alpha beta修剪和换位表的迭代深化算法的深度?以下伪代码取自wiki页面:
function negamax(node, depth, α, β, color)
alphaOrig := α
// Transposition Table Lookup; node is the lookup key for ttEntry
ttEntry := TranspositionTableLookup( node )
if ttEntry is valid and ttEntry.depth ≥ depth
if ttEntry.Flag = EXACT
return ttEntry.Value
else if ttEntry.Flag = LOWERBOUND
α := max( α, ttEntry.Value)
else if ttEntry.Flag = UPPERBOUND
β := min( β, ttEntry.Value)
endif
if α ≥ β
return ttEntry.Value
endif
if depth = 0 or node is a terminal node
return color * the heuristic value of node
bestValue := -∞
childNodes := GenerateMoves(node)
childNodes := OrderMoves(childNodes)
foreach child in childNodes
val := -negamax(child, depth - 1, -β, -α, -color)
bestValue := max( bestValue, val )
α := max( α, val )
if α ≥ β
break
// Transposition Table Store; node is the lookup key for ttEntry
ttEntry.Value := bestValue
if bestValue ≤ alphaOrig
ttEntry.Flag := UPPERBOUND
else if bestValue ≥ β
ttEntry.Flag := LOWERBOUND
else
ttEntry.Flag := EXACT
endif
ttEntry.depth := depth
TranspositionTableStore( node, ttEntry )
return bestValue
这是迭代深化调用:
while(depth < ?)
{
depth++;
rootNegamaxValue := negamax( rootNode, depth, -∞, +∞, 1)
}
当然,当我知道游戏中的总移动次数时,我可以使用深度
简单的回答是:当你的时间用完时(换位表与答案/问题无关)
在这里,我假设您的评估函数是合理的(给出了位置的良好近似值)。
将迭代深化与alpha beta相结合的主要思想如下:让我们假设您有15秒的时间来想出最佳移动。你能搜索多远?我不知道,也没有人知道。您可以尝试搜索到深度=8
才发现搜索在1秒内完成(因此您放弃了可用的14秒时间)。通过反复试验,您发现深度=10
在13秒内为您提供结果。所以您决定一直使用它。但是现在出了大问题(你的阿尔法贝塔修剪得不够好,有些位置需要太多时间来评估),你的结果在15秒内还没有准备好。所以你要么随机移动,要么输掉了比赛。
因此,这种情况永远不会发生,最好准备好一个好的结果。所以您执行以下操作。获取深度=1
的最佳结果并将其存储。找到深度=2
的最佳结果,并覆盖它。依此类推。不时检查还剩多少时间,如果它真的接近时间限制-返回您的最佳动作。
现在,您无需担心时间,您的方法将给出迄今为止您发现的最佳结果。通过对不同子树的所有这些重新计算,您只会浪费一半的资源(如果您检查整个树,但在alpha-beta中,您很可能不会)。另一个优点是,现在您可以在每个深度迭代中将移动从最好的位置重新排序到最差的位置,从而使修剪更具攻击性。
我的程序中有一个有效的negamax算法。然而,我需要程序在时间内找到最佳移动。我做了一些研究,似乎用我的negamax算法进行迭代深化是最好的方法。现在,我启动搜索的函数如下所示: 我想我也应该重新排序之前的最佳移动到儿童列表的前面,但是,我在等待实现,直到我得到基本版本的工作。实际的阿尔法-贝塔函数是这样的: 当我尝试调试时,一切似乎都在按预期工作。然而,当我将迭代深化版本与常规的alphab
我用alpha-beta修剪创建了一个极大极小函数,我用迭代深化调用它。问题是,当计时器完成时,该函数会一直运行,直到在计时器用完之前,它在开始的深度上完成为止。 我想要的是:当计时器运行完时,minimax函数应该退出并返回none(我将best move保留在minimax之外,请参阅下面的minimax调用代码),或者返回之前计算的best move。我似乎不知道如何在minimax函数中实
我已经实现了一个带有alpha beta修剪的NegaMax算法(这只是一个较短版本的极小值算法)。现在我想实现迭代深化,这样我就可以为每个深度找到最佳移动,然后根据之前层的分数重新排序树下的节点,以便我的alphabeta修剪工作更有效。 以下是我迄今为止所做的工作: 这里gs是随每一步移动而变化的游戏属性,包含了所有关于游戏在t点的信息,比如是否可以施法或者是否有可能的内移。我的egamax算
我试图在我的negamax中实现转置表。但首先我想理解伪代码中的所有思想: ' 函数 negamax(节点, 深度, α, β, 颜色) 是 alphaOrig := α 但我想知道的一件事是旗帜是什么?喜欢、和?
我正在尝试用换位表实现增强的α-β-最小-最大修剪。我使用这个伪代码作为参考: http://people.csail.mit.edu/plaat/mtdf.html#abmem 这个算法有三个问题: > 我相信我应该在每个保存的换位表条目中存储深度(=到叶级的距离),并且仅在 entry.depth 时才使用条目 我想存储每个位置的最佳移动,以便在搜索停止后使用它进行移动排序和提取最佳移动。在纯
我正在尝试为跳棋游戏(AI vs AI)编写一个使用阿尔法-贝塔修剪的算法。你可以看到代码 游戏本身运行良好,但人工智能(阿尔法-贝塔修剪算法)似乎有一个错误,因为机器人基本上是互相喂食跳棋(根本没有计算显示)。代码包含2个不同版本的alpha-beta算法函数(更详细和不太详细)。 我试过在中跟踪的值,它似乎有正常值(在深度=5的情况下范围为-3到3)。 我也尝试过在我的代码中实现此代码,但得到