岡本 吉央 (豊橋技術科学大学情報工学系) ミニ研究集会「組合せゲーム・パズル」 平成19年 3月16日 (金)

Slides:



Advertisements
Similar presentations
第 2 章 数値の入力と変数 scanf と変数をやります 第 2 章 数値の入力と変数 1. 以下のプログラムを実行してみよう  C 言語では文の最後に「 ; 」(セミコロン)が付きます 第 2 章 数値の入力と変数 2 #include int main() { int x; x = 3; printf("x.
Advertisements

SQL による数独の解法 青山学院大学理工学部 矢吹太朗・佐久田博司. 数独とは何か ナンプレとも呼ばれ る制約充足問題 各行・列・ブロック に 1 から 9 の数字を一 つずつ当てはめる 新聞等に載っている ものはとても簡単 人間には難しいもの → もある.
1 線形代数学. 2 履修にあたって 電子情報システム学科 必修 2005 年度1セメスタ開講 担当 草苅良至 (電子情報システム学科) 教官室: G I 511 内線: 2095 質問等は上記のいずれかに行なうこと。 注意計算用のノートを準備すること。
1 情報基礎 A 第 9 週 プログラミング入門 VBA の基本文法 1 準備・変数・データの入出力 徳山 豪・全 眞嬉 東北大学情報科学研究科 システム情報科学専攻 情報システム評価学分野.
模擬国内予選2013 Problem F テトラ姫のパズル 原案:須藤 解答:大友、須藤 解説:須藤.
情報基礎演習I(プログラミング) 第9回 6月22日 水曜5限 江草由佳
ネットワーク理論講義補助資料 Text. 組合せ最適化とアルゴリズム 4.5 節 主・双対法 pp
情報処理の基礎 私たちとコンピュータの扱うデータの違い 明治学院大学 法学部消費情報環境法学科 鶴貝 達政
データ構造と アルゴリズム 第十二回 知能情報学部 知能情報学科 新田直也.
プログラミング入門 電卓番外編 ~エクセルで関数表示~.
コンパイラ 2011年10月17日
プログラミング言語としてのR 情報知能学科 白井 英俊.
近似アルゴリズム 第10章 終了時刻最小化スケジューリング
知識情報演習Ⅲ(後半第1回) 辻 慶太(水)
データ構造とアルゴリズム論 第6章 探索のアルゴリズム
第2章 数値の入力と変数 scanfと変数をやります.
電気回路第1スライド4-1 電気回路第1 第4回 ー網目電流法と演習ー 目次 2網目電流の設定 (今回はこれだけです。)
データ構造と アルゴリズム 理工学部 情報システム工学科 新田直也.
整数計画法を用いた スリザーリンクの解法 杉村 由花 (東京大学)
一般化マクマホン立方体パズルの 問題例生成
経済情報処理ガイダンス 神奈川大学 経済学部.
IT入門B2 (木曜日1限) 第一回 講義概要 2004年月9日30日.
情報科学1(G1) 2016年度.
理由:文字数より要素数の多い配列を用いた時に,文字列の最後を示すため
理由:文字数より要素数の多い配列を用いた時に,文字列の最後を示すため
第6章 2重ループ&配列 2重ループと配列をやります.
数独パズルの難易度判定 ~解法ロジックを用いた数値化の提案~
マイクロシミュレーションにおける 可変属性セル問題と解法
データ構造と アルゴリズム 知能情報学部 新田直也.
1章前半.
経済情報処理ガイダンス 神奈川大学 経済学部.
データ構造とアルゴリズム論 第2章 配列(構造)を使った処理
コンパイラ 2012年10月15日
経済情報処理ガイダンス 神奈川大学 経済学部.
経済情報処理ガイダンス 神奈川大学 経済学部.
シミュレーション演習 G. 総合演習 (Mathematica演習) システム創成情報工学科
情報工学総合演習 D-I 近似アルゴリズム 埼玉大学 理工学研究科 山田 敏規、 橋口 博樹、 堀山 貴史
サポートベクターマシン によるパターン認識
卒業研究中間発表 社会情報システム学講座 高橋義昭.
プログラミング 4 記憶の割り付け.
社会シミュレーションのための モデル作成環境
数独の解生成と 解に対する番号付け 理学部 情報科学科 渡辺研究室 戸神星也.
情報処理Ⅱ 第2回:2003年10月14日(火).
コンパイラ 2011年10月20日
情報基礎演習I(プログラミング) 第11回 7月12日 水曜5限 江草由佳
C言語 はじめに 2016年 吉田研究室.
ナップサック問題 クマさん人形をめぐる熱いドラマの結末.
統計ソフトウエアRの基礎.
高度情報演習1A スクリーンセーバ作成 2016年4月13日 情報工学科 篠埜 功.
データ構造とアルゴリズム (第5回) 静岡大学工学部 安藤和敏
文法と言語 ー文脈自由文法とLR構文解析ー
構造的類似性を持つ半構造化文書における頻度分析
プログラミング入門 電卓を作ろう・パートI!!.
東京工科大学 コンピュータサイエンス学部 亀田弘之
精密工学科プログラミング基礎 第7回資料 (11/27実施)
原口和也 高橋隆一 丸岡章 石巻専修大学 理工学部 情報電子工学科
情報実習I (第1回) 木曜4・5限 担当:北川 晃.
コンパイラ 2012年10月11日
精密工学科プログラミング基礎Ⅱ 第2回資料 今回の授業で習得してほしいこと: 配列の使い方 (今回は1次元,次回は2次元をやります.)
情報数理Ⅱ 第10章 オートマトン 平成28年12月21日.
プロジェクト演習Ⅱ インタラクティブゲーム制作
第2章 数値の入力と変数 scanfと変数をやります.
情報スキル活用 第1週    ガイダンス.
岩村雅一 知能情報工学演習I 第7回(後半第1回) 岩村雅一
混合ガウスモデル Gaussian Mixture Model GMM
○○自慢プロジェクト 今から、法学部1回生の秋田が、私の自慢について発表します。 法学部法学科   秋田和花奈.
Itパスポート自慢 今から、法学部1回生の秋田が、高校二年生でITパスポートを取得したことについて自慢します。​  A3班 
1 ひとりにしてくれ数 東北大学 大学院情報科学研究科 ◎鈴木 顕 内澤 啓 国立情報学研究所 情報学プリンシプル研究系 宇野 毅明.
ペンシルパズルの大道芸ステージショーへの応用
ペンシルパズル「一本線」のヒント数の扱いに関する解析
Presentation transcript:

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

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

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

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

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

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

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

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

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

