我最近实现了极小极大和阿尔法贝塔修剪算法,我100%确定(自动分级器)我正确地实现了它们。但是当我执行我的程序时,它们的行为不同。我99%确定极小极大和阿尔法贝塔的结束状态应该是相同的。我说得对吗?它们在实现结果的路径上会有所不同吗?因为我们忽略了min将选择的一些值,而max不会选择这些值,反之亦然。
我知道这是一个老问题,然而。。。。
是的,Alpha-beta和极小极大返回相同的答案。Alpha-Beta所做的只是防止极小极大进行100%保证不是当前玩家的最佳状态(MAX或MIN)的计算。
但是,对于给定的状态,您可能有等效的操作。算法如何决定返回哪些等效操作取决于它的实现方式。如果在某处使用集合/无序列表,则进行评估的顺序可能会改变。
这也可能取决于如果Alpha/Beta值等于当前最佳选项时您会做什么。由于相等的值不会产生更好的结果,因此进一步探索该路径是没有意义的。因此,您只需保留“遇到的第一个最佳操作”。然而,使用极小极大,您无论如何都会探索所有内容,因此您可能会决定保留“最后一个最佳”值。这是极小极大会返回与Alpha-Beta不同的操作的一种情况。但就您的评分函数而言,它们仍然是等效的......
我想我终于对minimax和Alpha-beta修剪有所了解了,但实现它完全是另一回事! 根据我的理解,基础是:您为某些动作分配一个启发式函数分数(Gomoku为例)。 如果一行有5个,我们应该分配一个高值,比如9999,因为这是一个胜利的举动 当我们必须在Java中实现这一点时,我的问题来了! 我有一块彩色[][]板(8x8),其中黑色是播放器1,白色是播放器2,null表示空白,我不知道我们应
我已经实现了一个带有alpha beta修剪的NegaMax算法(这只是一个较短版本的极小值算法)。现在我想实现迭代深化,这样我就可以为每个深度找到最佳移动,然后根据之前层的分数重新排序树下的节点,以便我的alphabeta修剪工作更有效。 以下是我迄今为止所做的工作: 这里gs是随每一步移动而变化的游戏属性,包含了所有关于游戏在t点的信息,比如是否可以施法或者是否有可能的内移。我的egamax算
我试图在我的象棋引擎中实现alpha-beta剪枝,但没有性能差异,我可能做错了什么?我试着用控制台记录算法剪切一个分支的次数,但它的数量是数百次,因此它可以正确地修剪搜索树。即使这样,该算法也没有明显的性能改进。 董事会评估平均需要80毫秒左右。使用alpha-beta修剪,查看深度3时,minimax/alpha-beta算法需要1.8秒,而不使用minimax/alpha-beta算法需要1
我正在尝试建立一个国际象棋AI。我的带有 alpha-beta 修剪的 negamax 函数 (ABP) 比使用 ABP 的单独最小和最大函数运行得慢得多(约 8 倍),尽管返回的移动是相等的. 我的棋盘评估函数总是返回一个关于红色玩家的值,即红色玩家越高越好。仅对于 Negamax,当返回深度 0 时,黑色玩家的此值乘以 -1。 我的Netamax函数: 根调用: 我的最小和最大函数: 根分别调
我已经为游戏跳棋编写了一个带有alpha-beta修剪的minimax算法,现在我正尝试使用negamax方法重写它。我希望这两者是等价的,因为negamax只是一种编写minimax的技术。但由于某种原因,我的两种算法表现不同。当我在相同的输入上运行它们时,negamax版本似乎评估了更多的状态,所以我认为alpha-beta修剪一定有问题。 下面的代码显示了这两种算法(
极小极大算法的一个缺点是每个板状态必须被访问两次:一次查找其子级,第二次评估启发式值。 极小极大算法还有其他缺点或优点吗?对于像象棋这样的游戏,还有更好的选择吗?(当然是带有α-β修剪的极小极大算法,但还有其他吗?)