极小极大算法的一个缺点是每个板状态必须被访问两次:一次查找其子级,第二次评估启发式值。
极小极大算法还有其他缺点或优点吗?对于像象棋这样的游戏,还有更好的选择吗?(当然是带有α-β修剪的极小极大算法,但还有其他吗?)
对于像国际象棋这样的游戏,Minimax往往太慢。每一回合,玩家都有很多选择,棋局的分支因素是巨大的,因此我们走得越深,速度就越慢。平均而言,国际象棋的分支因子趋于30。也就是说,每轮创建30个子树。
在给出具体算法之前,他们都使用我们所说的阿尔法贝塔修剪,阿尔法贝塔减少了需要扩展的节点数量,因此我们减少了分支因子。
请记住,minimax和alpha beta有许多不同的变体,但最重要的算法是:
简单解释:
score = -negamax(depth-1,-player)
best = max(score,best)
窗口搜索算法
下面的算法使用一个窗口来减少搜索空间。这个窗口最初假设α和β的值。
>
主变异法:该方法通过猜测初始alpha和beta来减少访问的节点数量。它只通过探索一个分支并选择候选值来做到这一点。使用这个值我们修剪。如果我们发现一个矛盾,这是一个比我们重新开始选择候选人产生更高分数的值。
MTD(f)minimax的另一个变化。使用零窗口搜索。这意味着,在我们找到候选者(比如“v”)后,我们假设α-β值为(v-1,v),因此只有v是可能的解决方案。如果我们发现了矛盾,就换一个候选人,然后重复。
此外,目前国际象棋计算机程序中最好、最常用的算法是MTD(f),带有一些变体/启发法。
来源:将Minimax转换为Negamax(python)
我想我终于对minimax和Alpha-beta修剪有所了解了,但实现它完全是另一回事! 根据我的理解,基础是:您为某些动作分配一个启发式函数分数(Gomoku为例)。 如果一行有5个,我们应该分配一个高值,比如9999,因为这是一个胜利的举动 当我们必须在Java中实现这一点时,我的问题来了! 我有一块彩色[][]板(8x8),其中黑色是播放器1,白色是播放器2,null表示空白,我不知道我们应
计算机科学中最有趣的事情之一就是编写一个人机博弈的程序。有大量的例子,最出名的是编写一个国际象棋的博弈机器。但不管是什么游戏,程序趋向于遵循一个被称为Minimax算法,伴随着各种各样的子算法在一块。本篇将简要介绍 minimax 算法,并通过实例分析帮助大家更好的理解。 一、概念 Minimax算法又名极小化极大算法,是一种找出失败的最大可能性中的最小值的算法。Minimax算法常用于棋类等由两
我最近实现了极小极大和阿尔法贝塔修剪算法,我100%确定(自动分级器)我正确地实现了它们。但是当我执行我的程序时,它们的行为不同。我99%确定极小极大和阿尔法贝塔的结束状态应该是相同的。我说得对吗?它们在实现结果的路径上会有所不同吗?因为我们忽略了min将选择的一些值,而max不会选择这些值,反之亦然。
我正在为Gomoku(16x16)构建一个具有极大极小值和α-β修剪的AI,但速度非常慢。到目前为止,我已经尝试过对动作顺序进行预排序,而不是深度复制棋盘,添加和删除动作。此外,我还使用了相关移动的arraylist(距离已放置的块的半径在2以内)来减少搜索栏。然而,即使在3的深度搜索中,人工智能仍在苦苦挣扎<编辑:我发现了一个叫做换位表的东西,但我不知道从哪里开始。任何帮助都会很好!
我正在为一个简单的国际象棋引擎做一个极大极小算法,但是遇到了一些困难。我已经运行了几个小时的代码,但没有结果,它似乎仍然输出错误的结果;当我威胁它的一个棋子,而它有一个有效的动作可以拯救它时,它会忽略这个动作。 下面,我尽可能简化了极小极大算法方法的代码,以尝试并展示我试图实现的目标,并希望使错误可见。它最初用极小极大(2,true)调用; 我确信其他方法工作得很好,因为移动()只是改变了棋子,验
我到处寻找修复代码的答案,但在花了很长时间调试代码后,我发现自己陷入了绝望。问题是,我的minimax函数不会为可能的最佳移动返回正确的值,我甚至试图通过存储最佳的第一个移动(当深度=0时)来修复它,但如果解决方案不明显,那么该算法将严重失败。我还尝试修改基本案例的返回值,以便优先考虑早期的胜利,但这并没有解决问题。 目前我正在TictoE板上测试这个函数,助手类(如getMoves()或getW