スケジュール・時間割 月 火 水 木 金 朝 講義 実習 昼 討論 夕

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

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

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

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

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

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

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

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

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

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

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

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

どんな変数を用意するか 上から i 番目で 左から j 番目の マス目が k という 数字になる ということを01変数に 変数: x[i,j,k] (9x9x9個) 解釈:上の通り 1 2 3 4 5 6 7 8 9 j = i = 1 2 3 4 5 6 7 8 9

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

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

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

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

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

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

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

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

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

実習の様子

実習の様子

実習の様子

実習の様子

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

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

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

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

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

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

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

ののぐらむを解いてみる 2 1 5 3 6 4 8 7 http://yuki-lab.jp/nonogram/RUN.HTM より転載

ののぐらむ:ルール (1) 白マスを以下の規則に従って黒く塗る 各横行の左、各縦列の上にある数字は、その行 (列) の中で連続して黒く塗る白マスの数を表す 2 1 5 3 6 4 8 7

ののぐらむ:ルール (2) 1つの行 (列) に対して数字が複数あるときは、数字の並び順どおりにその数字の数だけ連続して黒く塗る その場合、数字と数字の間に1マス以上の塗らないマスが入る 2 1 5 3 6 4 8 7

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

定式化のための用語 第 i 番目の横行 = 上から i 番目の横行 第 j 番目の縦列 = 左から j 番目の縦列 以下の定式化はBosch (2001) と本質的に同じ 第 i 番目の横行 = 上から i 番目の横行 第 j 番目の縦列 = 左から j 番目の縦列 第 i 番目の横行の 第 k クラスタ = その横行の左から k 番目の黒マス塊 第 j 番目の縦列の 第 k クラスタ = 同様 2 1 5 3 6 4 8 7 第2番目の横行の第2クラスタ

