Java Android Reversi游戏的Minimax/Alpha测试版
我必须为Android实现一个Reversi游戏。我已经设法实现了所有的游戏,是功能性的,但问题是我没有人工智能。事实上,在每一个动作中,电脑都会移动到能让他获得最多棋子的位置 我决定实现alpha-beta剪枝算法。我在互联网上做了很多关于它的研究,但是我不能得出一个最终的结论如何去做。我试图实现一些功能,但未能实现预期的行为 我的棋盘存储在类棋盘中(在这个类中,每个玩家占用的棋子存储在一个二维整数数组中)。我附上了一个小图表(对它的外观表示抱歉) 图表: 我需要帮助找出如何在我的实现中使用minimax算法 到目前为止,我的理解是,我必须对董事会的价值进行评估 为了计算董事会的价值,我必须考虑以下因素: -自由角(我的问题是,我必须只注意自由角,或者我在当前移动中可以采取的自由角?!这里的两难选择)。 -板的可移动性:检查当前移动后可移动的块数。 -板的稳定性…我知道这意味着不能在板上翻转的块数。 -这一举措将为我提供的数量 我计划实现一个新的类BoardAI,它将把我的Board对象和dept作为参数 你能告诉我一个逻辑流程的想法,我应该如何实现这个人工智能? 在dept中计算时,我需要一些关于递归的帮助,我不明白它是如何计算最佳选择的 谢谢大家! 首先,你可以查看我几年前写的checkers人工智能。有趣的部分是最后一个函数(Java Android Reversi游戏的Minimax/Alpha测试版,java,android,artificial-intelligence,minimax,alpha-beta-pruning,Java,Android,Artificial Intelligence,Minimax,Alpha Beta Pruning,我必须为Android实现一个Reversi游戏。我已经设法实现了所有的游戏,是功能性的,但问题是我没有人工智能。事实上,在每一个动作中,电脑都会移动到能让他获得最多棋子的位置 我决定实现alpha-beta剪枝算法。我在互联网上做了很多关于它的研究,但是我不能得出一个最终的结论如何去做。我试图实现一些功能,但未能实现预期的行为 我的棋盘存储在类棋盘中(在这个类中,每个玩家占用的棋子存储在一个二维整数数组中)。我附上了一个小图表(对它的外观表示抱歉) 图表: 我需要帮助找出如何在我的实现中使用m
alphabeta
)。(它是用python编写的,但我认为您可以将其视为伪代码)
显然,我不能教你所有的阿尔法/贝塔理论,因为它可能有点棘手,但也许我可以给你一些实用的提示
评估功能
这是一个好的min/max alpha/beta算法(以及任何其他知情搜索算法)的关键点之一。编写一个好的启发式函数是AI开发的艺术部分。你必须很好地了解游戏,与游戏专家交谈,了解哪些棋盘功能对于回答以下问题很重要:这个位置对玩家X有多好
您已经指出了一些良好的特性,如机动性、稳定性和自由转弯。但是请注意,求值函数必须是快速的,因为它将被调用很多次
一个基本的评价函数是
H = f1 * w1 + f2 * w2 + ... + fn * wn
其中,f
是特征分数(例如自由角的数量),而w
是相应的权重,表示特征f在总分中的重要性
找到权重值的方法只有一种:经验和实验
基本算法
现在您可以从算法开始。第一步是了解游戏树导航。在我的人工智能中,我只是将主板用作黑板,人工智能可以在黑板上尝试动作
例如,我们从特定配置的线路板开始B1
步骤1:获得所有可用的移动。你必须为给定的玩家找到所有适用于B1的移动。在我的代码中,这是由self.board.all\u move(player)完成的。它返回一个移动列表
步骤2:应用移动并开始递归。假设函数返回了三个移动(M1,M2,M3)
for mov in moves :
self.board.apply_action(mov)
v = max(v, self.alphabeta(alpha, beta, level - 1, self._switch_player(player), weights))
self.board.undo_last()
if level == 0 :
value = self.board.board_score(weights)
return value
步骤3:停止递归。这三个是非常深入的,所以你必须给算法设置一个搜索限制。一个简单的方法是在n
级别之后停止迭代。例如,我从B1开始,max_level=2
和current_level=max_level
for mov in moves :
self.board.apply_action(mov)
v = max(v, self.alphabeta(alpha, beta, level - 1, self._switch_player(player), weights))
self.board.undo_last()
if level == 0 :
value = self.board.board_score(weights)
return value
现在。。。标准算法伪代码返回最佳叶值的值。但是我想知道哪一步能让我走到最好的叶子!要做到这一点,您必须找到将叶值映射到移动的方法。例如,您可以保存移动序列:从B1开始,序列(M1 M2 M3)将玩家带到棋盘B123,值为-1;序列(M1-M2)将玩家带到板B122中,值为2;等等然后你可以简单地选择将AI带到最佳位置的移动
我希望这能有所帮助
编辑:关于α-β的一些注释。如果没有图形示例,阿尔法-贝塔算法很难解释。出于这个原因,我想链接我所发现的最详细的alpha-beta修剪解释:。我想我真的没有比这更好的了
关键点是:Alpha-beta修剪为节点添加了两个最小-最大边界。此边界可用于决定是否应展开子树
这本书