バイオプログラミング第2 慶應義塾大学理工学部 生命情報学科 榊原康文、佐藤健吾 パズルを解く • 人間の場合 – 定石や勘で解くことができる • コンピュータの場合 – すべての場合をしらみ潰しで数え上げる バックトラック法 • 深さ優先探索を使って、すべてのパターンを 系統的に探索する これ以上先に 進めない状態 次の状態 初期状態 終了状態 取りうるすべての操作 課題1:Nクイーン問題 • N×Nのチェス盤上にN個のクイーンを配置す る。この時、どの駒も他の駒に取られるような 位置にあってはいけない。 ◯ ◯ ◯ ◯ ◯ ◯ ◯ ◯ 状態をどのように表すか? • N×Nの2次元配列 int board[N][N] – board[i][j]=0の時: (i,j)に駒はない – bodar[i][j]≠0の時: (i,j)に駒がある 新しい駒を置けるか判定する • 駒の利き筋に他の駒がないかを調べる x=i ◯ y=x+j-i ◯ ◯ y=j ◯ y=-x+i+j (i,j) バックトラック法 • 深さ優先探索を使って、すべてのパターンを 駒を置けない状態 系統的に探索する 2列目 1列目 何も置いて いない状態 (1,1) (1,2) (2,1) (2,2) (2,3) (2,4) (1,3) (2,N) (1,N) N列目 バックトラック法 • 再帰関数を使って深さ優先探索を実現 function NQueen(x) if すべての列が終わった 解をカウントする return for each ys.t. (x,y)に駒を置ける (x,y)に駒を置く NQueen(x+1) (x,y)の駒を退かす endfor endfunction x=Nかどうかを調べる (x,y)の利き筋に他の駒 があるかを調べる 状態変数boardの値を 変える 課題1(必須) • Nクイーン問題を解いて、解の個数を計算す るプログラムを作成せよ。 – レポートにはN=1~8までの計算結果を載せること。 • (余裕がある人) 状態変数を工夫すると高速化することができ る。それにより可能な限り大きなNに挑戦せよ。 課題2:宣教師と土人 • N人の宣教師とN人の土人が川を渡ろうとして いる。ボートはM人乗りである。ただし、川の 両岸、ボートにおいて宣教師よりも土人の人 数が多くなった場合には宣教師が襲われてし まう。安全に川を渡るための最短の手順を求 めよ。 宣教師と土人 • N=3, M=2の場合 0: 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: MMMCCC|<_> MMMC | MMMCC |<_> MMM | MMMC |<_> M C | MM CC |<_> CC | CCC|<_> C | CC |<_> | | <_>| CC | C <_>| CCC | CC <_>|MM CC |M C <_>|MMMC |MMM <_>|MMMCC |MMMC <_>|MMMCCC 解の求め方 • 対象の状態を表した探索木を探索する これ以上先に 進めない状態 次の状態 初期状態 終了状態 取りうるすべての操作 状態をどのように表すか? • 両岸に何人ずついるか? • ボートがどちら岸にあるか? 堂々巡りを許さない • 過去の状態と同じ状態へは遷移しない 初期状態 取りうるすべての操作 最短の手順を求める • 幅優先探索 • 反復深化深さ優先探索 深さ優先探索 • すべてのパターンを系統的に探索する 初期状態 幅優先探索 • 最も浅い(=最短)解が最初に見つかる 初期状態 反復深化深さ優先探索 • 深さNまでに制限して深さ優先探索を行い、N を1ずつ増やしていく。最初に解に辿り着いた Nが最短となる。 初期状態 深さ1まで 深さ2まで 深さ3まで 課題2(発展) • 宣教師と土人問題を解くプログラムを作成し、 (N=3,M=2),(N=4,M=3),(N=5,M=2),(N=5, M=3)などの場合の最短解を解け。
© Copyright 2025 ExpyDoc