Mathematics and Natural Language Processing

組み合わせ爆発の問題を解こう その2 – 深さ優先探索(Depth-first Search, DFS)

では早速、スライドパズルを解いてみましょう。問題は、これまでの例題と同じです。

まずは「深さ優先探索」で解いてみます。深さ優先探索でスライドパズルを解くということは、とりあえず、どんどんスライドさせていき、それ以上スライドできなくなったら、1手戻って、別方向にスライドさせる…ということです。といっても、ちょっとわかりませんね。

もう一度、例題を見てみましょう。

一つここで決まりごとを決めます。「動かす方向を検討する順番は上→右→下→左とする」としましょう。例題の状態では…、

  • 上には動かせない(壁があるから)
  • 右には動かせない(壁があるから)
  • 下には動かせる

ということで、下に動かしてみましょう。

下に動かした図は次のとおりです。

では、次の動かし方を検討しましょう。

  • 上には動かせるが、初期状態と同じになるから動かさない。
  • 右には動かせる。

ということで、右に動かしてみましょう。

右に動かした図は次のとおりです。

では、次の動かし方を検討しましょう。

  • 上には動かせない(壁があるから)
  • 右には動かせない(壁があるから)
  • 下には動かせる

下に動かした図は次のとおりです。

では、次の動かし方を…、ということをどんどん続けていきます。

そうすると、どこかのタイミングで、どちらの方向にも動かせなくなる状態になります(どの方向に動かしても、壁がある、またはこれまで出てきた盤面と同じ状態となる)。その時は、これまで動きをさかのぼり、動かせるところから続ける、ということをします。

例題では、初期状態では下と左に動かせます。1手目に下で動かした場合の動かし方をすべて試したあとに、次に、1手目が左で動かした場合をすべて試します。1手目が左の場合をすべて試したあとは、1手目として取れるすべてのパターンを試したため、プログラムを終了させます。

スライドさせている途中で、完成状態になる場合もありますが、深さ優先探索の欠点は、その完成状態が、最適な動かし方で到達したものかどうかが、その場では判断できないことです。「動かす方向を検討する順番は上→右→下→左とする」という決まりで勝手に動かしたため、ものすごく動かしてからの完成なのかもしれません。どの動かし方が最も手順が少なかったかがわかるのは、すべてのパターンを試した後です。

一応参考までに、下に動かした履歴のうち、最初から100手までを掲載します。コロンより前が盤面の状態(=が壁、0が空白のマス、盤面のサイズが3×3なので、「40=215=86」のとき、1行目が「40=」、2行目が「215」、3行目が「=86」となります)、コロンより後が、その状態を作り出すために動かした空白マスの方向を示します(Uが上、Rが右、Dが下、Lが左)。

