Contenu connexe Similaire à 虫食算を作るアルゴリズム 公表Ver (20) Plus de Kensuke Otsuki (10) 虫食算を作るアルゴリズム 公表Ver18. DFS (Depth First Search): 深さ優先探索
• □に数字を仮定して, 行けるところまで突き進む
• ダメになったら一歩戻る
18 / 70
19. DFS (Depth First Search): 深さ優先探索
• □に数字を仮定して, 行けるところまで突き進む
• ダメになったら一歩戻る
19 / 70
20. DFS (Depth First Search): 深さ優先探索
• □に数字を仮定して, 行けるところまで突き進む
• ダメになったら一歩戻る
20 / 70
21. DFS (Depth First Search): 深さ優先探索
• □に数字を仮定して, 行けるところまで突き進む
• ダメになったら一歩戻る
21 / 70
22. DFS (Depth First Search): 深さ優先探索
• □に数字を仮定して, 行けるところまで突き進む
• ダメになったら一歩戻る
… … 22 / 70
23. DFS (Depth First Search): 深さ優先探索
• □に数字を仮定して, 行けるところまで突き進む
• ダメになったら一歩戻る
… … 23 / 70
24. DFS (Depth First Search): 深さ優先探索
• □に数字を仮定して, 行けるところまで突き進む
• ダメになったら一歩戻る
… … 24 / 70
25. DFS (Depth First Search): 深さ優先探索
• □に数字を仮定して, 行けるところまで突き進む
• ダメになったら一歩戻る
… … 25 / 70
26. DFS (Depth First Search): 深さ優先探索
• □に数字を仮定して, 行けるところまで突き進む
• ダメになったら一歩戻る
… … 26 / 70
27. DFS (Depth First Search): 深さ優先探索
• □に数字を仮定して, 行けるところまで突き進む
• ダメになったら一歩戻る
… … 27 / 70
28. DFS (Depth First Search): 深さ優先探索
• □に数字を仮定して, 行けるところまで突き進む
• ダメになったら一歩戻る
… …
…
28 / 70
29. DFS (Depth First Search): 深さ優先探索
• □に数字を仮定して, 行けるところまで突き進む
• ダメになったら一歩戻る
… …
…
29 / 70
30. DFS (Depth First Search): 深さ優先探索
• □に数字を仮定して, 行けるところまで突き進む
• ダメになったら一歩戻る
… …
…
…
30 / 70
31. DFS (Depth First Search): 深さ優先探索
• □に数字を仮定して, 行けるところまで突き進む
• ダメになったら一歩戻る
DFS は応用範囲広い
数独も解ける
フリーセルも解ける
ゲーム木探索も DFS の一種
メモしながら探索すれば DP も実現
実用性も: makefile (DAGのトポロジカルソート)
ネットワークフローアルゴリズムのサブルーチン 31 / 70
33. DFS の工夫の余地
• □に数字を仮定して, 行けるところまで突き進む
• ダメになったら一歩戻る
• これでもうまくやらないとこれは解けない
どの□から順番に数字を仮定していくか
については、任意性がある!
33 / 70
44. 工夫した探索順序による DFS
• For i = 1 to (Aの桁数):
– A の i 桁目を 0~9 の順に仮定
– For j = 1 to (Bの桁数):
• If C の j 段目の i 桁目に条件あり: B の j 桁目を 1~9 の順に仮定
• B のまだ仮定していない桁を 1~9 の順に仮定
□□□□□1
× □□□2□□
□3□□□□
□□□□□4□
□□□5□□
□□□6□□□
□□□□□7
□□□□□8□
□□□9□□□□□□□□
・・・ A
・・・ B
・・・ C
44 / 70
46. DFS による解法まとめ
• DFS (Depth First Search): 深さ優先探索
• DFS の探索順序を工夫する
• 探索順序を工夫した DFS により, 人間の思考
に近い虫食算ソルバーを実現!
46 / 70
48. 線形計画法 (LP) ->
• 一次式制約下で一次式最適化
Maximize:
4𝑥 + 5𝑦
Subject to:
3𝑥 + 2𝑦 ≤ 6
2𝑥 + 4𝑦 ≤ 8
𝑥, 𝑦 ≥ 0
𝑥
𝑦
O 42
2
3 (4, 5)
48 / 70
49. 線形計画法 (LP) -> 整数計画法 (IP)
• 一次式制約下で一次式最適化
• 変数は整数値
Maximize:
4𝑥 + 5𝑦
Subject to:
3𝑥 + 2𝑦 ≤ 6
2𝑥 + 4𝑦 ≤ 8
𝑥, 𝑦 ≥ 0
𝑥, 𝑦 ∈ 𝒁 𝑥
𝑦
O 42
2
3 (4, 5)
49 / 70
50. IP を解く専用ソルバー
• 線形計画法 (LP) はカンタン
• 整数計画法 (IP) は超絶難しい (NP-hard)
• IP を解くソルバー達
– Numerical Optimizer (NTTデータ数理システム)
– CPLEX (IBM ILOG)
– XPRESS (FICO)
– Gurobi (Gurobi)
50 / 70
53. Step 1: □と繰り上りを変数に
• 以下の整数計画問題に…?
3𝑐 = 10𝑝 + 7
𝑎𝑐 + 𝑝 = 10𝑞 + 𝑑
𝑏𝑐 + 𝑞 = 𝑒
0 ≤ 𝑎, 𝑑, 𝑝, 𝑞 ≤ 9
1 ≤ 𝑏, 𝑐, 𝑒 ≤ 9 𝑐
𝑒 𝑑
𝑝𝑞
𝑎𝑏
53 / 70
54. Step 1: □と繰り上りを変数に
• 以下の整数計画問題に…?
3𝑐 = 10𝑝 + 7
𝑎𝑐 + 𝑝 = 10𝑞 + 𝑑
𝑏𝑐 + 𝑞 = 𝑒
0 ≤ 𝑎, 𝑑, 𝑝, 𝑞 ≤ 9
1 ≤ 𝑏, 𝑐, 𝑒 ≤ 9
• ところが…!
• 二次項あり, IP じゃない!
𝑐
𝑒 𝑑
𝑝𝑞
𝑎𝑏
54 / 70
55. Step 1: □と繰り上りを変数に
• 以下の整数計画問題に…?
3𝑐 = 10𝑝 + 7
𝑎𝑐 + 𝑝 = 10𝑞 + 𝑑
𝑏𝑐 + 𝑞 = 𝑒
0 ≤ 𝑎, 𝑑, 𝑝, 𝑞 ≤ 9
1 ≤ 𝑏, 𝑐, 𝑒 ≤ 9
• ところが…!
• 二次項あり, IP じゃない!
• 0-1変数なら二次式制約を一次にできる (後述)
𝑐
𝑒 𝑑
𝑝𝑞
𝑎𝑏
55 / 70
56. Step 2: 各変数を二進法展開
• 以下の整数計画問題に…?
3𝑐 = 10𝑝 + 7
𝑎𝑐 + 𝑝 = 10𝑞 + 𝑑
𝑏𝑐 + 𝑞 = 𝑒
0 ≤ 𝑎, 𝑑, 𝑝, 𝑞 ≤ 9
1 ≤ 𝑏, 𝑐, 𝑒 ≤ 9
• 0-1変数 𝑎1, 𝑎2, 𝑎3, 𝑎4 を導入
𝑎 = 8𝑎1 + 4𝑎2 + 2𝑎3 + 𝑎4
𝑎1, 𝑎2, 𝑎3, 𝑎4 ∈ {0, 1}
𝑐
𝑒 𝑑
𝑝𝑞
𝑎𝑏
56 / 70
57. Step 2: 各変数を二進法展開
• この式は
𝑏𝑐 + 𝑞 = 𝑒
• こんな風になる
(8𝑏1 + 4𝑏2 + 2𝑏3 + 𝑏4)(8𝑐1 + 4𝑐2 + 2𝑐3 + 𝑐4) + 𝑞 = 𝑒
⇔
64𝑏1 𝑐1 + 32 𝑏1 𝑐2 + 𝑏2 𝑐1 + 16 𝑏1 𝑐3 + 𝑏2 𝑐2 + 𝑏3 𝑐1
+8 𝑏1 𝑐4 + 𝑏2 𝑐3 + 𝑏3 𝑐2 + 𝑏4 𝑐1 + 4 𝑏2 𝑐4 + 𝑏3 𝑐3 + 𝑏2 𝑐4
+2 𝑏3 𝑐4 + 𝑏4 𝑐3 + 𝑏4 𝑐4 + 𝑞 = 𝑒
57 / 70
59. Step 3: 0-1変数活用して一次式に
• 簡単のため, 以下の式を考える
𝑏1 𝑐1 + 𝑏2 𝑐2 + 𝑞 = 𝑒
• 𝑏1 𝑐1, 𝑏2 𝑐2 に対応する 0-1変数 𝑡1, 𝑡2 を導入
𝑏1 𝑐1 + 𝑏2 𝑐2 + 𝑞 = 𝑒
⇔
𝑡1 + 𝑡2 + 𝑞 = 𝑒
𝑡1 ≤ 𝑏1, 𝑡1 ≤ 𝑐1, 𝑡1 ≥ 𝑏1 + 𝑐1 − 1
𝑡2 ≤ 𝑏2, 𝑡2 ≤ 𝑐2, 𝑡2 ≥ 𝑏2 + 𝑐2 − 1
𝑏1 𝑐1 = 𝑡1 と等価
59 / 70
60. Step 3: 0-1変数活用して一次式に
• 簡単のため, 以下の式を考える
𝑏1 𝑐1 + 𝑏2 𝑐2 + 𝑞 = 𝑒
• 𝑏1 𝑐1, 𝑏2 𝑐2 に対応する 0-1変数 𝑡1, 𝑡2 を導入
𝑏1 𝑐1 + 𝑏2 𝑐2 + 𝑞 = 𝑒
⇔
𝑡1 + 𝑡2 + 𝑞 = 𝑒
𝑡1 ≤ 𝑏1, 𝑡1 ≤ 𝑐1, 𝑡1 ≥ 𝑏1 + 𝑐1 − 1
𝑡2 ≤ 𝑏2, 𝑡2 ≤ 𝑐2, 𝑡2 ≥ 𝑏2 + 𝑐2 − 1
𝑏1 𝑐1 = 𝑡1 と等価
一次式になった! 60 / 70
61. 整数計画法 (IP) による解法まとめ
• やや大変だが, IP (一次式) にできる
3𝑐 = 10𝑝 + 7
𝑎𝑐 + 𝑝 = 10𝑞 + 𝑑
𝑏𝑐 + 𝑞 = 𝑒
0 ≤ 𝑎, 𝑑, 𝑝, 𝑞 ≤ 9
1 ≤ 𝑏, 𝑐, 𝑒 ≤ 9
• IP にしたら, IP ソルバーに投げる
• 6桁×6桁程度の虫食算ならこれで解けた
𝑐
𝑒 𝑑
𝑝𝑞
𝑎𝑏
61 / 70
64. 作り方
• 青の部分は 0 でも OK として解く
• これで解なしならムリ
(掛ける数の桁数増やす)
• 何通りかの解を
青部分の様相で分類し
孤立したものを選ぶ
64 / 70