使用Common LISP运行爬山搜索的问题

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

这是我书中的代码,我需要使用这些代码使用我们的预定义节点运行爬山搜索。我能够成功运行其他一些搜索功能,例如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]
lisp common-lisp hill-climbing allegro-cl
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)))))
© www.soinside.com 2019 - 2024. All rights reserved.