1 / 67

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

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

percy
Télécharger la présentation

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

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. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 整数計画法によるパズル解法(実習報告) 岡本 吉央 (豊橋技術科学大学情報工学系) ミニ研究集会「組合せゲーム・パズル」 平成19年 3月16日 (金)

  2. 豊橋技術科学大学について • 設立:1976年 • 目的:高専生受入↓↓ • 技術科学大学:「長岡」と「豊橋」 • 詳細:「三十年史」を参照 http://www.tut.ac.jp/30th/book.html

  3. 豊橋技術科学大学:入学生 高等学校 高専・短大 外国人留学生 高専専攻科  社会人   他大学 

  4. 豊橋技術科学大学:出身地域 中部 外国 北海道・東北 その他 近畿 中国 関東 九州・沖縄 愛知 四国

  5. 高専生体験実習 • 開催時期:7月後半~8月前半 • 対象:高専4年生 • 目的:「本学における教育研究分野の実習を体験することにより、学校教育の充実及び学生の学習意欲の喚起等」 • 受入期間:1週間 • 注:大抵「インターン」の単位付与 全国の高専分布

  6. 私の実習テーマ • 「整数計画法によるパズル解法」 • 目的: • 整数計画モデルの初歩の習得 • パズルの数理的側面に対する意識 • 道具としてのプログラミングの利用 • 受入条件: • C/C++言語によるプログラミング経験がある • 数理的・論理的思考が好きである • 藤戸敏弘先生との共同 • 大学院生4人の(とても親切な)手伝い

  7. この発表では... • 実習の流れの説明 • 実際の解法の説明 (数独を例として) • その他注意事項

  8. 募集状況・受入状況 • 募集人数:3人 • 応募人数:7人 • 受入人数:7人(電気、電子、制御、情報などの学科より) • 補足 • 大学全体で58テーマ、約120名受入 • 120÷58=およそ2

  9. スケジュール • 時間割 • 朝 9:00~12:00 • 昼 13:30~16:00 • 夕 16:30~18:00 • 流れ • 月・火 導入 • 水・木 個別実習 (班実習) • 金    発表会 および 討論

  10. スケジュール・時間割

  11. 実習で行なうことの流れ • パズルが持つ論理的な構造を抽出 • それを整数計画問題として定式化 • 整数計画問題ソルバによる求解 • 使用したソルバ: • GLPK (GNU Linear Programming Kit) • Andrew Makhorin (ロシア) による • http://www.gnu.org/software/glpk/ • 自作テキスト(未完成)とGLPKレファレンス・マニュアル邦訳(未完成)を配布

  12. ソルバに解かせる部分の詳細 パズルをそのまま記述したファイル    ↓ 整数計画問題出力プログラム    ↓ 整数計画問題として記述したファイル    ↓ 整数計画問題求解プログラム    ↓ パズルの解答ファイル

  13. GLPK利用 ソルバに解かせる部分の詳細 パズルをそのまま記述したファイル    ↓整数計画問題出力プログラム    ↓ 整数計画問題として記述したファイル    ↓整数計画問題求解プログラム    ↓ パズルの解答ファイル 実習生が作成する部分

  14. 実習で扱うパズル • 月曜日: 魔方陣と数独 • 火曜日: ののぐらむ (お絵かきロジック) • 水曜日、木曜日: 実習生が選択 • 美術館 • カックロ • ナンバーリンク • 覆面算 • ウォールロジック

  15. 実習で扱うパズル • 月曜日: 魔方陣と数独 • 火曜日: ののぐらむ (お絵かきロジック) • 水曜日、木曜日: 実習生が選択 • 美術館 • カックロ • ナンバーリンク • 覆面算 • ウォールロジック 定式化とプログラムは与える 実習生はプログラムを読んだり、変更することで感覚を掴む

  16. 実習で扱うパズル • 月曜日: 魔方陣と数独 • 火曜日: ののぐらむ (お絵かきロジック) • 水曜日、木曜日: 実習生が選択 • 美術館 • カックロ • ナンバーリンク • 覆面算 • ウォールロジック 定式化とプログラムは与える 実習生はプログラムを読んだり、変更することで感覚を掴む 実習生は定式化とプログラムを自分で一から考えて作る

  17. 3 8 2 7 9 4 1 2 9 4 3 8 9 4 5 6 7 3 9 7 1 2 6 8 6 3 1 5 6 9 2 5 3 4 4 8 9 6 7 3 9 4 1 5 2 5 7 6 3 8 1 9 実習の流れを数独で説明 • 空きマスに1から9までの数字をいれる • 同じ横行と縦列、そして3x3のブロックには同じ数字を1つしか入れてはいけない 解答→ パズル通信ニコリ144号,114.26ページ,例問より転載

  18. GLPK利用 ソルバに解かせる部分の詳細 パズルをそのまま記述したファイル    ↓ 整数計画問題出力プログラム    ↓ 整数計画問題として記述したファイル    ↓ 整数計画問題求解プログラム    ↓ パズルの解答ファイル

  19. GLPK利用 ソルバに解かせる部分の詳細 パズルをそのまま記述したファイル    ↓ 整数計画問題出力プログラム    ↓ 整数計画問題として記述したファイル    ↓ 整数計画問題求解プログラム    ↓ パズルの解答ファイル

  20. ..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.. 数独入力ファイル

  21. GLPK利用 ソルバに解かせる部分の詳細 パズルをそのまま記述したファイル    ↓ 整数計画問題出力プログラム    ↓ 整数計画問題として記述したファイル    ↓ 整数計画問題求解プログラム    ↓ パズルの解答ファイル

  22. GLPK利用 ソルバに解かせる部分の詳細 パズルをそのまま記述したファイル    ↓ 整数計画問題出力プログラム    ↓ 整数計画問題として記述したファイル    ↓ 整数計画問題求解プログラム    ↓ パズルの解答ファイル

  23. 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個) • 解釈:上の通り

  24. どんな制約を用意するか? 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

  25. どんな制約を用意するか? 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

  26. どんな制約を用意するか? 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

  27. どんな制約を用意するか? 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

  28. どんな制約を用意するか? 5 • 既に数字が入っているマス目にはそれに対応する変数を1にする • 例えばx[3,4,1] = 1x[5,2,4] = 1など

  29. 数独を解く問題 • 数独を解く問題が制約1、2、3、4、5をすべて満たす場合があるかどうか調べる整数計画問題になった 注: 整数計画問題といっても、  「最適化問題」ではなく、  「許容性判定問題」になっている (「最適化問題」と「許容性判定問題」は多項式時間等価)

  30. GLPK利用 ソルバに解かせる部分の詳細 パズルをそのまま記述したファイル    ↓ 整数計画問題出力プログラム    ↓ 整数計画問題として記述したファイル    ↓ 整数計画問題求解プログラム    ↓ パズルの解答ファイル

  31. GLPK利用 ソルバに解かせる部分の詳細 パズルをそのまま記述したファイル    ↓ 整数計画問題出力プログラム    ↓ 整数計画問題として記述したファイル    ↓ 整数計画問題求解プログラム    ↓ パズルの解答ファイル

  32. 536827941 172964358 894153267 715349826 643782195 928516734 481295673 369471582 257638419 5 3 8 2 7 9 4 1 2 9 4 3 8 9 4 5 6 7 3 9 7 1 2 6 8 6 3 1 5 6 9 2 5 3 4 4 8 9 6 7 3 9 4 1 5 2 5 7 6 3 8 1 9 数独解答ファイル

  33. 実習の様子

  34. 実習の様子

  35. 実習の様子

  36. 実習の様子

  37. 実習で扱ったパズル 割と簡単 • 数独 • 美術館 • 魔方陣 • 覆面算 • カックロ • お絵かきロジック • ウォールロジック • ナンバーリンク (集合被覆問題っぽい) 数が数字として意味を持つ 割と難しい (論理的含意「ならば」 を定式化に用いる)

  38. 「分断ルール」系 へやわけ ぬりがべ 黒マスはどこだ ひとりにしてくれ ケイスケ やじさんかずさん 「日本語の壁」系 スケルトン シークワーズ カナオレ 「言語知識必要」系 クロスワード ナンクロ 推理パズル 推理クロス 「ループ」を作る系 スリザーリンク ましゅ ヤジリン カントリーロード ケイスケ それ以外のパズル(超難しい?) 一部のパズルはWebニコリ「ニコリのパズル」より抜粋 http://www.nikoli.co.jp/

  39. それ以外のパズル(実習でOK?) • サムライン • ナンスケ (ナンバースケルトン) • 波及効果 • タイルペイント • バトルシップ • ビルディングパズル

  40. 発展的な実習課題 • パズルの答えを1つ求めたとき、それ以外に答えがないことを確認したい。整数計画法でどのように行なえばよいか? • 「簡単に決まってしまうマス」を特定する方法を考えて、それによって決まったマスを予め定式化に組み込むことで、どれくらいの規模の問題が解けるようになるだろうか?

  41. 実習準備における心がけ • 実習生のプログラミング経験:配列、文字列が使える程度でOK • 整数計画法の導入:01整数計画のみ 「命題論理の算術化」として導入 (CSP?)アルゴリズムは説明しない • オリジナルテキストの作成: 重視 • フリーソフトウェアの利用: 重視

  42. 最後に • 評価: おおむね好評 (ヒアリングによる) • 継続性: 来年度も実施予定 • 効果: 整数計画問題の導入として好例 • 注意: 次を伝えることにも重点を • 「整数計画法でパズルを解く」ことがパズルに対するアプローチとして非標準的であること • 「道具としてプログラミングを用いる」こと おしまい

  43. ありがとうございました ここから予備スライド

  44. 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 より転載

  45. 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) • 白マスを以下の規則に従って黒く塗る • 各横行の左、各縦列の上にある数字は、その行 (列) の中で連続して黒く塗る白マスの数を表す

  46. 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マス以上の塗らないマスが入る

  47. お絵かきロジック イラストロジック ピクロス Paint by Numbers Crucipixel Edel FigurePic Grafilogika Japanese Crosswords Logic Art Logic Square Logicolor Logik-Puzzles Paint Logic Pixel Puzzles ... ののぐらむ:別の名前

  48. 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 クラスタ = 同様

  49. 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

  50. 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 番目の横行のクラスタ数 とする

More Related