(defun beam-search (graph start goal beam-width) (beam-search-aux graph start goal beam-width (list (list start)))) (defun beam-search-aux (graph start goal beam-width path-queue) (let ((path (first path-queue))) (cond ((null path-queue) nil) ((node-equal goal (first path)) (reverse path)) (t (beam-search-aux graph start goal beam-width (let ((sorted (sort (append (new-paths path graph) (rest path-queue)) #'(lambda (p1 p2) (closerp p1 p2 goal))))) (if (> beam-width (length sorted)) sorted (subseq sorted 0 beam-width))))))))beam-widthを無限大にするとbest-first探索になります.
> (beam-search *graph1* 's 'f 1) nil > (beam-search *graph1* 's 'f 2) (s a b e f) > (beam-search *graph1* 's 'f 3) (s a b e f)subseqは以下のように部分列を取り出す関数です.
> (subseq '(a b c d e f) 0 2) (a b) > (subseq '(a b c d e f) 1 2) (b) > (subseq '(a b c d e f) 1 3) (b c) > (subseq '(a b c d e f) 2 3) (c) > (subseq '(a b c d e f) 2 2) nil >