組み合わせ爆発の問題を解こう その3 – 幅優先探索(Breadth-first Search,BFS)
2012-09-17Mathematics
幅優先探索は、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=86 | D |
04=215=86 | L |
41=250=86 | DR |
41=285=06 | DD |
41=025=86 | DL |
24=015=86 | LD |
41=256=80 | DRD |
41=285=60 | DDR |
01=425=86 | DLU |
24=105=86 | LDR |
41=256=08 | DRDL |
41=280=65 | DDRU |
10=425=86 | DLUR |
20=145=86 | LDRU |
24=150=86 | LDRR |
24=185=06 | LDRD |
41=206=58 | DRDLU |
41=208=65 | DDRUL |
12=405=86 | DLURD |
02=145=86 | LDRUL |
24=156=80 | LDRRD |
24=185=60 | LDRDR |
40=216=58 | DRDLUU |
41=260=58 | DRDLUR |
41=026=58 | DRDLUL |
40=218=65 | DDRULU |
41=268=05 | DDRULD |
41=028=65 | DDRULL |
12=450=86 | DLURDR |
12=485=06 | DLURDD |
12=045=86 | DLURDL |
12=045=86 | LDRULD |
24=156=08 | LDRRDL |
24=180=65 | LDRDRU |
04=216=58 | DRDLUUL |
41=268=50 | DRDLURD |
01=426=58 | DRDLULU |
04=218=65 | DDRULUL |
41=268=50 | DDRULDR |
01=428=65 | DDRULLU |
12=456=80 | DLURDRD |
深さ優先探索では9198回動かさなければならなかったのに、今回は41回動かせば解答に辿りつけました。これは早いですね。
しかし、幅優先探索にも弱点があります。それは、メモリの使用量が多いこと。n手目にすすめるためにはn-1手目の状態をすべて覚えて置かなければなりません。今回の問題は7手で解けましたが、30手を超えるような動かし方が必要な場合は、ほぼ確実にメモリが足りなくなります。
ということで、幅優先探索でスライドパズルを解くときの特徴は次のとおりです。
- すべてのパターンを網羅するため、必ず最短の動かし方がわかる。
- 解法が見つかってた時点で、それが最適解と分かる。
- メモリの使用量が膨大。
次回は、組合せ爆発について、もう少しまとめてみたいと思います。
Topic
- Mathematics (15)
- Natural Language Processing (1)