我决定用11x11的棋盘创建一个井字游戏,获胜条件是连续5个单元格(垂直、水平或对角线),或者当棋盘满了,即没有可能向左移动。
我创建了一个AI对手,它使用minimax算法来寻找棋盘上的最佳移动。minimax的伪代码(使用alpha-beta修剪)如下所示:
function alphabeta(node, depth, α, β, maximizingPlayer)
if the game ends:
return the heuristic value of the current state
if maximizingPlayer
v := -∞
for each possible move in board // notice this
v := max(v, alphabeta(child, depth – 1, α, β, FALSE))
α := max(α, v)
if β ≤ α
break (* β cut-off *)
return v
else
....
最初,Tic-tac趾板的大小只有3x3,这意味着没有太多的空单元来循环minimax。但在11x11板上,有121个单元!
例如,如果第一圈是X
,则O
有120个可能的移动。O将尝试每一步以找到最佳的播放值,因此函数的运行时间是120的阶乘。
我的问题是,我们能否减少可能的行动?例如,如果第一个玩家移动到中心的某个位置,那么我们不需要检查某些角或边单元格的极小极大值。
如果我正确理解了这个问题,Alpha-Beta修剪本身旨在通过在找到相应的最大值或最小值时停止来减少所调查移动的数量。如果这还不够,则需要采用一些启发式方法。这意味着博弈树不会一直研究到叶子(上面的伪代码描述没有这样做),而是引入了递归深度的一些人工边界。如果达到递归深度,如果电路板未处于终端状态,则必须对其进行启发式评估。
极小极大算法的一个缺点是每个板状态必须被访问两次:一次查找其子级,第二次评估启发式值。 极小极大算法还有其他缺点或优点吗?对于像象棋这样的游戏,还有更好的选择吗?(当然是带有α-β修剪的极小极大算法,但还有其他吗?)
我想我终于对minimax和Alpha-beta修剪有所了解了,但实现它完全是另一回事! 根据我的理解,基础是:您为某些动作分配一个启发式函数分数(Gomoku为例)。 如果一行有5个,我们应该分配一个高值,比如9999,因为这是一个胜利的举动 当我们必须在Java中实现这一点时,我的问题来了! 我有一块彩色[][]板(8x8),其中黑色是播放器1,白色是播放器2,null表示空白,我不知道我们应
我试图在我的象棋引擎中实现alpha-beta剪枝,但没有性能差异,我可能做错了什么?我试着用控制台记录算法剪切一个分支的次数,但它的数量是数百次,因此它可以正确地修剪搜索树。即使这样,该算法也没有明显的性能改进。 董事会评估平均需要80毫秒左右。使用alpha-beta修剪,查看深度3时,minimax/alpha-beta算法需要1.8秒,而不使用minimax/alpha-beta算法需要1
在使用极小值和阿尔法-贝塔普鲁宁玩过基于回合的游戏后,如果满足某些条件,同一个玩家可以有多个连续移动,你将如何处理游戏?
我被要求将我的玩家与玩家的打球游戏改进为玩家与电脑对抗的AI打球游戏:为此,我需要编写两个函数:一个获取棋盘和当前玩家的符号,并返回所有可能的未来棋盘列表-每个未来棋盘都是一个包含两个元素的列表:一个是放置符号的位置另一个是放置符号后的板-一圈后的板(我使用的是嵌套的列表板,如下面的代码所示(我在这里收到了帮助) 我需要的第二个函数是计算机转动的函数——它使用第一个函数并通过以下方式之一选择最佳移
计算机科学中最有趣的事情之一就是编写一个人机博弈的程序。有大量的例子,最出名的是编写一个国际象棋的博弈机器。但不管是什么游戏,程序趋向于遵循一个被称为Minimax算法,伴随着各种各样的子算法在一块。本篇将简要介绍 minimax 算法,并通过实例分析帮助大家更好的理解。 一、概念 Minimax算法又名极小化极大算法,是一种找出失败的最大可能性中的最小值的算法。Minimax算法常用于棋类等由两