変数の設定 (1) 盤面の大きさは nrow × ncol とする x[i,j] = 1 を 上から i 番目、左から j 番目のマスが黒く塗られることとする ncol 2 1 5 3 6 4 8 7 nrow

変数の設定 (2) y[i,j,k] = 1 を 第 i 番目の横行の第 k クラスタの左端が左から j 番目のマスにあることとする nclt_row[i] = 第 i 番目の横行の クラスタ数 とする 2 1 5 3 6 4 8 7

変数の設定 (3) z[i,j,k] = 1 を 第 j 番目の縦列の第 k クラスタの上端が上から i 番目のマスにあることとする nclt_col[j] = 第 j 番目の縦列の クラスタ数 とする 2 1 5 3 6 4 8 7

制約の設定 (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 クラスタの数字 2 1 5 3 6 4 8 7

制約の設定 (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 クラスタの数字 2 1 5 3 6 4 8 7

制約の設定 (3) 第 i 横行の第 k クラスタの左端はどこかにある y[i,1,k] + y[i,2,k] + y[i,3,k] + ... + y[i,ncol,k] = 1 2 1 5 3 6 4 8 7

制約の設定 (4) 第 j 縦列の第 k クラスタの上端はどこかにある z[1,j,k] + z[2,j,k] + z[3,j,k] + ... + z[nrow,j,k] = 1 2 1 5 3 6 4 8 7

制約の設定 (5) 難しい 第 i 横行の第 k クラスタの左端が上から j マス目にあるならば、 第 k+1 クラスタの左端は 左から j+R[i,k]+1 マス目か、それよりも右にないといけない R[i,k] = 第 i 横行の第 k クラスタの数字 2 1 5 3 6 4 8 7

制約の設定 (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] 2 1 5 3 6 4 8 7

制約の設定 (6) 先と同様 第 j 縦列の第 k クラスタの上端が左から i マス目にあるならば、 第 k+1 クラスタの上端は上から i+C[j,k]+1 マス目か、それよりも下にないといけない C[j,k] = 第 j 縦列の第 k クラスタの数字 2 1 5 3 6 4 8 7

制約の設定 (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] 2 1 5 3 6 4 8 7

制約の設定 (7) また難しい 上から i 番目、左から j 番目のマス目が黒いならば、第 i 横行のあるクラスタがそのマス目を覆っていないといけない 2 1 5 3 6 4 8 7

制約の設定 (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 2 1 5 3 6 4 8 7 この左辺をC[i,j,k]と書こう

制約の設定 (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 横行のクラスタ数 2 1 5 3 6 4 8 7

制約の設定 (7) 注意 ここが0になる場合は項自体無視 書き下す前に... 第 i 横行の第 k クラスタが左から j 番目のマス目を覆うとは? y[i,j-R[i,k]+1,k] + y[i,j-R[i,k]+2,k] + ... + y[i,j,k] = 1 2 1 5 3 6 4 8 7 この左辺をC[i,j,k]と書こう

制約の設定 (8) 同様 上から i 番目、左から j 番目のマス目が黒いならば、第 j 縦列のあるクラスタがそのマス目を覆っていないといけない 2 1 5 3 6 4 8 7

制約の設定 (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 2 1 5 3 6 4 8 7 この左辺をD[i,j,k]と書こう

制約の設定 (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 縦列のクラスタ数 2 1 5 3 6 4 8 7

ののぐらむを解く問題 ののぐらむを解く問題が 制約1~8をすべて満たす解があるか どうか調べる整数計画問題になった あとは解けばいい ←本来は証明する必要がある!