Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm Haskell递归极小极大树_Algorithm_Haskell_Recursion_Minimax - Fatal编程技术网

Algorithm Haskell递归极小极大树

Algorithm Haskell递归极小极大树,algorithm,haskell,recursion,minimax,Algorithm,Haskell,Recursion,Minimax,我正在尝试用Haskell编写一个Tic-Tac-Toe程序,使用minimax算法。我构建了自己的“Rose a”数据类型,如下所示: data Rose a = a :> [Rose a] 这是我想要“存储”我的极小极大树的数据类型。我理解minimax算法是如何工作的,但似乎不能在递归函数中实现它 minimax :: Player -> Rose Board -> Rose Int minimax p (r :> []) | hasWinner r == J

我正在尝试用Haskell编写一个Tic-Tac-Toe程序,使用minimax算法。我构建了自己的“Rose a”数据类型,如下所示:

data Rose a = a :> [Rose a]
这是我想要“存储”我的极小极大树的数据类型。我理解minimax算法是如何工作的,但似乎不能在递归函数中实现它

minimax :: Player -> Rose Board -> Rose Int
minimax p (r :> [])   | hasWinner r == Just p              = 1  :> []
                      | hasWinner r == Just (nextPlayer p) = (-1) :> []
                      | otherwise                          = 0  :> []
minimax p (r :> rs)   = maximum(map root xs) :> xs
    where xs = map (minimax' (nextPlayer p)) rs

minimax' :: Player -> Rose Board -> Rose Int
minimax' p b@(r :> []) = minimax p b
minimax' p   (r :> rs) = minimum(map root xs) :> xs
    where xs = map (minimax p) rs
“Player”也是一种自构造的数据类型,其值可以是P1或P2。“hasWinner”函数检查给定的“Board”(可容纳Tic-Tac趾板的数据类型)是否有赢家,并返回P1或P2,或什么也不返回


我写的这个“minimax”函数没有给我错误,但是结果是不正确的。我的minimax实现中的缺陷在哪里

您没有正确地在两个玩家之间切换
minimax'pb@(r:>[])=minimaxpb
错误<在
minimax'
中的code>map(minimaxp)rs不会切换到另一个玩家

我建议为
P1
(尝试最大化)和
P2
(尝试最小化)明确写出这一点

终局可以分配赢家,而不必关心当前正在玩的玩家

minimax :: Player -> Rose Board -> Rose Int
minimax p (r :> [])   | hasWinner r == Just P1 = 1    :> []
                      | hasWinner r == Just P2 = (-1) :> []
                      | otherwise              = 0    :> []
玩家
P1
正在尝试最大化

minimax P1 (r :> rs) = maximum (map root xs) :> xs
    where xs = map (minimax (nextPlayer p)) rs
玩家
P2
正在尝试最小化

minimax P2 (r :> rs) = minimum (map root xs) :> xs
    where xs = map (minimax (nextPlayer p)) rs

经过大量测试和困惑,我发现创建游戏树的函数有一些缺陷。经过调试,Cirdec提出的算法运行正常

您好,非常感谢您的回复。您的代码似乎合乎逻辑,但是,当我测试minimax函数时,给出P1和一个示例板作为输入,我的minimax树用“1”填充。但示例板实际上有P2获胜的场景,这意味着树中也应该有“-1”。。。我仔细检查了“hasWinner”功能是否工作,经过一些测试,它似乎工作正常。如果
r
P1
选择的移动,
rs
P2
可用的移动,
P2
正试图
最小化
。也许<>代码> P1<代码>需要考虑另一个玩家将如何选择一个动作而不是选择一个代码> P1<代码>,最好是用于<代码> P2<代码>。这与最小化P2的移动实际上是一样的吗?我将如何在代码中实现您的理论?