0

これは、事前定義されたノードを使用して山登り検索を実行するために使用する必要がある私の本からのコードです。Best-first-- (「似ている」) など、他のいくつかの検索機能を正常に実行できました。この山登り検索を実行すると、実行に失敗しました。私はLispが初めてなので、なぜこれが起こっているのかわかりません。補足として、Im は 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