【问题标题】:How to Get Move From Minimax Algorithm in Tic-Tac-Toe?如何从井字游戏中的极小极大算法中走出来?
【发布时间】:2014-08-20 21:13:57
【问题描述】:

到目前为止,我已经成功地在 Python 中使用 Minimax 算法并将其应用于井字游戏。我可以让我的算法遍历整个搜索树,并返回一个值。

但是,我对如何获取此值并将其转换为移动感到困惑?我怎么知道该采取什么行动?

谢谢。

【问题讨论】:

  • 你使用了递归算法吗?如果是这样的话,除了返回最终值,还可以在每一步返回对应的招式,在整个拆垛完成后得到自己的招式。
  • 如果您不了解如何使用 value,您是如何成功使用 minimax 的?我很困惑你到底在哪里遇到了麻烦。
  • @user189 是的,我正在使用递归算法。谢谢,我会试试的。程序应该如何知道它在最后呢?由于它是递归的,我认为每次执行它的操作时都返回一个移动是不可行的。
  • @twinlakes 目前可以使用极小极大算法得到当前节点的启发式值。
  • 我可以看到两种可能性。第一个,您为每个呼叫返回移动,您的主要呼叫将自动获得下一步移动。第二个,你使用一个额外的参数(比如“isFirst”),如果 isFirst 然后将 isFirst 设置为 False 并返回动作。

标签: python algorithm minimax


【解决方案1】:

将极小极大算法概念化为图形,其中每个顶点都是棋盘的可能配置,从顶点到其邻居的每条边都是从一个棋盘配置到下一个棋盘配置的转换/移动。

您需要查看与当前状态相邻的每个棋盘状态的启发值,然后选择具有最佳启发值的状态,然后更新屏幕以显示该棋盘状态。

如果您在棋盘状态之间进行动画/过渡,那么您必须查看边缘并找出两种状态之间的不同部分,并相应地为该部分设置动画。

【讨论】:

    【解决方案2】:

    在使用 MM 算法时,你一定有办法生成可能的后继板;每一个都是移动的结果。正如建议的那样,您可以修改您的算法以包括跟踪用于生成棋盘的移动(例如,将其添加到棋盘的定义中,或使用具有棋盘和棋步的结构);或者,您可以对算法的顶层有一个特殊情况,因为这是唯一一个特定移动很重要的情况。

    例如,如果你的函数当前只返回它所传递的棋盘的计算值,它可以改为返回一个 dict(或元组,这不太清楚),其中包含值和用于获取的第一步该值,然后修改您的代码以使用所需的任何位。

    【讨论】:

    • 我遇到的正是这种跟踪问题。例如,如果我尝试归还板子,由于极小值递归,它会弄乱我的算法。恐怕如果我尝试只为顶层制作一个特殊情况,它将不允许程序进行搜索。在伪代码中,我该如何实现这种跟踪?
    【解决方案3】:

    选择动作的最简单方法是选择由该动作产生的最大获胜位置数的动作。

    对于搜索树(游戏状态)中的每个节点,我会记录当前游戏状态可以创建的可能获胜状态。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多