Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android Reversi游戏的Minimax/Alpha测试版_Java_Android_Artificial Intelligence_Minimax_Alpha Beta Pruning - Fatal编程技术网

Java Android Reversi游戏的Minimax/Alpha测试版

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

我必须为Android实现一个Reversi游戏。我已经设法实现了所有的游戏,是功能性的,但问题是我没有人工智能。事实上,在每一个动作中,电脑都会移动到能让他获得最多棋子的位置

我决定实现alpha-beta剪枝算法。我在互联网上做了很多关于它的研究,但是我不能得出一个最终的结论如何去做。我试图实现一些功能,但未能实现预期的行为

我的棋盘存储在类棋盘中(在这个类中,每个玩家占用的棋子存储在一个二维整数数组中)。我附上了一个小图表(对它的外观表示抱歉)

图表:

我需要帮助找出如何在我的实现中使用minimax算法

到目前为止,我的理解是,我必须对董事会的价值进行评估

为了计算董事会的价值,我必须考虑以下因素: -自由角(我的问题是,我必须只注意自由角,或者我在当前移动中可以采取的自由角?!这里的两难选择)。 -板的可移动性:检查当前移动后可移动的块数。 -板的稳定性…我知道这意味着不能在板上翻转的块数。 -这一举措将为我提供的数量

我计划实现一个新的类BoardAI,它将把我的Board对象和dept作为参数

你能告诉我一个逻辑流程的想法,我应该如何实现这个人工智能? 在dept中计算时,我需要一些关于递归的帮助,我不明白它是如何计算最佳选择的

谢谢大家!

首先,你可以查看我几年前写的checkers人工智能。有趣的部分是最后一个函数(
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:应用移动并开始递归。假设函数返回了三个移动(M1M2M3

  • 采用第一个移动M1并应用它以获得新的板配置B11
  • 在新配置上递归地应用算法(找到B11中适用的所有移动,应用它们,在结果上递归,…)
  • 撤消移动以恢复B1配置
  • 进行下一步移动M2并应用它以获得新的板配置B12
  • 等等
  • 注意:只有在所有移动都是可逆的情况下,才能执行步骤3。否则,你必须找到另一个解决方案,比如为每个动作分配一块新板

    代码:

    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

  • 从B1(当前_级别2)开始,我应用,例如,M1移动以获得B11
  • 例如,从B11(当前_级别1)I苹果,M2移动以获得B112
  • B122是“当前0级”电路板配置,因此我停止递归。我返回应用于B122的求值函数值,然后返回到级别1
  • 代码:

    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修剪为节点添加了两个最小-最大边界。此边界可用于决定是否应展开子树

    这本书