【发布时间】:2020-02-16 05:03:00
【问题描述】:
我正在为 2 人棋盘游戏编写基本的 MiniMax 算法。到目前为止,我有一个评估板并返回分数的函数。我有一个函数可以返回所有可能的移动(以及这些移动的移动)等的玫瑰树......到给定的深度。我可以找到那棵树的叶子并根据我的启发式给它们一个值,我的问题是在那之后我该怎么办?
我是否以某种方式编辑叶子的父节点并根据子节点的值为父节点分配一个新值,然后继续直到到达根节点?
我是否打算从叶子向上创建一棵新树,选择最小/最大值直到我到达根节点?如果是这样,新树如何记住到达叶子所需的所有移动?
我只想使用来自标准库的导入(我不想下载包)。任何建议都会很棒,这几天一直在努力。 谢谢
我试图从我的代码中挑选出一些部分来举例说明,但只是有很多函数纠缠在一起。如果它有帮助的话,这里是主要功能的类型签名以及它们的作用的解释:
这个函数接受一个Int(代表树的Depth),一个Game(棋盘的当前状态),立即可能移动的列表,并返回一个带有每个可能移动的玫瑰树(并移动到那些移动)和与该移动相关的分数。如果玩家是黑暗的,它的分数是正的,如果玩家是黑暗的,它的分数是负的 - 玫瑰树中的每个深度都是下一个玩家移动。
roseTreeAtDepthN :: Int-> Game -> [Position] -> [Rose (Position,score)]
例如:treeAtDepthN 2 initialGame [(2,3),(3,2),(4,5),(5,4)] 返回:
[Rose ((2,3),4) [Rose ((2,2),-3) [],Rose ((2,4),-3) [],Rose ((4,2),-3) []],
Rose ((3,2),4) [Rose ((2,2),-3) [],Rose ((2,4),-3) [],Rose ((4,2),-3) []],
Rose ((4,5),4) [Rose ((3,5),-3) [],Rose ((5,3),-3) [],Rose ((5,5),-3) []],
Rose ((5,4),4) [Rose ((3,5),-3) [],Rose ((5,3),-3) [],Rose ((5,5),-3) []]]
我有另一个函数可以让我得到一棵树的叶子。我使用在treeAtDepthN 中为每一步评估游戏状态的函数,但我意识到这可能不是必需的,只应在树的叶子上使用。我不确定这是否有帮助。
稍后编辑:
不确定我的极小极大算法接下来要做什么。我有一个将所有可能的移动打印到一定深度的函数,我有一个评估每个移动的启发式方法,我只是不确定如何将它变成一个返回最佳移动的函数。我只想使用 Haskell 库中给出的函数(不想下载任何包等)。
data Rose a = Rose a [Rose a]
deriving Show
我想如果我画一张图来解释我所拥有的功能,我可能会更容易理解。我有两个我能想到的解决方案,图中概述了,我不确定我应该采用哪种方法,如果有的话。 :
我想我想要一个将图片顶部的 [Rose a] 转换为图片底部的玫瑰 a 的功能。
谢谢。
【问题讨论】:
-
如果没有看到任何代码,很难提供很多指导。但从逻辑上讲,如果你已经完成了你所描述的所有设置,那么你已经完成了所有艰苦的工作——剩下的就是编写一个递归函数,给定一棵树,根据你的启发式计算最佳移动。跨度>
-
请与示例数据和预期输出一起分享您的尝试。
-
@RobinZigmond 我编辑了帖子以包含一张照片。我希望它更容易理解。基本上需要一个功能,将照片顶部的 [Rose a ] 变成底部的 Rose a。
标签: haskell tree artificial-intelligence minimax