Next: 10.2.2 全パスの探索
Up: 10.2 探索木の生成
Previous: 10.2 探索木の生成
グラフの探索においては,探索中の現在いる頂点(
)をもとに,
に
隣接している頂点を調べます.そこで,探索プログラムで必要となるも
のとして,
から
までの path を与えて,
に隣接する頂点を求
めるという関数があげられます.この関数をnew-nodesと定義することにしま
す.
次に,new-nodesで得られる頂点群へパスを伸ばして得られる新しいパス群を
作る関数をnew-pathsとして定義することにします.
まず,new-nodesによりpathの最後の頂点
を展開するためには,
(vertex-adjacency-list
graph) として,頂点のリストを返す
vertex-adjacency-list を用います.
(defun new-nodes (path graph)
(remove-if
#'(lambda (n) (member n path))
(vertex-adjacency-list (first path) graph)))
(defun new-paths (new-nodes path)
(mapcar
#'(lambda (n) (cons n path))
new-nodes))
new-nodesはpathをもらってpathの先頭の頂点(現在探索中の頂点)
の隣接点リストを取りだし,隣接点リストの各頂点のうちpathに
すでに含まれているものを取り除きます.つまり,すでに通って来た
道にある頂点を除いた点のみを返します.
new-pathsは,new-nodesとpathをもらって,新しいpathを
生成します.new-nodesに含まれる頂点の数だけの新しいpathの
リストが返されます.
vertex-adjacency-listは,
(defun vertex-adjacency-list
(vertex graph)
(if
(listp graph)
(case
(car graph)
(elist
(vertex-adjacency-list-from-elist
vertex (cadr graph)))
(alist
(cdr (assoc vertex (cdr graph))))
(plist
(get vertex 'neighbors))
(hash
(gethash vertex (cadr graph)))
(amatrix
(vertex-adjacency-list-from-amatrix
vertex graph)))
(if
(graph-p graph)
(mapcar
#'vertex-name
(vertex-alist
(find vertex (graph-vlist graph)
:key
#'(lambda (x) (vertex-name x))))))))
(defun vertex-adjacency-list-from-elist
(vertex edge-list
&key (adjacency-list (list vertex)))
(cond
((null edge-list)
(remove vertex adjacency-list))
((member vertex (car edge-list))
(vertex-adjacency-list-from-elist
vertex
(cdr edge-list)
:adjacency-list
(union (car edge-list) adjacency-list)))
(t (vertex-adjacency-list-from-elist
vertex
(cdr edge-list)
:adjacency-list adjacency-list))))
;;;
(defun amatrix-vlist (amatrix) (caddr amatrix))
(defun amatrix-matrix (amatrix) (cadr amatrix))
(defun vertex-adjacency-list-from-amatrix
(vertex graph)
(let* ((vlist (amatrix-vlist graph))
(amatrix (amatrix-matrix graph))
(index (position vertex vlist))
(len (length vlist))
(result nil))
(dotimes (i len)
(if (aref amatrix index i)
(push (elt vlist i) result)))
result))
generated through LaTeX2HTML. M.Inaba 平成18年5月6日