Проблемы с использованием Common LISP при поиске в гору - PullRequest
0 голосов
/ 15 февраля 2020

Это код из моей книги, который мне нужно использовать для запуска поиска с набором высоты, используя наши предопределенные узлы. Я был в состоянии успешно запустить несколько других функций поиска, таких как Best-first-- (который «похож»). После запуска этого поиска подъема по холму, он не смог бежать. Я новичок в шутке, поэтому не понимаю, почему это происходит. Как примечание, я работаю с 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]

1 Ответ

0 голосов
/ 15 февраля 2020

Я исправил это, отредактировав функцию (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)))))
...