next up previous
Next: 6 グラフ Up: 5 状態空間探索による問題解決 Previous: 5.3.2 積み木の問題解決

5.4 状態表現の一般化

積木の例でのs8は((a on b) (b on c) (c on table))という状態であるが, これは意味としては3つの積木の状態の集合であるから,その要素の順番はこの 順である必要はない.そこで,((b on c) (a on b) (c on table))とい うように最初の順番を変えて与えてみると,
> (depth-first *blocks-graph*
      '((b on c) (a on b) (c on table))
      '((a on table) (b on c) (c on a)))
nil
このようになって,パスがないという答えが返ってくる. それは当然であり,状態が同じかどうかを判定する ところでこの状態表現へ対応していないからである. そこで,ここでグラフの頂点の比較はリスト表現された ものの集合であるということから,集合が等しいかどうかを判定する 関数set=を使って,二つのノード状態が等しいかどうかを 判定する基本関数を以下のように,

(defun node-equal (a b) (set= a b))
と定義する.ただし,今の場合,この集合の要素を比較する 関数はeqではだめで,equalでなければならない. このようにすれば,
> (depth-first *blocks-graph*
      '((b on c) (a on b) (c on table))
      '((a on table) (b on c) (c on a)))

(((b on c) (a on b) (c on table))
 ((a on table) (b on c) (c on table))
 ((a on table) (b on table) (c on table))
 ((a on table) (b on table) (c on b))
 ((a on table) (b on table) (c on a))
 ((a on table) (b on c) (c on a)))
という結果になり,無事探索が成功する. このように,問題空間の表現をシンボル,リスト, 集合で表すことが可能であるが,それぞれにおいて 状態が同じかどうかを判定する手続きnode-equalを 定義しなおせば同じ探索手続きを用いることが できる.

generated through LaTeX2HTML. M.Inaba 平成18年5月7日