整数計画法によるパズル解法
This presentation is the property of its rightful owner.
Sponsored Links
1 / 67

整数計画法によるパズル解法 (実習報告) PowerPoint PPT Presentation


  • 153 Views
  • Uploaded on
  • Presentation posted in: General

整数計画法によるパズル解法 (実習報告). 岡本 吉央 (豊橋技術科学大学情報工学系) ミニ研究集会「組合せゲーム・パズル」 平成19年 3月16日 (金). 豊橋技術科学大学について. 設立:1976年 目的:高専生受入 ↓↓ 技術科学大学: 「長岡」と「豊橋」 詳細:「三十年史」を参照. http://www.tut.ac.jp/30th/book.html. 豊橋技術科学大学:入学生. 高等学校. 高専・短大. 外国人留学生. 高専専攻科.  社会人 .  他大学 . 豊橋技術科学大学:出身地域. 中部. 外国. 北海道・東北. その他.

Download Presentation

整数計画法によるパズル解法 (実習報告)

An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -

Presentation Transcript


4150420

整数計画法によるパズル解法(実習報告)

岡本 吉央

(豊橋技術科学大学情報工学系)

ミニ研究集会「組合せゲーム・パズル」

平成19年 3月16日 (金)


4150420

豊橋技術科学大学について

  • 設立:1976年

  • 目的:高専生受入↓↓

  • 技術科学大学:「長岡」と「豊橋」

  • 詳細:「三十年史」を参照

http://www.tut.ac.jp/30th/book.html


4150420

豊橋技術科学大学:入学生

高等学校

高専・短大

外国人留学生

高専専攻科

 社会人 

 他大学 


4150420

豊橋技術科学大学:出身地域

中部

外国

北海道・東北

その他

近畿

中国

関東

九州・沖縄

愛知

四国


4150420

高専生体験実習

  • 開催時期:7月後半~8月前半

  • 対象:高専4年生

  • 目的:「本学における教育研究分野の実習を体験することにより、学校教育の充実及び学生の学習意欲の喚起等」

  • 受入期間:1週間

  • 注:大抵「インターン」の単位付与

全国の高専分布


4150420

私の実習テーマ

  • 「整数計画法によるパズル解法」

  • 目的:

    • 整数計画モデルの初歩の習得

    • パズルの数理的側面に対する意識

    • 道具としてのプログラミングの利用

  • 受入条件:

    • C/C++言語によるプログラミング経験がある

    • 数理的・論理的思考が好きである

  • 藤戸敏弘先生との共同

  • 大学院生4人の(とても親切な)手伝い


4150420

この発表では...

  • 実習の流れの説明

  • 実際の解法の説明 (数独を例として)

  • その他注意事項


4150420

募集状況・受入状況

  • 募集人数:3人

  • 応募人数:7人

  • 受入人数:7人(電気、電子、制御、情報などの学科より)

  • 補足

    • 大学全体で58テーマ、約120名受入

    • 120÷58=およそ2


4150420

スケジュール

  • 時間割

    • 朝 9:00~12:00

    • 昼 13:30~16:00

    • 夕 16:30~18:00

  • 流れ

    • 月・火 導入

    • 水・木 個別実習 (班実習)

    • 金    発表会 および 討論


4150420

スケジュール・時間割


4150420

実習で行なうことの流れ

  • パズルが持つ論理的な構造を抽出

  • それを整数計画問題として定式化

  • 整数計画問題ソルバによる求解

  • 使用したソルバ:

    • GLPK (GNU Linear Programming Kit)

    • Andrew Makhorin (ロシア) による

    • http://www.gnu.org/software/glpk/

  • 自作テキスト(未完成)とGLPKレファレンス・マニュアル邦訳(未完成)を配布


4150420

ソルバに解かせる部分の詳細

パズルをそのまま記述したファイル    ↓ 整数計画問題出力プログラム    ↓

整数計画問題として記述したファイル    ↓ 整数計画問題求解プログラム    ↓

パズルの解答ファイル


4150420

GLPK利用

ソルバに解かせる部分の詳細

パズルをそのまま記述したファイル    ↓整数計画問題出力プログラム    ↓

整数計画問題として記述したファイル    ↓整数計画問題求解プログラム    ↓

パズルの解答ファイル

実習生が作成する部分


4150420

実習で扱うパズル

  • 月曜日: 魔方陣と数独

  • 火曜日: ののぐらむ (お絵かきロジック)

  • 水曜日、木曜日: 実習生が選択

    • 美術館

    • カックロ

    • ナンバーリンク

    • 覆面算

    • ウォールロジック


