プログラム基礎同演習
1動的計画法プログラミング基礎同演習慶應義塾大学理工学部物理情報工学科渡辺2019/12/17
View Slide
2組み合わせ最適化問題の解法・貪欲法・全探索・メモ化再帰による動的計画法
3レストランにいって、料理や飲み物の注文をしたいできることなら美味しいものを食べたいvs.でもカロリーや値段は低く抑えたい許容予算内、カロリー内で、「幸せ度」を最大化する最適化問題になっている
4一定の制約条件下でコストを最小化する or 価値を最大化するように、何かの組み合わせや順番を決める問題
5・スーパーで買い物をする・図書館に本を返却する・郵便局で手紙を出すあなたは以下の三つのタスクをこなす必要がある自宅図書館 郵便局スーパースーパー、図書館、郵便局は自宅から等距離にあるどのような順序でこなすべきか?
6もし「スーパー」「郵便局」「図書館」の順番だと・・・?持ち物買い物をする 手紙を出す 本を返す重い本を持ったまま3ステップ買い物袋を抱えたまま3ステップ
7持ち物買い物をする本を返す 手紙を出すもし「スーパー」「郵便局」「図書館」の順番だと・・・?重い本を持つのは1ステップ買い物袋持つのも1ステップ
8鉄板の型抜き(長方形詰込問題)配送順序塗装計画白→黒:そのまま塗装できる黒→白:洗浄が必要バイトのシフト作成
9組み合わせ最適化問題の解法・貪欲法・全探索・メモ化再帰による動的計画法これをナップサック問題を題材に考えてみる
10重さ 価値343333624持てる重さは最大「10」まで5 50持ち運べる範囲で価値を最大化したい制約条件
11貪欲法は組み合わせ最適化問題の近似解を与える手法・選べる選択肢に、なんらかの方法で順番付けをする・制約条件を満たす限り、上から順に選ぶ計算量は※ 多くの場合、貪欲法はわりと良い解を与える↑ソートが一番重い
12重さ 価値4336245 50重さあたりの価値10983 33 11 上から順番に選ぶここで重さ10を超えるためストップ貪欲法による解 最適解重さ8 価値 83 重さ10 価値 93
13を入れる を入れないを入れる を入れない を入れる を入れない
14各品物について「入れる」か「入れない」かを選ぶ品物の数をNとして 通り計算量は※ N=20なら余裕、がんばればN=30くらいまで?
15貪欲法:簡単だが近似解しか得られない全探索:厳密だが計算量が膨大動的計画法:厳密で、かつ効率的
16Dynamic Programming, DP動的計画法が適用できる条件・大きな問題を小さな問題に分解できる(分割統治)・小さな問題の結果が再利用可能である(メモ化)
17目的地になるべく安く、早く着きたい→ 最短経路問題現在地から目的地まで複数の経路がある
18ABCDEFGHI278123151012132各辺に重み(コスト)が設定されているグラフがあるA Iから まで行きたいその際、辺のコストの合計を最小にしたい
19最短経路コストの合計:13ABCDEFGHI278123151012132この解をどうやって(効率的に)求めるか?
20A E I310もし最短経路が「A – E – I 」という経路であればAからIに含まれる 「AからE」への経路「EからI」への経路もそれぞれ最短
21A E I3102もしA-Eに、より低コストな経路があったら?A-Eの経路としてそちらを選んだ方がトータルコストが下がるA-E-Iが最短経路であることに矛盾最短経路に含まれる任意の二点間経路は最短
22ABCDEFGHI12いま、「部分問題」が解けているとするAからGへの最短経路AからHへの最短経路 がそれぞれわかっている
23「AからG」「AからH」までの最短経路のコストがわかっているなら、この問題を解けばよいAGI121311H「A-H-I」が最短経路であることがわかるABCDEFGHI278123151012132全体像はいったん忘れる
24ABCEFH27123123AからHに行く最短経路は?AからEに行く最短経路(3)AからFに行く最短経路(8)AEH12338Fがわかっているなら全体像はいったん忘れる「A-F-H」が最短経路であることがわかるこの問題↓を解けばよい
25解きたい問題の「部分問題」が全て解けているなら全体の最適解が得られる小さい部分問題から順番に解いていくABCDEFGHI278123151012132AからBへの最短経路AからCへの最短経路・・・
26AGI121311H最短経路のコストは13とわかっているとする最終目的地 「I」に至る経路は「G」か「H」か?A-H のコストと H-Iのコストの和 = 13A-G のコストと G-Iのコストの和 = 14「A-G」「A-H」までの最短コストから計算してみればよいH経由だった
27世の中は最適化問題に溢れている組み合わせ最適化問題を厳密に解くのは困難近似解を高速に得る方法がある(貪欲法等)動的計画法は・大きな問題が小さな問題に分解できる・小さな問題の結果が再利用できることを利用して、効果的に厳密解を得る
28N円持ってサイゼリヤに行ったら最大でどれだけカロリーを摂取できるか?・同じメニューを二度選んではいけない・ドリンクバーやガムシロップ等も禁止条件※ メニュー「幸せ度」はカロリーに比例すると近似する
29彩りガーデンサラダ小エビのサラダやわらかチキンのサラダイタリアンサラダ・・・299 円349 円299 円299 円130 kcal115 kcal134 kcal92 kcal0.435 kcal/円0.330 kcal/円0.448 kcal/円0.307 kcal/円ラージライスアーリオ・オーリオ (W)・・・219 円574 円454 kcal1120 kcal2.07 kcal/円1.95 kcal/円「価格あたりのカロリーが高い順」に並べる一番上から、予算が許す限り選ぶ品目 価格 カロリー 価格あたりのカロリー
30全探索は「トーナメント式」「予算オーバー」なら不戦敗予算内なら総カロリーが高い方が勝ちあるメニューを選ぶ場合 選ばない場合
31n 番目までのメニューの範囲で、budget 円以下で最大のカロリーを返す関数全探索の関数はこんな形をしていたsearch(n, budget)同じ(n, budget)を与えられたら、同じ値を返すはず一回計算したら、次から再利用できる(メモ化)
32n 番目までのメニューの範囲で、budget 円以下で得られる最大のカロリー計算が終わって得られる辞書の情報が入っているdic[(n, budget)]には、
33もしbudget 円以下で得られる最大カロリーメニューにn番目のメニューが入っていなければdic[(n-1, budget)]dic[(n, budget)]これらが等しくなるはずこの事実を利用して、再帰的に「最大カロリーメニューにこのメニューが含まれるか」を調べていく