我想我终于对minimax和Alpha-beta修剪有所了解了,但实现它完全是另一回事!
根据我的理解,基础是:您为某些动作分配一个启发式函数分数(Gomoku为例)。
当我们必须在Java中实现这一点时,我的问题来了!
我有一块彩色[][]板(8x8),其中黑色是播放器1,白色是播放器2,null表示空白,我不知道我们应该如何
感谢您的帮助和指导!我看过YouTube教程和来自各种在线资源的课堂讲稿,但在实际编写代码时,它们对我来说都没有意义。
如果有什么不同,游戏是在8x8的棋盘上玩的Gomoku
首先,你必须定义游戏的状态。在您的示例中,它将是表示电路板配置的2d数组。
创建一个存储游戏配置和棋盘状态的java类。这个类现在将成为极小极大树的节点。
定义极大极小树的节点后,必须按照游戏规则定义子节点。这代表你的行动
有了这个,就有了极大极小树!
搜索棋盘以找到对手的动作并为其赋值
要分配每个棋盘配置的值,请将其存储在类本身中。此外,您不必搜索棋盘来查找对手移动,因为它由您的孩子表示。[请注意,棋盘与每个类一起存储]
搜索棋盘以查找我的移动并为其赋值
同样,如果给定的类表示player-1移动,那么子类表示player-2移动。
然后选择可能的最佳动作
这是由算法定义的。如果处于“最大”节点,则选择与“最大值”对应的移动。i、 e您选择价值最高的子级
如果是最小节点,则选择最小值的子节点。
附言:你不必事先定义整个极大极小树。它可以在执行dfs时动态创建。这将大大减少内存。
PPS:有关更多详细信息,请参阅国际象棋编程。
极小极大算法的一个缺点是每个板状态必须被访问两次:一次查找其子级,第二次评估启发式值。 极小极大算法还有其他缺点或优点吗?对于像象棋这样的游戏,还有更好的选择吗?(当然是带有α-β修剪的极小极大算法,但还有其他吗?)
为了更好地理解minimax算法是如何工作的,我一直在做一个tic-tac-toe程序。以下实现无法正常工作,因为计算机可能会丢失游戏。如果程序运行正常,理论上这是不可能的。。。 我是否在实施极大极小值或采取最佳行动时犯了错误? 我以前从未实现过算法: s 评价函数 极小极大 找到最好的办法 非常感谢。
计算机科学中最有趣的事情之一就是编写一个人机博弈的程序。有大量的例子,最出名的是编写一个国际象棋的博弈机器。但不管是什么游戏,程序趋向于遵循一个被称为Minimax算法,伴随着各种各样的子算法在一块。本篇将简要介绍 minimax 算法,并通过实例分析帮助大家更好的理解。 一、概念 Minimax算法又名极小化极大算法,是一种找出失败的最大可能性中的最小值的算法。Minimax算法常用于棋类等由两
我到处寻找修复代码的答案,但在花了很长时间调试代码后,我发现自己陷入了绝望。问题是,我的minimax函数不会为可能的最佳移动返回正确的值,我甚至试图通过存储最佳的第一个移动(当深度=0时)来修复它,但如果解决方案不明显,那么该算法将严重失败。我还尝试修改基本案例的返回值,以便优先考虑早期的胜利,但这并没有解决问题。 目前我正在TictoE板上测试这个函数,助手类(如getMoves()或getW
我最近实现了极小极大和阿尔法贝塔修剪算法,我100%确定(自动分级器)我正确地实现了它们。但是当我执行我的程序时,它们的行为不同。我99%确定极小极大和阿尔法贝塔的结束状态应该是相同的。我说得对吗?它们在实现结果的路径上会有所不同吗?因为我们忽略了min将选择的一些值,而max不会选择这些值,反之亦然。
我正在为Gomoku(16x16)构建一个具有极大极小值和α-β修剪的AI,但速度非常慢。到目前为止,我已经尝试过对动作顺序进行预排序,而不是深度复制棋盘,添加和删除动作。此外,我还使用了相关移动的arraylist(距离已放置的块的半径在2以内)来减少搜索栏。然而,即使在3的深度搜索中,人工智能仍在苦苦挣扎<编辑:我发现了一个叫做换位表的东西,但我不知道从哪里开始。任何帮助都会很好!