4150420

実習で扱うパズル

  • 月曜日: 魔方陣と数独

  • 火曜日: ののぐらむ (お絵かきロジック)

  • 水曜日、木曜日: 実習生が選択

    • 美術館

    • カックロ

    • ナンバーリンク

    • 覆面算

    • ウォールロジック

定式化とプログラムは与える

実習生はプログラムを読んだり、変更することで感覚を掴む


4150420

実習で扱うパズル

  • 月曜日: 魔方陣と数独

  • 火曜日: ののぐらむ (お絵かきロジック)

  • 水曜日、木曜日: 実習生が選択

    • 美術館

    • カックロ

    • ナンバーリンク

    • 覆面算

    • ウォールロジック

定式化とプログラムは与える

実習生はプログラムを読んだり、変更することで感覚を掴む

実習生は定式化とプログラムを自分で一から考えて作る


4150420

実習の流れを数独で説明

  • 空きマスに1から9までの数字をいれる

  • 同じ横行と縦列、そして3x3のブロックには同じ数字を1つしか入れてはいけない

解答→

パズル通信ニコリ144号,114.26ページ,例問より転載


4150420

GLPK利用

ソルバに解かせる部分の詳細

パズルをそのまま記述したファイル    ↓ 整数計画問題出力プログラム    ↓

整数計画問題として記述したファイル    ↓ 整数計画問題求解プログラム    ↓

パズルの解答ファイル


4150420

GLPK利用

ソルバに解かせる部分の詳細

パズルをそのまま記述したファイル    ↓ 整数計画問題出力プログラム    ↓

整数計画問題として記述したファイル    ↓ 整数計画問題求解プログラム    ↓

パズルの解答ファイル


4150420

..6.....1

.7..6..5.

8..1.32..

..5.4.8..

.4.7.2.9.

..8.1.7..

..12.5..3

.6..7..8.

2.....4..

数独入力ファイル


4150420

GLPK利用

ソルバに解かせる部分の詳細

パズルをそのまま記述したファイル    ↓ 整数計画問題出力プログラム    ↓

整数計画問題として記述したファイル    ↓ 整数計画問題求解プログラム    ↓

パズルの解答ファイル


4150420

GLPK利用

ソルバに解かせる部分の詳細

パズルをそのまま記述したファイル    ↓ 整数計画問題出力プログラム    ↓

整数計画問題として記述したファイル    ↓ 整数計画問題求解プログラム    ↓

パズルの解答ファイル


4150420

j =

1

2

3

4

5

6

7

8

9

1

i =

2

3

4

5

6

7

8

9

どんな変数を用意するか

  • 上から i 番目で左から j 番目のマス目が k という数字になるということを01変数に

  • 変数: x[i,j,k] (9x9x9個)

  • 解釈:上の通り


4150420

どんな制約を用意するか? 1

  • 各マス目には数字がちょうど1つ入る

  • 上から i 番目の横行と左から j 番目の縦列に対して、x[i,j,1]+x[i,j,2]+x[i,j,3]+x[i,j,4]+x[i,j,5]+x[i,j,6]+x[i,j,7]+x[i,j,8]+x[i,j,9] = 1


4150420

どんな制約を用意するか? 2

  • 各横行には各数字が1つずつ入る

  • 上から i 番目の横行と数字 k に対して、x[i,1,k]+x[i,2,k]+x[i,3,k]+x[i,4,k]+x[i,5,k]+x[i,6,k]+x[i,7,k]+x[i,8,k]+x[i,9,k] = 1


4150420

どんな制約を用意するか? 3

  • 各縦列には各数字が1つずつ入る

  • 左から j 番目の縦列と数字 k に対して、x[1,j,k]+x[2,j,k]+x[3,j,k]+x[4,j,k]+x[5,j,k]+x[6,j,k]+x[7,j,k]+x[8,j,k]+x[9,j,k] = 1


4150420

どんな制約を用意するか? 4

  • 各ブロックには各数字が1つずつ入る

  • 例えば左上のブロックに対して、x[1,1,k]+x[2,1,k]+x[3,1,k]+x[1,2,k]+x[2,2,k]+x[3,2,k]+x[1,3,k]+x[2,3,k]+x[3,3,k] = 1


4150420

どんな制約を用意するか? 5

  • 既に数字が入っているマス目にはそれに対応する変数を1にする

  • 例えばx[3,4,1] = 1x[5,2,4] = 1など


4150420

