Next: 10.3 親子関係を表す木表現の生成
Up: 10.2 探索木の生成
Previous: 10.2.2 全パスの探索
あるグラフから探索木を作った場合,目標頂点までにいたるパスが複数存在す
ることはあり得ます.そこで,ある頂点から別の頂点への道すべてを拾いあげ
る関数は,find-all-pahsを参考にして以下のように作ることができます.
(defun find-all-goal-paths
(graph start goal-p
&optional (path-queue (list (list start))))
(let ((path (first path-queue)))
(cond
((null path-queue) nil)
((funcall goal-p (first path))
(cons
(reverse path)
(find-all-goal-paths graph start goal-p
(rest path-queue))))
(t (find-all-goal-paths
graph start goal-p
(append (new-paths (new-nodes path graph) path)
(rest path-queue)))))))
find-all-goal-pathsでは,goal-pという目標に達成したかどうかを判断する
述語関数を与えます.pathの先頭の頂点がその述語に与えられ目標状態かどう
かが判断されます.ここでは,頂点はシンボルで表現されているため,目標頂
点とeqで等しいかどうかという関数を与えることになります.この目標が達成
されたらば,そのpathを返します.
目標が達成されていなくて,探索木の葉に来たところで,そこまでのpathは無
視して残りのpath-queueをfind-all-goal-pathsに渡します.
以下のように働きます.
<cl> (find-all-goal-paths *graph4* 's (is 'f))
((S A B E F) (S A D E F) (S D A B E F) (S D E F))
<cl> (find-all-goal-paths *graph6* 's (is 'f))
((S A B E F) (S A D E F) (S D A B E F) (S D E F))
<cl> (find-all-goal-paths *graph5* 'f (is 's))
((F E D A S) (F E D S) (F E B A D S) (F E B A S))
<cl> (find-all-goal-paths *graph2* 's (is 'd))
((S A B E D) (S A D) (S D))
isは,
(defun is (x) #'(lambda (y) (eq x y)))
関数を返す関数です.(is 'f)というのは f と等しいかどうかを判定する
関数を作ります.
generated through LaTeX2HTML. M.Inaba 平成18年5月6日