盤面の状態動かし方
40=215=86
41=205=86D
41=250=86DR
41=256=80DRD
41=256=08DRDL
41=206=58DRDLU
40=216=58DRDLUU
04=216=58DRDLUUL
24=016=58DRDLUULD
24=106=58DRDLUULDR
20=146=58DRDLUULDRU
02=146=58DRDLUULDRUL
12=046=58DRDLUULDRULD
12=406=58DRDLUULDRULDR
10=426=58DRDLUULDRULDRU
01=426=58DRDLUULDRULDRUL
41=026=58DRDLUULDRULDRULD
12=460=58DRDLUULDRULDRR
12=468=50DRDLUULDRULDRRD
12=468=05DRDLUULDRULDRRDL
12=408=65DRDLUULDRULDRRDLU
10=428=65DRDLUULDRULDRRDLUU
01=428=65DRDLUULDRULDRRDLUUL
41=028=65DRDLUULDRULDRRDLUULD
41=208=65DRDLUULDRULDRRDLUULDR
40=218=65DRDLUULDRULDRRDLUULDRU
04=218=65DRDLUULDRULDRRDLUULDRUL
24=018=65DRDLUULDRULDRRDLUULDRULD
24=108=65DRDLUULDRULDRRDLUULDRULDR
20=148=65DRDLUULDRULDRRDLUULDRULDRU
02=148=65DRDLUULDRULDRRDLUULDRULDRUL
12=048=65DRDLUULDRULDRRDLUULDRULDRULD
24=180=65DRDLUULDRULDRRDLUULDRULDRR
24=185=60DRDLUULDRULDRRDLUULDRULDRRD
24=185=06DRDLUULDRULDRRDLUULDRULDRRDL
24=105=86DRDLUULDRULDRRDLUULDRULDRRDLU
20=145=86DRDLUULDRULDRRDLUULDRULDRRDLUU
02=145=86DRDLUULDRULDRRDLUULDRULDRRDLUUL
12=045=86DRDLUULDRULDRRDLUULDRULDRRDLUULD
12=405=86DRDLUULDRULDRRDLUULDRULDRRDLUULDR
10=425=86DRDLUULDRULDRRDLUULDRULDRRDLUULDRU
01=425=86DRDLUULDRULDRRDLUULDRULDRRDLUULDRUL
41=025=86DRDLUULDRULDRRDLUULDRULDRRDLUULDRULD
12=450=86DRDLUULDRULDRRDLUULDRULDRRDLUULDRR
12=456=80DRDLUULDRULDRRDLUULDRULDRRDLUULDRRD :Solved!
12=485=06DRDLUULDRULDRRDLUULDRULDRRDLUULDRD
12=485=60DRDLUULDRULDRRDLUULDRULDRRDLUULDRDR
12=480=65DRDLUULDRULDRRDLUULDRULDRRDLUULDRDRU
24=150=86DRDLUULDRULDRRDLUULDRULDRRDLUR
24=156=80DRDLUULDRULDRRDLUULDRULDRRDLURD
24=156=08DRDLUULDRULDRRDLUULDRULDRRDLURDL
24=015=86DRDLUULDRULDRRDLUULDRULDRRDLUL
04=215=86DRDLUULDRULDRRDLUULDRULDRRDLULU
24=168=05DRDLUULDRULDRRDLUULDRULDRD
24=168=50DRDLUULDRULDRRDLUULDRULDRDR
24=160=58DRDLUULDRULDRRDLUULDRULDRDRU
41=280=65DRDLUULDRULDRRDLUULDRR
41=285=60DRDLUULDRULDRRDLUULDRRD
41=285=06DRDLUULDRULDRRDLUULDRRDL
41=268=05DRDLUULDRULDRRDLUULDRD
41=268=50DRDLUULDRULDRRDLUULDRDR
41=260=58DRDLUULDRULDRRDLUULDRDRU
12=480=65DRDLUULDRULDRRDLUR
12=485=60DRDLUULDRULDRRDLURD
12=485=06DRDLUULDRULDRRDLURDL
12=405=86DRDLUULDRULDRRDLURDLU
10=425=86DRDLUULDRULDRRDLURDLUU
01=425=86DRDLUULDRULDRRDLURDLUUL
41=025=86DRDLUULDRULDRRDLURDLUULD
12=450=86DRDLUULDRULDRRDLURDLUR
12=456=80DRDLUULDRULDRRDLURDLURD :Solved!
12=045=86DRDLUULDRULDRRDLURDLUL
02=145=86DRDLUULDRULDRRDLURDLULU
20=145=86DRDLUULDRULDRRDLURDLULUR
24=105=86DRDLUULDRULDRRDLURDLULURD
24=150=86DRDLUULDRULDRRDLURDLULURDR
24=156=80DRDLUULDRULDRRDLURDLULURDRD
24=156=08DRDLUULDRULDRRDLURDLULURDRDL
24=185=06DRDLUULDRULDRRDLURDLULURDD
24=185=60DRDLUULDRULDRRDLURDLULURDDR
24=180=65DRDLUULDRULDRRDLURDLULURDDRU
24=108=65DRDLUULDRULDRRDLURDLULURDDRUL
20=148=65DRDLUULDRULDRRDLURDLULURDDRULU
02=148=65DRDLUULDRULDRRDLURDLULURDDRULUL
12=048=65DRDLUULDRULDRRDLURDLULURDDRULULD
24=168=05DRDLUULDRULDRRDLURDLULURDDRULD
24=168=50DRDLUULDRULDRRDLURDLULURDDRULDR
24=160=58DRDLUULDRULDRRDLURDLULURDDRULDRU
24=018=65DRDLUULDRULDRRDLURDLULURDDRULL
04=218=65DRDLUULDRULDRRDLURDLULURDDRULLU
40=218=65DRDLUULDRULDRRDLURDLULURDDRULLUR
41=208=65DRDLUULDRULDRRDLURDLULURDDRULLURD
41=280=65DRDLUULDRULDRRDLURDLULURDDRULLURDR
41=285=60DRDLUULDRULDRRDLURDLULURDDRULLURDRD
41=285=06DRDLUULDRULDRRDLURDLULURDDRULLURDRDL
41=268=05DRDLUULDRULDRRDLURDLULURDDRULLURDD
41=268=50DRDLUULDRULDRRDLURDLULURDDRULLURDDR
41=260=58DRDLUULDRULDRRDLURDLULURDDRULLURDDRU
41=028=65DRDLUULDRULDRRDLURDLULURDDRULLURDL
01=428=65DRDLUULDRULDRRDLURDLULURDDRULLURDLU
10=428=65DRDLUULDRULDRRDLURDLULURDDRULLURDLUR

最初の100通りの動かすパターンのうち、2つのパターンが完成状態になっています。

  • 12=456=80:DRDLUULDRULDRRDLUULDRULDRRDLUULDRRD:Solved
  • 12=456=80:DRDLUULDRULDRRDLURDLURD:Solved

でも、どちらも、最適解(この問題では7手で完成状態になる動かし方があります)である動かし方ではありません。まだまだ、パターンの列挙が足りないのですね。

なお、プログラムを組んで検証すると、この問題では、動かせるパターンは9198通りありました。

深さ優先探索は、上の動かせるパターンを見るとわかりますが、どんどん空白マスを動かそうとするために、動かした履歴が長く長く、たまに短くなって、また、長く長くなっていくという動きになっています。

深さ優先探索でスライドパズルを解くときの特徴は次のとおりです。

  • すべてのパターンを網羅するため、必ず最短の動かし方がわかる。
  • 解法が見つかっても、その時点で最適なのかが判断できないため、すべての動かし方を試さないと、最適解が分からない。
  • メモリの使用量が少ない。

ということで、次回は、幅優先探索で解いてみたいと思います。