数独を解く問題

  • 数独を解く問題が制約1、2、3、4、5をすべて満たす場合があるかどうか調べる整数計画問題になった

    注: 整数計画問題といっても、  「最適化問題」ではなく、  「許容性判定問題」になっている

    (「最適化問題」と「許容性判定問題」は多項式時間等価)


4150420

GLPK利用

ソルバに解かせる部分の詳細

パズルをそのまま記述したファイル    ↓ 整数計画問題出力プログラム    ↓

整数計画問題として記述したファイル    ↓ 整数計画問題求解プログラム    ↓

パズルの解答ファイル


4150420

GLPK利用

ソルバに解かせる部分の詳細

パズルをそのまま記述したファイル    ↓ 整数計画問題出力プログラム    ↓

整数計画問題として記述したファイル    ↓ 整数計画問題求解プログラム    ↓

パズルの解答ファイル


4150420

536827941

172964358

894153267

715349826

643782195

928516734

481295673

369471582

257638419

数独解答ファイル


4150420

実習の様子


4150420

実習の様子


4150420

実習の様子


4150420

実習の様子


4150420

実習で扱ったパズル

割と簡単

  • 数独

  • 美術館

  • 魔方陣

  • 覆面算

  • カックロ

  • お絵かきロジック

  • ウォールロジック

  • ナンバーリンク

(集合被覆問題っぽい)

数が数字として意味を持つ

割と難しい

(論理的含意「ならば」

を定式化に用いる)


4150420

「分断ルール」系

へやわけ

ぬりがべ

黒マスはどこだ

ひとりにしてくれ

ケイスケ

やじさんかずさん

「日本語の壁」系

スケルトン

シークワーズ

カナオレ

「言語知識必要」系

クロスワード

ナンクロ

推理パズル

推理クロス

「ループ」を作る系

スリザーリンク

ましゅ

ヤジリン

カントリーロード

ケイスケ

それ以外のパズル(超難しい?)

一部のパズルはWebニコリ「ニコリのパズル」より抜粋 http://www.nikoli.co.jp/


4150420

それ以外のパズル(実習でOK?)

  • サムライン

  • ナンスケ (ナンバースケルトン)

  • 波及効果

  • タイルペイント

  • バトルシップ

  • ビルディングパズル


4150420

発展的な実習課題

  • パズルの答えを1つ求めたとき、それ以外に答えがないことを確認したい。整数計画法でどのように行なえばよいか?

  • 「簡単に決まってしまうマス」を特定する方法を考えて、それによって決まったマスを予め定式化に組み込むことで、どれくらいの規模の問題が解けるようになるだろうか?


4150420

実習準備における心がけ

  • 実習生のプログラミング経験:配列、文字列が使える程度でOK

  • 整数計画法の導入:01整数計画のみ 「命題論理の算術化」として導入 (CSP?)アルゴリズムは説明しない

  • オリジナルテキストの作成: 重視

  • フリーソフトウェアの利用: 重視


4150420

最後に

  • 評価: おおむね好評 (ヒアリングによる)

  • 継続性: 来年度も実施予定

  • 効果: 整数計画問題の導入として好例

  • 注意: 次を伝えることにも重点を

    • 「整数計画法でパズルを解く」ことがパズルに対するアプローチとして非標準的であること

    • 「道具としてプログラミングを用いる」こと

おしまい


4150420

ありがとうございました

ここから予備スライド


4150420

3

2

2

1

3

1

2

2

3

2

8

7

4

3

1

3

2

1

2

1

5

5

2

1

2

1

3

6

1

3

2

1

3

4

1

1

ののぐらむを解いてみる

http://yuki-lab.jp/nonogram/RUN.HTM より転載


4150420

3

2

2

1

3

1

2

2

3

2

8

7

4

3

1

3

2

1

2

1

5

5

2

1

2

1

3

6

1

3

2

1

3

4

1

1

ののぐらむ:ルール (1)

  • 白マスを以下の規則に従って黒く塗る

  • 各横行の左、各縦列の上にある数字は、その行 (列) の中で連続して黒く塗る白マスの数を表す


4150420

3

2

2

1

3

1

2

2

3

2

8

7

4

3

1

3

2

1

2

1

5

5

2

1

2

1

3

6

1

3

2

1

3

4

1

1

ののぐらむ:ルール (2)

  • 1つの行 (列) に対して数字が複数あるときは、数字の並び順どおりにその数字の数だけ連続して黒く塗る

  • その場合、数字と数字の間に1マス以上の塗らないマスが入る


4150420

お絵かきロジック

イラストロジック

ピクロス

Paint by Numbers

Crucipixel

Edel

FigurePic

Grafilogika

Japanese Crosswords

