当前位置: 首页 > 知识库问答 >
问题:

具有记忆功能的最小最大值算法?

薛欣德
2023-03-14

我正在尝试使用javascript中的minimax算法实现一个连接四个AI。目前,速度很慢。除了我将要实现的alpha-beta修剪之外,我想知道是否值得将游戏状态散列为

  1. 他们的启发式评估
  2. 下一个最佳举措

我可以立即明白为什么2会很有用,因为有很多方法可以达到相同的游戏状态,但我想知道我是否也必须散列当前深度才能使其工作。例如,如果我以3的深度达到这种状态(所以只说再向前看4步),而深度为2,向前看5步,我可能会得到不同的答案。这不是意味着我应该在散列中考虑深度吗?

我的第二个问题是,将散列板与它们的评估相结合是否值得。构建散列需要O(n)时间,评估板需要O(n)时间(尽管它更像O(2或3n))。游戏状态通常是散列到它们的评估中吗,还是这太过分了?感谢任何帮助

共有1个答案

姬奇思
2023-03-14

每当你散列一个状态的值时(使用启发式),你需要有关于这个状态评估深度的信息。这是因为在深度1处的值为0.1在深度20处的值为0.1之间有很大的区别。在第一种情况下,我们几乎没有调查空间,所以我们很不确定会发生什么。在第二种情况下,我们已经做了大量的工作,所以我们知道我们在谈论什么。

问题是,对于某些游戏,我们不知道位置的深度是多少。例如国际象棋。但在连接4中,看一个位置,你就知道什么是深度。

对于连接4,这里的深度是14(只放了14个圆)。所以你不需要存储深度。

至于你是否真的必须对状态进行哈希处理或重新评估它。显然,这个游戏中的一个位置可以通过许多游戏路径到达,所以你有点期望哈希值会有所帮助。重要的问题是创建/查看哈希的权衡以及评估函数的密集程度。如果它看起来做了很多工作 - 散列它并基准测试。

最后一个建议。您提到了alpha-beta,它比在您的阶段散列更有帮助(并且并不难实现)。您可以更进一步,为您的alpha-beta实现移动排序。如果我是你,我会这样做,并且只有在那之后我才会实现散列。

 类似资料:
  • 主要内容:Min-Max算法的工作人工智能中的最小最大算法: Mini-max算法是一种递归或回溯算法,用于决策和博弈论。它为玩家提供了一个最佳的动作,假设对手也在玩最佳状态。 Mini-Max算法使用递归来搜索游戏树。 Min-Max算法主要用于AI中的游戏。如Chess,Checkers,tic-tac-toe,go和各种拖车玩家游戏。该算法计算当前状态的最小极大决策。 在该算法中,两个玩家玩游戏,一个叫做MAX,另一个叫做M

  • 这个问题可能是封闭的,因为它听起来很模糊,但我真的问这个,因为我不知道或者我的数学背景不够。 我试图实现一个挑战,其中一部分挑战要求我计算矩阵的最小值和最大值。我对矩阵的实现及其操作没有任何问题,但是什么是矩阵的最小值和最大值?考虑到3x3矩阵是9个数中最小的数,最大的是最大的还是其他什么?

  • 我有一个对象流,我想找到一个最大值的一些属性,计算起来很昂贵。 作为一个特定的简单示例,假设我们有一个字符串列表,我们希望找到最酷的一个,给定函数。

  • 问题内容: 我有一个对象流,我想找到一个具有某些属性最大值的对象,该属性的计算成本很高。 作为一个简单的具体示例,假设我们有一个字符串列表,并且希望找到给定功能的最酷的字符串。 以下应该工作: 现在,这有两个问题。首先,假设计算起来很昂贵,这可能不是很有效。我想该方法将需要重复使用比较器,该比较器将依次重复调用,最后每个字符串将被多次调用。 其次,必须提供比较器会导致代码有些冗余。我更喜欢这样的语

  • 问题内容: 我有下表: 如何在每个“班级”中找到最大“分数”的“名称”? 要求的输出: 这是针对MySQL的。 问题答案:

  • 我有下面的代码,其中计算最小和最大订单项目从列表并按预期工作。我想知道是否可以进一步重构/改进,使其更优化和高性能地处理数千或订单列表。 我故意不做 Collections.min(itemFrequencyMap.values()) 和 因为它需要对所有值进行两次迭代,然后再次循环遍历 以查找值和的条目。