问题标签 [alpha-beta-pruning]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
artificial-intelligence - “蒙特卡洛树搜索”可以应用于像 Stratego 这样的“信息不完全的两人游戏”吗?
我想开发一个信息不完全的两人游戏——“Stratego”。
这场比赛“有点”像国际象棋,但最初我们对对手棋子的排名一无所知。当一个棋子攻击或被某个对手的棋子攻击时,他们的等级被揭示并且更高等级的棋子杀死/捕获更低等级的棋子。可以在此处找到有关游戏的更多详细信息。
我做了一点研究。我读了 JA Stankiewicz 的“Stratego 中的对手建模”。但是我找不到有关如何开发游戏的完整教程。我曾成功开发过一款两人游戏——“黑白棋”,又名黑白棋,我熟悉 MINIMAX 算法和 alpha-beta 修剪。
我在某处发现蒙特卡洛树搜索也用于开发零和二人游戏。它可以用于像战略这样的游戏吗?我可以获得相同的完整教程吗?
任何其他不涉及蒙特卡洛树搜索的教程也很有用:)
algorithm - 了解 alpha-beta 剪枝算法中的截止条件
我无法理解我在维基百科上找到的用于 alpha beta 修剪的伪代码:
令我困惑的是 ifPlayer = MaxPlayer
条件。我理解整个递归调用函数not(Player)
以获取最小值,然后递归调用函数Player
,重复直到达到深度限制或找到目标状态。但是,我不明白
陈述。我的理解是,找到比上一次调用()中找到的最小值高的第二个值β
,即使用的值。但是由于这是函数的 MAX 部分,我们不想要 HIGHEST 值,而不仅仅是大于 beta 的任何值吗?
c++ - 符号引用错误
我正在写一个关于 alpha-beta 修剪的项目。当我在 xcode 中运行它时,我得到符号引用错误:
我的一些代码:
algorithm - Alpha-beta 修剪同一玩家的连续动作
我已经为 Checkers 实现了 alpha-beta 修剪,并认为我已经让它工作了,但发现计算机不会连续进行多次跳转(当它必须时)。例如:
人工智能会:
人工智能应该这样做:
我试图通过检查 MovePiece 的返回值来修复它,它返回玩家是否完成了他的回合,这取决于移动是否是跳跃以及是否还有进一步的跳跃。根据返回值,它将再次运行 MaxValue/MinValue(取决于它第一次看到要进行进一步移动时所处的位置)或继续在树中并切换玩家。
相关代码(C# 中)如下(retVal 是包含 Value、Depth 和 Move to do 的类型):
...
然而,这导致了一些……有趣的结果(第一步除了最小的修剪之外什么都不做),尽管我认为这将是正确的改变。
用新的动作让 MaxValue/MinValue 再次调用自己是正确的做法吗?
artificial-intelligence - Alpha beta剪枝的评价函数设计
我正在设计一个国际象棋游戏,它背后的人工智能实现了一个带有 alpha-beta 修剪的搜索树。我在设计游戏的评估函数时遇到了困难。
如何为任何类型的游戏设计评估函数?
c++ - 井字游戏的 MinMax 简单演示
我一直在努力弄清楚 MinMax 算法是如何工作的,希望 alpha-beta 修剪算法能够工作。我对发生的递归感到困惑。
- 首先,每个中间板都得分吗?或仅终端游戏板。
- 其次,返回的究竟是什么?程序如何知道下一步该放在哪里?我看到我应该返回棋盘分数(在tictactoe中,-1,0,1)但是程序如何知道接下来应该播放哪个动作。
我曾尝试找到一个简单的 C 或 C++ 程序来证明这一点,但我运气不佳。我正在尝试学习这个算法,我可以为我的计算机编程课的其余部分创建一个演示文稿。
非常感谢!五
algorithm - 黑白棋/黑白棋游戏的 Alpha-Beta 修剪算法中的启发式函数
我正在实现一个 Alpha-Beta 修剪算法,该算法将用于在奥赛罗游戏中获得最佳移动。当算法到达叶节点(即没有有效移动或达到最大深度)时,我基于此计算该节点的启发式值:
最大化玩家(运行算法并将使用算法返回的移动的玩家)在该节点的棋盘上有多少砖?(每块砖+1)
最大化玩家在这个节点有多少有效移动?(每步+10)
最大化玩家有多少个角砖?(每个角砖+100)
问题是:如果不是最大化玩家在叶子节点上交,我该怎么办?然后不可能计算他的有效动作,因为轮不到他。我可能误解了整个 alpha-beta 修剪算法,或者至少误解了启发式函数应该如何工作。有人可以给我一个提示吗?
谢谢
java - minimax 代码总是返回 0
我从维基百科写了一个 Alpha-Beta 修剪。我正在尝试编写一个四连接 AI。该函数应该返回列号,然后我的主函数会移动。
c# - C# alpha-beta 修剪参考
所以这就是问题所在。我正在为基于 AI 的游戏开发战斗模拟器。当敌人对每一个动作都做出最佳动作时,人工智能应该为他计算出最佳动作。
我的团队有 X 个单位,有 5 个可能的移动,我的对手有 Y 个单位,有 5 个可能的移动。X 和 Y > 0 使用 alpha-beta 剪枝,我们希望生成每个可能的结果并最终取出最好的结果。问题是我们将每个结果保存到一个情境中,这种情境存储列表,但列表包含对所存储对象的引用,这使得它们将它们的移动保存到相同的情境中(1 个单元的所有 5 个移动)
想象一下我们的 2 个单位和他们的一个单位。我们创建一个情境并添加一个具有 5 个方向中的 1 个的单元。然后为我们的第二个单位添加一个方向,然后为敌方单位添加一个方向。现在我们得到了我们想要保存的最终情况。然后根据我们第二个单位的情况(所以没有敌方单位),我们想为敌人添加一个不同的动作到情况中,如果它更好的话,保存新的情况。但是由于 C# 使用列表的引用,这种情况也包括其他敌人移动的情况。
代码有点大,但我真的被困在这里,所以我希望如果有人有空闲时间来帮助我解决这个问题。
亲切的问候,我