Logic Art

Logic Square

Logicolor

Logik-Puzzles

Paint Logic

Pixel Puzzles

...

ののぐらむ:別の名前


4150420

3

2

2

1

3

1

2

2

3

2

8

7

4

3

1

3

2

1

2

1

5

5

2

1

2

1

3

6

1

3

2

1

3

4

1

1

第2番目の横行の第2クラスタ

定式化のための用語

以下の定式化はBosch (2001) と本質的に同じ

  • 第 i 番目の横行 =上から i 番目の横行

  • 第 j 番目の縦列 =左から j 番目の縦列

  • 第 i 番目の横行の第 k クラスタ =その横行の左から k 番目の黒マス塊

  • 第 j 番目の縦列の第 k クラスタ = 同様


4150420

3

2

2

1

3

1

2

2

3

2

8

7

4

3

1

3

2

1

2

1

5

5

2

1

2

1

3

6

1

3

2

1

3

4

1

1

変数の設定 (1)

  • 盤面の大きさはnrow × ncol とする

  • x[i,j] = 1 を上から i 番目、左から j 番目のマスが黒く塗られることとする

ncol

nrow


4150420

3

2

2

1

3

1

2

2

3

2

8

7

4

3

1

3

2

1

2

1

5

5

2

1

2

1

3

6

1

3

2

1

3

4

1

1

変数の設定 (2)

  • y[i,j,k] = 1 を第 i 番目の横行の第 k クラスタの左端が左から j 番目のマスにあることとする

  • nclt_row[i] =第 i 番目の横行のクラスタ数 とする


4150420

3

2

2

1

3

1

2

2

3

2

8

7

4

3

1

3

2

1

2

1

5

5

2

1

2

1

3

6

1

3

2

1

3

4

1

1

変数の設定 (3)

  • z[i,j,k] = 1 を第 j 番目の縦列の第 k クラスタの上端が上から i 番目のマスにあることとする

  • nclt_col[j] =第 j 番目の縦列のクラスタ数 とする


4150420

3

2

2

1

3

1

2

2

3

2

8

7

4

3

1

3

2

1

2

1

5

5

2

1

2

1

3

6

1

3

2

1

3

4

1

1

制約の設定 (1)

  • 第 i 横行の黒マスの数はその行のクラスタの数字の和x[i,1] + x[i,2] +x[i,3] + ... x[i,ncol]= R[i,1] + R[i,2] + ... + R[i,nclt_row[i]]

  • R[i,k] = 第 i 横行の第 k クラスタの数字


4150420

3

2

2

1

3

1

2

2

3

2

8

7

4

3

1

3

2

1

2

1

5

5

2

1

2

1

3

6

1

3

2

1

3

4

1

1

制約の設定 (2)

  • 第 j 縦列の黒マスの数はその列のクラスタの数字の和x[1,j] + x[2,j] +x[3,j] + ... x[nrow,j]= C[j,1] + C[j,2] + ... + C[j,nclt_col[j]]

  • C[j,k] = 第 j 縦列の第 k クラスタの数字


4150420

3

2

2

1

3

1

2

2

3

2

8

7

4

3

1

3

2

1

2

1

5

5

2

1

2

1

3

6

1

3

2

1

3

4

1

1

制約の設定 (3)

  • 第 i 横行の第 k クラスタの左端はどこかにあるy[i,1,k] + y[i,2,k] +y[i,3,k] + ... +y[i,ncol,k] = 1


4150420

3

2

2

1

3

1

2

2

3

2

8

7

4

3

1

3

2

1

2

1

5

5

2

1

2

1

3

6

1

3

2

1

3

4

1

1

制約の設定 (4)

  • 第 j 縦列の第 k クラスタの上端はどこかにあるz[1,j,k] + z[2,j,k] +z[3,j,k] + ... +z[nrow,j,k] = 1


4150420

3

2

2

1

3

1

2

2

3

2

8

7

4

3

1

3

2

1

2

1

5

5

2

1

2

1

3

6

1

3

2

1

3

4

1

1

制約の設定 (5) 難しい

  • 第 i 横行の第 k クラスタの左端が上から j マス目にあるならば、第 k+1 クラスタの左端は 左から j+R[i,k]+1 マス目か、それよりも右にないといけないR[i,k] = 第 i 横行の第 k クラスタの数字


4150420

3

2

2

1

3

1

2

2

3

2

8

7

4

3

1

3

2

1

2

1

5

5

2

1

2

1

3

6

1

3

2

1

3

4

1

1

