19
バイオプログラミング第2 慶應義塾大学理工学部 生命情報学科 榊原康文、佐藤健吾

バイオプログラミング第2 - GitHub Pages...課題2:宣教師と土人 •N人の宣教師とN人の土人が川を渡ろうとして いる。ボートはM人乗りである。ただし、川の

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: バイオプログラミング第2 - GitHub Pages...課題2:宣教師と土人 •N人の宣教師とN人の土人が川を渡ろうとして いる。ボートはM人乗りである。ただし、川の

バイオプログラミング第2

慶應義塾大学理工学部

生命情報学科

榊原康文、佐藤健吾

Page 2: バイオプログラミング第2 - GitHub Pages...課題2:宣教師と土人 •N人の宣教師とN人の土人が川を渡ろうとして いる。ボートはM人乗りである。ただし、川の

パズルを解く

• 人間の場合

–定石や勘で解くことができる

• コンピュータの場合

–すべての場合をしらみ潰しで数え上げる

Page 3: バイオプログラミング第2 - GitHub Pages...課題2:宣教師と土人 •N人の宣教師とN人の土人が川を渡ろうとして いる。ボートはM人乗りである。ただし、川の

バックトラック法

• 深さ優先探索を使って、すべてのパターンを系統的に探索する

初期状態

取りうるすべての操作

次の状態

終了状態

これ以上先に進めない状態

Page 4: バイオプログラミング第2 - GitHub Pages...課題2:宣教師と土人 •N人の宣教師とN人の土人が川を渡ろうとして いる。ボートはM人乗りである。ただし、川の

課題1:Nクイーン問題

• N×Nのチェス盤上にN個のクイーンを配置す

る。この時、どの駒も他の駒に取られるような位置にあってはいけない。

Page 5: バイオプログラミング第2 - GitHub Pages...課題2:宣教師と土人 •N人の宣教師とN人の土人が川を渡ろうとして いる。ボートはM人乗りである。ただし、川の

状態をどのように表すか?

• N×Nの2次元配列 int board[N][N]– board[i][j]=0の時: (i,j)に駒はない

– bodar[i][j]≠0の時: (i,j)に駒がある

Page 6: バイオプログラミング第2 - GitHub Pages...課題2:宣教師と土人 •N人の宣教師とN人の土人が川を渡ろうとして いる。ボートはM人乗りである。ただし、川の

新しい駒を置けるか判定する

• 駒の利き筋に他の駒がないかを調べる

(i, j)

x=i

y=j

y=x+j-i

y=-x+i+j

Page 7: バイオプログラミング第2 - GitHub Pages...課題2:宣教師と土人 •N人の宣教師とN人の土人が川を渡ろうとして いる。ボートはM人乗りである。ただし、川の

バックトラック法

• 深さ優先探索を使って、すべてのパターンを系統的に探索する

何も置いていない状態

1列目

駒を置けない状態

(1,1)

(1,2)

(1,3)

(1,N)

2列目

(2,1)

(2,3)

(2,2)

(2,4)

(2,N)

N列目

Page 8: バイオプログラミング第2 - GitHub Pages...課題2:宣教師と土人 •N人の宣教師とN人の土人が川を渡ろうとして いる。ボートはM人乗りである。ただし、川の

バックトラック法

• 再帰関数を使って深さ優先探索を実現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の値を変える

Page 9: バイオプログラミング第2 - GitHub Pages...課題2:宣教師と土人 •N人の宣教師とN人の土人が川を渡ろうとして いる。ボートはM人乗りである。ただし、川の

課題1(必須)

• Nクイーン問題を解いて、解の個数を計算するプログラムを作成せよ。–レポートにはN=1~8までの計算結果を載せること。

• (余裕がある人)状態変数を工夫すると高速化することができる。それにより可能な限り大きなNに挑戦せよ。

• 今回の課題は、どちらの言語(C, Python)で作成しても良い。

Page 10: バイオプログラミング第2 - GitHub Pages...課題2:宣教師と土人 •N人の宣教師とN人の土人が川を渡ろうとして いる。ボートはM人乗りである。ただし、川の

課題2:宣教師と土人

• N人の宣教師とN人の土人が川を渡ろうとしている。ボートはM人乗りである。ただし、川の

両岸、ボートにおいて宣教師よりも土人の人数が多くなった場合には宣教師が襲われてしまう。安全に川を渡るための最短の手順を求めよ。

Page 11: バイオプログラミング第2 - GitHub Pages...課題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

Page 12: バイオプログラミング第2 - GitHub Pages...課題2:宣教師と土人 •N人の宣教師とN人の土人が川を渡ろうとして いる。ボートはM人乗りである。ただし、川の

解の求め方

• 対象の状態を表した探索木を探索する

初期状態

取りうるすべての操作

次の状態

終了状態

これ以上先に進めない状態

Page 13: バイオプログラミング第2 - GitHub Pages...課題2:宣教師と土人 •N人の宣教師とN人の土人が川を渡ろうとして いる。ボートはM人乗りである。ただし、川の

状態をどのように表すか?

• 両岸に何人ずついるか?

• ボートがどちら岸にあるか?

Page 14: バイオプログラミング第2 - GitHub Pages...課題2:宣教師と土人 •N人の宣教師とN人の土人が川を渡ろうとして いる。ボートはM人乗りである。ただし、川の

堂々巡りを許さない

• 過去の状態と同じ状態へは遷移しない

初期状態

取りうるすべての操作

Page 15: バイオプログラミング第2 - GitHub Pages...課題2:宣教師と土人 •N人の宣教師とN人の土人が川を渡ろうとして いる。ボートはM人乗りである。ただし、川の

最短の手順を求める

• 幅優先探索

• 反復深化深さ優先探索

Page 16: バイオプログラミング第2 - GitHub Pages...課題2:宣教師と土人 •N人の宣教師とN人の土人が川を渡ろうとして いる。ボートはM人乗りである。ただし、川の

深さ優先探索

• すべてのパターンを系統的に探索する

初期状態

Page 17: バイオプログラミング第2 - GitHub Pages...課題2:宣教師と土人 •N人の宣教師とN人の土人が川を渡ろうとして いる。ボートはM人乗りである。ただし、川の

幅優先探索

• 最も浅い(=最短)解が最初に見つかる

初期状態

Page 18: バイオプログラミング第2 - GitHub Pages...課題2:宣教師と土人 •N人の宣教師とN人の土人が川を渡ろうとして いる。ボートはM人乗りである。ただし、川の

反復深化深さ優先探索

• 深さNまでに制限して深さ優先探索を行い、Nを1ずつ増やしていく。最初に解に辿り着いたNが最短となる。

初期状態

深さ1まで 深さ2まで 深さ3まで

Page 19: バイオプログラミング第2 - GitHub Pages...課題2:宣教師と土人 •N人の宣教師とN人の土人が川を渡ろうとして いる。ボートはM人乗りである。ただし、川の

課題2(発展)

• 宣教師と土人問題を解くプログラムを作成し、(N=3, M=2), (N=4, M=3), (N=5, M=2), (N=5, M=3)などの場合の最短解を解け。

• 今回の課題は、どちらの言語(C, Python)で作成しても良い。