Minimax Alpha Beta算法

时间:2016-02-12 14:42:45

标签: java algorithm minimax alpha-beta-pruning

我想我终于开始了解极小极大和Alpha beta修剪,但实现它是另一回事!

根据我的理解,基础是: 您将启发式函数分数分配给某些移动(Gomoku作为示例)。

  • 如果连续5个,我们应该分配一个高值,如9999 这是一个成功的举动。
  • 如果我们连续4个,我们有两个开放端 我们应该再次分配一个高值,因为它无法阻止 此举等等

当我们真的必须在Java中实现它时,我的问题出现了!

我有一个Color [] []板(8x8),其中黑色是玩家1,白色是玩家2,null表示空白,我对我们将如何

感到困惑
  1. 搜索棋盘以查找对方移动并指定值 给他们
  2. 搜索棋盘以查找我的移动并为其指定值 他们
  3. 然后选择最好的举动(我认为我可以做到) 如果我知道前两个如何工作,因为这基本上是 算法)。
  4. 一些帮助和指导表示赞赏!我查看了YouTube教程,来自各种在线资源的讲义,但在编写代码时,没有一个对我有用。

    如果它有所作为,游戏是Gomoku在8x8板上播放

1 个答案:

答案 0 :(得分:2)

定义状态

首先,你必须定义游戏的状态。在您的示例中,它将是表示电路板配置的二维数组。

创建一个存储游戏配置和电路板状态的java类。此类现在将成为minimax树的节点。

定义孩子

定义极小极大树的节点后,您必须根据游戏规则定义子节点。这代表了你的举动。

有了这个你有minimax树!

  

搜索棋盘以查找对方移动并为其指定值

要分配每个电路板配置的值,请​​将其存储在类本身中。此外,您不必搜索董事会以找到反对行动,因为它由您的孩子代表。 [请注意,董事会与每个班级一起存储]

  

搜索棋盘以查找我的移动并为其指定值

同样,如果给定的类代表玩家1移动,则子代表玩家2的移动。

  

然后选择最好的举动

这是由算法定义的。如果您处于最大节点,则选择与最大值对应的移动。即你选择价值最高的孩子 如果是min节点,则选择最小值子节点。

PS :您不必事先定义整个minimax树。它可以在执行dfs时动态创建。这将大大减少记忆。

PPS :有关详细信息,请参阅Chess Programming