Upload
others
View
1
Download
0
Embed Size (px)
Citation preview
バイオプログラミング第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)に駒がある
新しい駒を置けるか判定する
• 駒の利き筋に他の駒がないかを調べる
◯
◯
◯
◯
(i, j)
x=i
y=j
y=x+j-i
y=-x+i+j
バックトラック法
• 深さ優先探索を使って、すべてのパターンを系統的に探索する
何も置いていない状態
1列目
駒を置けない状態
(1,1)
(1,2)
(1,3)
(1,N)
2列目
(2,1)
(2,3)
(2,2)
(2,4)
(2,N)
N列目
バックトラック法
• 再帰関数を使って深さ優先探索を実現function NQueen(x)if すべての列が終わった解をカウントするreturn
for each y s.t. (x,y)に駒を置ける(x,y)に駒を置くNQueen(x+1)(x,y)の駒を退かす
end forend function
x=Nかどうかを調べる
(x,y)の利き筋に他の駒があるかを調べる
状態変数boardの値を変える
課題1(必須)
• Nクイーン問題を解いて、解の個数を計算するプログラムを作成せよ。–レポートにはN=1~8までの計算結果を載せること。
• (余裕がある人)状態変数を工夫すると高速化することができる。それにより可能な限り大きなNに挑戦せよ。
• 今回の課題は、どちらの言語(C, Python)で作成しても良い。
課題2:宣教師と土人
• N人の宣教師とN人の土人が川を渡ろうとしている。ボートはM人乗りである。ただし、川の
両岸、ボートにおいて宣教師よりも土人の人数が多くなった場合には宣教師が襲われてしまう。安全に川を渡るための最短の手順を求めよ。
宣教師と土人
• N=3, M=2の場合 0: MMMCCC|<_> | 1: MMMC | <_>| CC 2: MMMCC |<_> | C 3: MMM | <_>| CCC4: MMMC |<_> | CC 5: M C | <_>|MM CC 6: MM CC |<_> |M C 7: CC | <_>|MMMC 8: CCC|<_> |MMM 9: C | <_>|MMMCC
10: CC |<_> |MMMC 11: | <_>|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)などの場合の最短解を解け。
• 今回の課題は、どちらの言語(C, Python)で作成しても良い。