0

这是我书中的代码,我需要使用它来使用我们的预定义节点运行爬山搜索。我能够成功运行其他一些搜索功能,例如 Best-first--(“看起来”相似)。在运行此爬山搜索时,它未能运行。我是 lisp 的新手,所以我不明白为什么会这样。顺便说一句,我正在运行 Allegro CL。功能如下;

    ;; A simple hill-climbing search example adapted from Winston & Horn

(setf (get 's 'neighbors) '(a b)
      (get 'a 'neighbors) '(s c d)
      (get 'b 'neighbors) '(s e)
      (get 'c 'neighbors) '(a d e)
      (get 'd 'neighbors) '(a c e)
      (get 'e 'neighbors) '(b c)
      (get 'f 'neighbors) '(d))
;; I added this for distance assuming that it uses straight line distance in order to 
   search.. not sure if that is correct    
(setf (get 's 'distance) 65
      (get 'a 'distance) 50
      (get 'b 'distance) 48
      (get 'c 'distance) 45
      (get 'd 'distance) 30
      (get 'e 'distance) 28
      (get 'f 'distance) 0)

(defun straight-line-distance (node-1 node-2)
    (let ((coordinates-1 (get node-1 'coordinates))
              (coordinates-2 (get node-2 'coordinates)))
           (sqrt (+ (expt (- (first coordinates-1)
                             (first coordinates-2))
                           2)
                     (expt (- (second coordinates-1)
                              (second coordinates-2))
                           2)))))

(defun closerp (path-1 path-2 target-node)
    (< (straight-line-distance (first path-1) target-node)
           (straight-line-distance (first path-2) target-node)))

(defun hill-climb (start finish &optional
                       (queue (list (list start))))
     (cond ((endp queue) nil)
       ((equal finish (first (first queue)))
           (reverse (first queue)))
       (t (hill-climb start finish
                      (append (sort (extend (first queue))
                                   #'(lambda (p1 p2) (closerp p1 p2 finish)))
                              (rest queue))))))

(defun extend (path)
    (print (reverse path))
    (mapcar #'(lambda (new-node) (cons new-node path))
             (remove-if #'(lambda (neighbor) (member neighbor path))
                        (get (first path) 'neighbors))))

我调用的函数看起来像这样(hill-climb 's 'd)

我得到的错误如下;

Error: attempt to call `CLOSERP' which is an undefined function.
[condition type: UNDEFINED-FUNCTION]
4

1 回答 1

0

(defun straight-line-distance (node-1 node-2)我通过编辑函数来修复它。一定有一个错误......我重写了它并使用了这个;

(defun straight-line-distance (node-1 node-2)
    (let ((coordinates-1 (get node-1 'coordinates))
                (coordinates-2 (get node-2 'coordinates)))
             (sqrt (+ (expt (- (first coordinates-1)
                               (first coordinates-2))
                             2)
                       (expt (- (second coordinates-1)
                                (second coordinates-2))
                             2)))))
于 2020-02-15T07:31:24.297 回答