制約の設定 (5) 続き

  • 書き下してみるとy[i,j,k] ≦y[i,j+R[i,k]+1,k+1] +y[i,j+R[i,k]+2,k+1] +y[i,j+R[i,k]+3,k+1] +... +y[i,ncol,k+1]


4150420

3

2

2

1

3

1

2

2

3

2

8

7

4

3

1

3

2

1

2

1

5

5

2

1

2

1

3

6

1

3

2

1

3

4

1

1

制約の設定 (6) 先と同様

  • 第 j 縦列の第 k クラスタの上端が左から i マス目にあるならば、第 k+1 クラスタの上端は上から i+C[j,k]+1 マス目か、それよりも下にないといけないC[j,k] = 第 j 縦列の第 k クラスタの数字


4150420

3

2

2

1

3

1

2

2

3

2

8

7

4

3

1

3

2

1

2

1

5

5

2

1

2

1

3

6

1

3

2

1

3

4

1

1

制約の設定 (6) 続き

  • 書き下してみるとz[i,j,k] ≦z[i+C[j,k]+1,j,k+1] +z[i+C[j,k]+2,j,k+1] +z[i+C[j,k]+3,j,k+1] +... +z[nrow,j,k+1]


4150420

3

2

2

1

3

1

2

2

3

2

8

7

4

3

1

3

2

1

2

1

5

5

2

1

2

1

3

6

1

3

2

1

3

4

1

1

制約の設定 (7) また難しい

  • 上から i 番目、左から j 番目のマス目が黒いならば、第 i 横行のあるクラスタがそのマス目を覆っていないといけない


4150420

3

2

2

1

3

1

2

2

3

2

8

7

4

3

1

3

2

1

2

1

5

5

2

1

2

1

3

6

1

3

2

1

3

4

1

1

この左辺をC[i,j,k]と書こう

制約の設定 (7) 続き

  • 書き下す前に...第 i 横行の第 k クラスタが左から j 番目のマス目を覆うとは?y[i,j-R[i,k]+1,k] +y[i,j-R[i,k]+2,k] +... +y[i,j,k] = 1


4150420

3

2

2

1

3

1

2

2

3

2

8

7

4

3

1

3

2

1

2

1

5

5

2

1

2

1

3

6

1

3

2

1

3

4

1

1

制約の設定 (7) 続・続き

  • よって、書き下すとx[i,j] ≦C[i,j,1] + C[i,j,2] +C[i,j,3] + ... + C[i,j,nclt_row[i]]

  • nclt_row[i] =第 i 横行のクラスタ数


4150420

ここが0になる場合は項自体無視

3

2

2

1

3

1

2

2

3

2

8

7

4

3

1

3

2

1

2

1

5

5

2

1

2

1

3

6

1

3

2

1

3

4

1

1

この左辺をC[i,j,k]と書こう

制約の設定 (7) 注意

  • 書き下す前に...第 i 横行の第 k クラスタが左から j 番目のマス目を覆うとは?y[i,j-R[i,k]+1,k] +y[i,j-R[i,k]+2,k] +... +y[i,j,k] = 1


4150420

3

2

2

1

3

1

2

2

3

2

8

7

4

3

1

3

2

1

2

1

5

5

2

1

2

1

3

6

1

3

2

1

3

4

1

1

制約の設定 (8) 同様

  • 上から i 番目、左から j 番目のマス目が黒いならば、第 j 縦列のあるクラスタがそのマス目を覆っていないといけない


4150420

3

2

2

1

3

1

2

2

3

2

8

7

4

3

1

3

2

1

2

1

5

5

2

1

2

1

3

6

1

3

2

1

3

4

1

1

この左辺をD[i,j,k]と書こう

制約の設定 (8) 続き

  • 書き下す前に...第 j 縦列の第 k クラスタが上から i 番目のマス目を覆うとは?z[i-C[j,k]+1,j,k] +z[i-C[j,k]+2,j,k] +... +z[i,j,k] = 1


4150420

3

2

2

1

3

1

2

2

3

2

8

7

4

3

1

3

2

1

2

1

5

5

2

1

2

1

3

6

1

3

2

1

3

4

1

1

制約の設定 (8) 続・続き

  • よって、書き下すとx[i,j] ≦D[i,j,1] + D[i,j,2] +D[i,j,3] + ... + D[i,j,nclt_col[j]]

  • nclt_col[j] =第 j 縦列のクラスタ数


4150420

ののぐらむを解く問題

  • ののぐらむを解く問題が制約1~8をすべて満たす解があるかどうか調べる整数計画問題になった

  • あとは解けばいい

←本来は証明する必要がある!


  • Login