为了通过Alpha-Beta剪枝提高最小极大算法的性能,我实现了迭代深化:
public Integer iterativeDeepening(int maxDepth, boolean isFirstPlayer) {
Integer bestCell = -1;
for (Integer depth = 1; depth <= maxDepth; depth++) {
bestCell = alphabeta.minimax(depth, false, Integer.MIN_VALUE, Integer.MAX_VALUE)[1];
}
return bestCell;
}
其中方法<code>iterativeDeepening</code>只返回最佳移动的id。
首先,我不确定这是否是实现迭代深化的正确方法。
其次,我注意到AI开始做错误的动作。迭代深化有可能影响决策吗?
在使用转置表和迭代深化时,我衡量了算法速度的显著提高,但我真的不想为了速度而牺牲AI质量。
首先,我不确定这是否是实现迭代深化的正确方法。
我认为这是正确的,但如果你想迭代深化来加快你的算法,你也应该在其中添加移动顺序。这个想法是,在下一次迭代中,您使用浅层搜索的结果,以及看起来最好的搜索动作。这意味着在阿尔法-贝塔算法中有更好的快速截止机会。
其次,我注意到AI开始做错误的动作。迭代深化有可能影响决策吗?
为alpha-beta算法实现迭代深化不应该影响决策。你的实现一定有问题,但是没有足够的信息来说明它是什么。
我在做什么:我正在用C编写一个象棋引擎。我最近更新了我的引擎的minimax搜索算法,该算法使用alpha-beta修剪来利用迭代深化,以便在时间限制下运行。这是它的外观: 我的问题:这个实现的问题是,当搜索任何大于1的深度时,它将在搜索所需深度之前搜索所有之前的深度。也就是说,此迭代深化搜索首先搜索深度为1的所有移动。然后,它将再次搜索深度1,然后再搜索深度2,而不是在下一次搜索时选择深度2。然
本篇简述一下迭代加深搜索,并列出了伪代码帮助大家理解。 迭代加深是一种每次限制搜索深度的深度优先搜索。 (1)本质:它的本质还是深度优先搜索,只不过在搜索的同时带上了一个深度d ,当d达到设定的深度时就返回,一般用于找最优解。如果一次搜索没有找到合法的解,就让设定的深度+1 ,重新从根开始。 既然是为了找最优解,为什么不用BFS呢?我们知道BFS的基础是一个队列,队列的空间复杂度很大,当状态比较多
问题内容: 我有一个类似于以下内容的JSON字符串: 我对此字符串进行了JSON解析,然后将所有对象转换为HashMaps,并将所有数组转换为HashMap [] s。我的问题是我需要一个递归函数来遍历Java中此JSON结构的所有节点。我怎样才能做到这一点?我在想类似的东西: 问题答案: 假设一个数组只能在内部包含Maps(而不是其他数组): 或者,如果您可以使用3个功能,则可以使其更简单
我的程序中有一个有效的negamax算法。然而,我需要程序在时间内找到最佳移动。我做了一些研究,似乎用我的negamax算法进行迭代深化是最好的方法。现在,我启动搜索的函数如下所示: 我想我也应该重新排序之前的最佳移动到儿童列表的前面,但是,我在等待实现,直到我得到基本版本的工作。实际的阿尔法-贝塔函数是这样的: 当我尝试调试时,一切似乎都在按预期工作。然而,当我将迭代深化版本与常规的alphab
我正在尝试用换位表实现增强的α-β-最小-最大修剪。我使用这个伪代码作为参考: http://people.csail.mit.edu/plaat/mtdf.html#abmem 这个算法有三个问题: > 我相信我应该在每个保存的换位表条目中存储深度(=到叶级的距离),并且仅在 entry.depth 时才使用条目 我想存储每个位置的最佳移动,以便在搜索停止后使用它进行移动排序和提取最佳移动。在纯
问题内容: 我尝试实现冒泡排序,但是不确定它是否正确。如果您可以看一下它,并且它是气泡式的,并且可以通过更好的方式完成,请不要害羞。这是代码: 问题答案: 这是冒泡排序的正常实现,似乎还可以。可以进行几种优化,但是总体思路是相同的。这里有一些想法: 如果在内循环中未执行任何交换时,外循环有一个迭代,则中断,无用继续 在外循环的每次迭代中,交换内循环的方向-从左至右执行一次,然后从右至左执行一次(这