Mathematics and Natural Language Processing

組み合わせ爆発の問題を解こう その3 – 幅優先探索(Breadth-first Search,BFS)

幅優先探索は、1手ずつ動かしていく探し方です。では、早速、例題と、そこから1手進めた状態を見てみましょう。

1手目からは、下か左にしか動かせませんでした。では、2手目にはどのような動かし方があるでしょうか。

下に動かして上に動かすというのは意味がありませんから考慮しません。1手目を下に動かした場合は、2手目として “さらに下に動かす”、”右に動かす”、”左に動かす”の3つの動かし方があります。1手目に左に動かした場合は、下に動かすしかありません。

3手目はどうでしょうか。

1手目→2手目では動かし方が2パターンから4パターンに増えましたが、2手目→3手目は4パターンのままです。こういう場合もあるのですね。しかし、一番下のパターン、すなわち、左→下→右に動かした場合、4手目にはここからさらに上、右、下に動かすパターンが生まれます。

このように、1手ずつ動かし方を調べていくと、考えられる動かし方がどんどん増えていくのが、幅優先探索の特徴です。

また、1手ずつ探索するため、一番最初に完成の動かし方が見つかったら、それが最適な動かし方(場合によっては、いくつか考えられる最適な動かし方のうちの1つ)であることもわかります。

では、今回もプログラムを組んで、幅優先探索で解法を見つけるまでの手順を下記に列挙してみます。

盤面の状態動かし方
40=215=86
41=205=86D
04=215=86L
41=250=86DR
41=285=06DD
41=025=86DL
24=015=86LD
41=256=80DRD
41=285=60DDR
01=425=86DLU
24=105=86LDR
41=256=08DRDL
41=280=65DDRU
10=425=86DLUR
20=145=86LDRU
24=150=86LDRR
24=185=06LDRD
41=206=58DRDLU
41=208=65DDRUL
12=405=86DLURD
02=145=86LDRUL
24=156=80LDRRD
24=185=60LDRDR
40=216=58DRDLUU
41=260=58DRDLUR
41=026=58DRDLUL
40=218=65DDRULU
41=268=05DDRULD
41=028=65DDRULL
12=450=86DLURDR
12=485=06DLURDD
12=045=86DLURDL
12=045=86LDRULD
24=156=08LDRRDL
24=180=65LDRDRU
04=216=58DRDLUUL
41=268=50DRDLURD
01=426=58DRDLULU
04=218=65DDRULUL
41=268=50DDRULDR
01=428=65DDRULLU
12=456=80DLURDRD

深さ優先探索では9198回動かさなければならなかったのに、今回は41回動かせば解答に辿りつけました。これは早いですね。

しかし、幅優先探索にも弱点があります。それは、メモリの使用量が多いこと。n手目にすすめるためにはn-1手目の状態をすべて覚えて置かなければなりません。今回の問題は7手で解けましたが、30手を超えるような動かし方が必要な場合は、ほぼ確実にメモリが足りなくなります。

ということで、幅優先探索でスライドパズルを解くときの特徴は次のとおりです。

  • すべてのパターンを網羅するため、必ず最短の動かし方がわかる。
  • 解法が見つかってた時点で、それが最適解と分かる。
  • メモリの使用量が膨大。

次回は、組合せ爆発について、もう少しまとめてみたいと思います。