algorithm - Minimax 算法未按预期工作

标签 algorithm tree racket minimax

我正在使用 Realm of Racket 中给出的 stub 为滴答游戏构建 AI。书作为依据。到目前为止,一切进展顺利。但是,当我尝试运行我的 minimax 时树根上的函数,它返回一个列表,其中包含您可以通过运行它获得的最低可能值(以任一玩家为谓词)。
这是函数的代码转储:

(define (minimax tree player depth)
  (define (generate-score tree player depth)
    (define won (winner (ttt-tree-board tree)))
    (if (<= depth 0) 0
        (+ (cond 
             [(equal? won player) 1]
             [(false? won) 0]
             [else -1])
           (apply +
                  (for/list ([t (ttt-tree-moves tree)])
                    (generate-score (second t) player (sub1 depth)))))))
  (for/list ([t (ttt-tree-moves tree)])
    (generate-score (second t) player depth)))

这只是我的minimax函数,因为不需要显示其他(winner 除外)。这是 winner :

(define (winner board)
  (or
   (ormap (lambda (row) (if (all-equal? row) (first row) #f)) board) ; Horizontal
   (ormap (lambda (i) (if ; Vertical
                       (all-equal? (map (lambda (j) (list-ref (list-ref board j) i)) (stream->list (in-range (length board)))))
                       (list-ref (first board) i) #f))
          (stream->list (in-range (length board))))
   (if ; Diagonal
    (all-equal? (map (lambda (i) (list-ref (list-ref board i) i)) (stream->list (in-range (length board)))))
    (first (first board)) #f)

   (if ; Diagonal cont.
    (all-equal? (map (lambda (i) (list-ref (reverse (list-ref board i)) i)) (stream->list (in-range (length board)))))
    (last (first board)) #f)))

(有点草率,所以如果有人有想法让它更短,请告诉我你的建议)
ttt-tree结构遵循这种模式:

(ttt-tree board moves)

其中board是一个二维数组,对应于 tick-tack-toe 板(形式为 '((X - O) (O X -) (- X O)) ),并且 moves是可以从该节点进行的可能移动的列表,每个移动都是一个包含两个元素的列表:更改的位置和 ttt-tree形成下一个节点。所以(second t)指下一个节点,如果 t(list-ref (ttt-tree-moves #<ttt-tree>) x)

我最初的想法是 cond 中可能存在一些错误, 但我正在使用 equal?不是 eq? ,所以我不认为这会是个问题。另一种可能性是我正在定义 winner错了,但我已经测试了很多次,所以我不知道哪里出了问题。请帮忙!

最佳答案

事实证明,问题是在我的 winner 函数中,我从未检查获胜者是否是 "-",即空 block 。因此,在大多数情况下,这会触发,激活 else 子句并导致得分为 -1。

关于algorithm - Minimax 算法未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36758282/

相关文章:

mysql - 创建文件夹/文件结构

racket - 升级Minimal Racket和DrRacket

ruby - 如何查找一个数组是否是 Ruby 中另一个数组的子集?

python - 如何将这种在二叉树中的两个级别之间查找节点的递归实现转换为迭代版本?

algorithm - 找到最大的连续段算术级数

c# - 为 Unity3d 编写最简单的 newick 解析器(c# 或 Actionscript)

scheme - local 与 lambda 的惯用用法?

io - 文件 I/O 操作 - 方案

java - java中没有重复数字的反向整数

algorithm - 从图像估计曲率