【问题标题】:Implementing a simple greedy ai for reversi/othello为黑白棋/黑白棋实现一个简单的贪心人工智能
【发布时间】:2021-05-24 14:45:51
【问题描述】:

快速免责声明这是针对家庭作业的,因此我不想放置任何代码,我想从你们那里获得概念性帮助,也许是帮助我理解的示例。本质上,我们必须为黑白棋/黑白棋实现一个人工智能,虽然 minmax 是最终目标,但我想从一个贪心算法开始。

好的,相关的定义/功能:

GameState - 这个变量保存了棋盘的边界,轮到谁了,还有棋盘(有一个 Maybe Player 列表,其中 Nothing 表示棋子是空的,Maybe Player1 或 Player2 表示一件作品呈现给玩家。

legalMoves - 在给定 GameState 时返回所有可能合法移动的列表。这里一个移动被定义为一个位置 (x,y)

applyMove - 最后我们有了 applyMove,它接受一个 GameState 和一个移动,并在移动完成后根据新棋盘返回一个新的 Maybe GameState。

这里的最终目标是创建一个函数,当给定 GameState 时,它​​会返回最佳移动

我做了什么: 首先,我创建了一个评估函数,它返回任何 GameState 的 eval (eval :: GameState -> Int)。所以是启发式的。

从这里我遇到了麻烦。我试图做的是将 applyMove 函数映射到 legalMoves 以返回给定 GameState 的所有可能的未来 GameStates 的列表。然后我将我的 eval 函数映射到 GameStates 列表以获得 Int 列表,然后我最终取了这个列表的最大值以获得最佳评估。 问题是我不知道如何从给我评估的 legalMoves 回到实际的移动。

【问题讨论】:

  • 存储每个合法移动的实际移动。
  • 其实你应该已经有了。如果 legalMoves 正在存储引用(我怀疑是这样),那么您已经拥有对原始移动的引用。

标签: haskell


【解决方案1】:

您当前的管道如下所示:

GameState -> (GameState, [Move]) -> [GameState] -> [Int] -> Int

改为如下所示:

GameState -> (GameState, [Move]) -> [(Move, GameState)] -> [(Move, Int)] -> (Move, Int)

换句话说:通过整个管道跟踪移动和函数返回值之间的关联。然后很容易提取到最后的Move

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-28
    • 1970-01-01
    • 1970-01-01
    • 2016-01-06
    • 2014-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多