首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Haskell中创建函数minimax?

如何在Haskell中创建函数minimax?
EN

Stack Overflow用户
提问于 2018-09-29 01:24:12
回答 1查看 1.9K关注 0票数 2

我一直在努力在Haskell中创建一个minimax函数,但在SO上找不到任何好的替代方案,因此我问:

我想创建以下函数:

代码语言:javascript
复制
minimax :: Player -> Rose Board -> Rose Int

我想得到一个整数的RoseTree,它们必须是1,0或-1 (对于有回合的玩家来说,走法可以是好的,中性的,也可以是坏的。

代码语言:javascript
复制
(root :> leaves)               -- constructor of a Rose
(board :> boards)              -- constructor of a Rose Board
(Int :> Ints)                  -- constructor of a Rose Int

我已经编写了函数hasWinner,minimum‘and maximum’让事情变得更简单:

代码语言:javascript
复制
hasWinner :: Board -> Maybe Player

minimum' :: [Int] -> Int
minimum' (x:xs) | x == -1 = -1
                | otherwise = minimum' xs

maximum' :: [Int] -> Int
maximum' (x:xs) | x == 1 = 1
                | otherwise = maximum' xs

此外,我认为我的基本情况如下:

代码语言:javascript
复制
minimax player (board :> []) = (0 :> [])

目前,我所处的位置是:

代码语言:javascript
复制
minimax player (board :> boards)| maximum' [(isWinner player b (minimax' player)) | (b :> bs) <- boards] == 1 = _
                                | minimum' [(isWinner player b (minimax' player)) | (b :> bs) <- boards] == -1 = _
                                | otherwise = _
                 where   minimax' player     | player == P1 = P2
                                             | otherwise = P1
                         isWinner p1 board p2    | hasWinner board == Just p1 = 1
                                                 | hasWinner board == Just p2 = -1
                                                 | otherwise = 0

我只是不知道当我发现一块棋盘要么赢了,要么输了,要么没有后果时,会发生什么。那么,如何使用正确的Rose Board再次调用minimax函数呢?

任何帮助都是非常感谢的!

雷蒙

EN

回答 1

Stack Overflow用户

发布于 2018-09-29 02:06:51

实际上,我找到了另一篇讨论我在这里遇到的相同问题的帖子:Haskell Recursive Minimax Tree

答案是这样的:

代码语言:javascript
复制
minimax :: Player -> Rose Board -> Rose Int
minimax p (r :> [])   | hasWinner r == Just P1 = 1    :> []
                      | hasWinner r == Just P2 = (-1) :> []
                      | otherwise              = 0    :> []
minimax P1 (r :> rs) = maximum (map root xs) :> xs
    where xs = map (minimax (nextPlayer P1)) rs

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

我希望这至少能在未来帮助其他人。此答案中使用的函数包括:

代码语言:javascript
复制
root :: Rose a -> a
root (a :> bs) = a 

nextPlayer :: Player -> Player
nextPlayer P1 = P2
nextPlayer P2 = P1

hasWinner :: Board -> Maybe Player

minimum :: Ord a => [a] -> a
maximum :: Ord a => [a] -> a

干杯!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52560126

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档