Minimax算法无法按预期工作

问题描述 投票:0回答:1

我正在使用Realm of Racket书中给出的存根作为基础来构建一个用于打勾的游戏的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是对应于刻度线板的二维数组(形式为'((X - O) (O X -) (- X O))),moves是可以从该节点进行的可能移动的列表,每个节点都是包含两个元素的列表:改变的位置,以及形成下一个节点的ttt-tree。所以(second t)指的是下一个节点,如果t(list-ref (ttt-tree-moves #<ttt-tree>) x)

我最初的想法是cond可能有一些错误,但我使用的是equal?而不是eq?,所以我不知道这会是一个什么问题。另一种可能性是我将winner定义为错误,但我已经多次测试过,所以我不知道会出现什么问题。请帮忙!

algorithm tree racket minimax
1个回答
1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.