210122 msi dp

Kensuke Otsuki
Kensuke OtsukiResearcher at NTT DATA MSI
動的計画法に学ぶ
数理科学の精神
NTT データ数理システム
大槻 兼資
2021/1/22
@数理システム講演会
1
• 2014年:東京大学大学院情報理工学系研究科
数理情報学専攻修士課程修了
自己紹介 (本業編)
• 2015年~:NTT データ数理システム
• 専門は数理工学全般
• 数理最適化
• シフトスケジューリングなど
• アルゴリズム
• 探索, ネットワークなど
• 機械学習
• チャットボットなど
http://www.dis.uniroma1.it/challenge9/download.shtml 2
3
自己紹介 (趣味編)
(12月2日) (7 の形) (1234567890 で「コ」)
• 虫食算作り
• コミケなどにも出店
• オーム社雑誌「ロボコンマガジン」の懸賞担当
4
アルゴリズム本を出版
• 「IT エンジニア本大賞 2021」にノミネート
https://www.shoeisha.co.jp/campaign/award/2021/result/
5
アルゴリズム本を出版
設計技法
・本の最初に設計技法を特集
・本の全体で設計技法を使用
現実世界の問題 数理科学の世界
モデル化
数理モデル
分析結果
数理最適化
動的計画法
機械学習
解釈・意思決定
数学を現実世界に活かすとは
数理科学の精神
7
• さまざまな問題が、モデリングを通して統一的に扱える
• 共通の論理 (理論) に基づいて、共通の計算 (アルゴリズム)
• インフラ、サービス、金融、物流、製造、公共、ヘルスケア
• 動的計画法を題材として (本講演の目的)
• 動的計画法はアルゴリズムの一種
モデリング + 理論 + アルゴリズム
なぜ動的計画法なのか
8
• 問題解決思考のエッセンスが詰まっている
• ルネ・デカルト「困難は分割せよ」
• 数多くの問題を、分野横断的に解決
• スケジューリング問題
• 発電計画問題
• 音声認識パターンマッチング
• 文章の分かち書き
• 隠れマルコフモデル
問題を一連の部分問題に分割し、
各部分問題の解をメモ化しながら順に求めていく手法
本日の講演内容
• 自己紹介、イントロ
9
• 動的計画法とは
• 動的計画法のさまざまなパターン
本日の講演内容
10
• 動的計画法とは
動的計画法とは
11
問題を一連の部分問題に分割し、
各部分問題の解をメモ化しながら順に求めていく手法
• とても抽象的で汎用的
• 適用範囲が広い
• ただし一見わかりにくい
動的計画法の例題
12
足場を「ジャンプ」しながら左端から右端へ行きたい
AtCoder Educational DP Contest A - Frog
ただし「隣の足場」か「1 個飛ばしの足場」にのみ進める
ジャンプの所要時間は「足場の高さの差」
左端から右端までの最短所要時間を求めよ
4m 7m
3 秒!
3m
13
グラフ
• 物事の関係性を「丸」と「線」を用いて表したもの
• コンピュータサイエンスのあらゆる領域で使われる
14
グラフ
• ありとあらゆるモノをグラフで表せる!
• さまざまな分野の問題をグラフに関する問題として
見通よく統一的に扱える!
グラフの問題と考える
15
例:
0 1 2 3 4 5 6
7
2
5 1 4 5 4
4
3
1 9
足場を「ジャンプ」しながら左端から右端へ行きたい
AtCoder Educational DP Contest A - Frog
ただし「隣の足場」か「1 個飛ばしの足場」にのみ進める
ジャンプの所要時間は「足場の高さの差」
左端から右端までの最短所要時間を求めよ
・足場が 7 個
・(2, 9, 4, 5, 1, 6, 10)
16
0
7
2
5 1 4 5 4
4
3
1 9
1 2 3 4 5 6
• ノード 0 からノード 6 への最短経路を求める!
グラフの問題と考える
17
0
7
2
5 1 4 5 4
4
3
1 9
1 2 3 4 5 6
• ノード 0 からノード 6 への最短経路を求める!
• 答えは、2 + 1 + 1 + 4 = 8
グラフの問題と考える
問題を次のように分解する
18
0
7
2
5 1 4 5 4
4
3
1 9
1 2 3 4 5 6
• ノード 1 へ至る最小コストを求める問題
• ノード 2 へ至る最小コストを求める問題
• ノード 3 へ至る最小コストを求める問題
• ノード 4 へ至る最小コストを求める問題
• ノード 5 へ至る最小コストを求める問題
• ノード 6 へ至る最小コストを求める問題
問題を次のように分解する
19
0
7
2
5 1 4 5 4
4
3
1 9
1 2 3 4 5 6
• ノード 1 へ至る最小コストを求める問題
• ノード 2 へ至る最小コストを求める問題
• ノード 3 へ至る最小コストを求める問題
• ノード 4 へ至る最小コストを求める問題
• ノード 5 へ至る最小コストを求める問題
• ノード 6 へ至る最小コストを求める問題
問題を次のように分解する
20
0
7
2
5 1 4 5 4
4
3
1 9
1 2 3 4 5 6
• ノード 1 へ至る最小コストを求める問題
• ノード 2 へ至る最小コストを求める問題
• ノード 3 へ至る最小コストを求める問題
• ノード 4 へ至る最小コストを求める問題
• ノード 5 へ至る最小コストを求める問題
• ノード 6 へ至る最小コストを求める問題
問題を次のように分解する
21
0
7
2
5 1 4 5 4
4
3
1 9
1 2 3 4 5 6
• ノード 1 へ至る最小コストを求める問題
• ノード 2 へ至る最小コストを求める問題
• ノード 3 へ至る最小コストを求める問題
• ノード 4 へ至る最小コストを求める問題
• ノード 5 へ至る最小コストを求める問題
• ノード 6 へ至る最小コストを求める問題
問題を次のように分解する
22
0
7
2
5 1 4 5 4
4
3
1 9
1 2 3 4 5 6
• ノード 1 へ至る最小コストを求める問題
• ノード 2 へ至る最小コストを求める問題
• ノード 3 へ至る最小コストを求める問題
• ノード 4 へ至る最小コストを求める問題
• ノード 5 へ至る最小コストを求める問題
• ノード 6 へ至る最小コストを求める問題
問題を次のように分解する
23
0
7
2
5 1 4 5 4
4
3
1 9
1 2 3 4 5 6
• ノード 1 へ至る最小コストを求める問題
• ノード 2 へ至る最小コストを求める問題
• ノード 3 へ至る最小コストを求める問題
• ノード 4 へ至る最小コストを求める問題
• ノード 5 へ至る最小コストを求める問題
• ノード 6 へ至る最小コストを求める問題
問題を次のように分解する
24
0
7
2
5 1 4 5 4
4
3
1 9
1 2 3 4 5 6
• ノード 1 へ至る最小コストを求める問題
• ノード 2 へ至る最小コストを求める問題
• ノード 3 へ至る最小コストを求める問題
• ノード 4 へ至る最小コストを求める問題
• ノード 5 へ至る最小コストを求める問題
• ノード 6 へ至る最小コストを求める問題
問題を次のように分解する
25
0
7
2
5 1 4 5 4
4
3
1 9
1 2 3 4 5 6
• ノード 1 へ至る最小コストを求める問題
• ノード 2 へ至る最小コストを求める問題
• ノード 3 へ至る最小コストを求める問題
• ノード 4 へ至る最小コストを求める問題
• ノード 5 へ至る最小コストを求める問題
• ノード 6 へ至る最小コストを求める問題
順にメモ化
しながら
求めていく
メモ化用の DP テーブル
26
0
7
2
5 1 4 5 4
4
3
1 9
1 2 3 4 5 6
メモ
頂点 0 への最小コスト (初期条件)
27
0
7
2
5 1 4 5 4
4
3
1 9
1 2 3 4 5 6
0
メモ
頂点 1 への最小コスト
28
0
7
2
5 1 4 5 4
4
3
1 9
1 2 3 4 5 6
0
7
7
メモ
頂点 2 への最小コスト
29
0
7
2
5 1 4 5 4
4
3
1 9
1 2 3 4 5 6
0 7
2
5
2
12 vs. 2
メモ
頂点 3 への最小コスト
30
0
7
2
5 1 4 5 4
4
3
1 9
1 2 3 4 5 6
0 7
4
1
2
3 vs. 11
3
メモ
頂点 4 への最小コスト
31
0
7
2
5 1 4 5 4
4
3
1 9
1 2 3 4 5 6
メモ
0 7
3
4
2
7 vs. 5
3 5
頂点 5 への最小コスト
32
0
7
2
5 1 4 5 4
4
3
1 9
1 2 3 4 5 6
0 7
1
5
2
10 vs. 4
3 5 4
メモ
頂点 6 への最小コスト
33
0
7
2
5 1 4 5 4
4
3
1 9
1 2 3 4 5 6
0 7
9
4
2
8 vs. 14
3 5 4 8
メモ
実装上は
34
• メモ化用の DP テーブルを配列でもつ
dp[v] ← 頂点 0 から頂点 v へ至る最短コスト
i-2 i-1 i
dp[i] = min(dp[i-1] + f(i-1, i),
dp[i-2] + f(i-2, i)
動的計画法の着眼
35
• メモ化:何度も参照される小さな問題の結果を保存して
すぐに参照できるようにする (キャッシュ)
問題を一連の部分問題に分割し、
各部分問題の解をメモ化しながら順に求めていく手法
• 部分問題への分割:同じ構造を持つ小さな問題 (部分問
題) の結果を使うことで大きな問題が解ける
• ノード 1, 2, 3, 4, 5, 6 への最短経路を順に求めた
本日の講演内容
36
• 動的計画法のさまざまなパターン
動的計画法は汎用的
• 動的計画法で解決できる問題は数多くある
• ナップサック問題
• スケジューリング問題
• 発電計画問題
• 編集距離
• 音声認識パターンマッチング問題
• 文章の分かち書き
• 隠れマルコフモデル
37
• 問題に応じて各個撃破な発想で解くしかないのか?
動的計画法の遷移パターンに着目
• 動的計画法は高校数学でいうところの「漸化式」
38
• 漸化式の遷移パターンに着目すると、典型的な
パターンをいくつか抽出できる!
• それらに習熟すれば、さまざまな問題が解ける
• 「モデリング」 + 「理論」 + 「アルゴリズム」
i-2 i-1 i
dp[i] = min(dp[i-1] + f(i-1, i),
dp[i-2] + f(i-2, i)
拙著の動的計画法の章
• 5 章 - 設計技法 (3):動的計画法
39
• 5.1 動的計画法とは
• 5.2 動的計画法の例題
• 5.3 動的計画法に関連する諸概念
• 5.4 動的計画法の例 (1):ナップサック問題
• 5.5 動的計画法の例 (2):編集距離
• 5.6 動的計画法の例 (3):区間分割の仕方を最適化
• 5.7 まとめ
パターン(1):ナップサック問題
40
w
0 1 2 3 4 5 6 7 8 9 10
dp[0]
dp[1]
dp[2]
dp[3]
dp[4]
0 0 0 0 0 0 0 0 0 0 0
0 0 0 6 6 6 6 6 6 6 6
0 3 3 6 9 9 9 9 9 9 9
0 3 3 6 9 9 10
0 3 3 6 85
10 10 10 10
88 88 91 94 94 95
• こんなイメージの遷移
パターン(2):編集距離
41
• こんなイメージの遷移
0
1
2
3
4
5
6
7
8
1
1
2
3
4
5
6
7
8
2
1
2
3
4
5
6
7
8
3
2
2
2
3
4
5
6
7
4
3
2
3
3
4
5
6
7
5
4
3
3
4
4
5
6
7
6
5
4
4
3
4
5
5
6
7
6
5
5
4
4
4
5
6
8
7
6
6
5
5
5
5
6
l
o
g
9
8
7
7
6
6
6
6
6
i
s
t
i
c
a l g o r i t h m
長さ 1
長さ 0
パターン(3):区間分割
42
• こんなイメージの遷移
i 個
j 個
dp[i] = min(dp[i], dp[j] + f(j, i))
3 つの代表的な遷移パターン
43
• ナップサック問題
• 編集距離
• 区間分割
ナップサック問題
44
N 個の品物があって、いくつか選びたい
各品物には「重さ」と「価値」の属性がある
選んだ品物の重さの合計が W を超えないようにしつつ
価値の総和を最大化せよ
https://www.msi.co.jp/nuopt/introduction/index.html
ナップサック問題
45
N 個の品物があって、いくつか選びたい
各品物には「重さ」と「価値」の属性がある
選んだ品物の重さの合計が W を超えないようにしつつ
価値の総和を最大化せよ
dp[i] ← N 個の品物のうち、最初の i 個のみ考える
その中から重さの合計が W を超えないようにしつつ
選んだ品物の価値の最大値 (?)
最初の i 個についての問題 (部分問題)
これだとうまくいかない
ナップサック問題
46
N 個の品物があって、いくつか選びたい
各品物には「重さ」と「価値」の属性がある
選んだ品物の重さの合計が W を超えないようにしつつ
価値の総和を最大化せよ
dp[i][w] ← N 個の品物のうち、最初の i 個のみ考える
その中から重さの合計が w を超えないようにしつつ
選んだときの価値の総和の最大値
最初の i 個についての問題 (部分問題)
ナップサック問題
47
• i 個についての解 (dp[i]) から、i+1 個についての解
(dp[i+1]) を導く
dp[i+1][w] = max(dp[i][w],
dp[i][w-wei[i]] + val[i])
新たな品物を選ばない場合
新たな品物を選ぶ場合
i 個
i+1 個
この品物を選ぶかどうかで場合分け
重さ 価値
ナップサック DP の遷移
48
w
0 1 2 3 4 5 6 7 8 9 10
dp[0]
dp[1]
dp[2]
dp[3]
dp[4]
0 0 0 0 0 0 0 0 0 0 0
0 0 0 6 6 6 6 6 6 6 6
0 3 3 6 9 9 9 9 9 9 9
0 3 3 6 9 9 10
0 3 3 6 85
10 10 10 10
88 88 91 94 94 95
• (重さ, 価値) = (3, 6), (1, 3), (2, 1), (5, 85) の場合
ナップサック DP の遷移のポイント
49
dp[2]
dp[3]
dp[4]
0 3 3 6 9 9 9 9 9 9 9
0 3 3 6 9 9 10
0 3 3 6 85
10 10 10 10
88 88 91 94 94 95
• N 個の要素をシーケンシャルに処理していくもの
• そのために必要な添字を適宜追加していく
dp[i][w]
部分問題のサイズ 遷移に必要な追加の添字
例(1): サイゼリヤ問題
50
• 予算 1000 円で、最高何 kcal とれるか?
https://qiita.com/marusho_summers/items/a2d3681fac863734ec8a
• ナップサック問題そのもの
• ナップサックの容量が予算に対応:1000 円
• 品物の価値が、カロリーに対応
・ポテトのグリル
(199 円, 366 kcal)
・アーリオ•オーリオ
(574 円, 1120 kcal)
・ラージライス
(219 円, 454 kcal)
合計:992 円, 1940 kcal
例(2): 隠れマルコフモデル
51
• 系列データを「潜在変数」のマルコフ連鎖で表すもの
追加の添字 i+1 番目の状態が i 番目のみに依る
• 前回の状態によって、次回の各状態の起こりやすさが
変化する
https://mathwords.net/hiddenmarkov
風邪 or 元気
からなる系列データ
例(2): 隠れマルコフモデル
52
• 系列データを「潜在変数」のマルコフ連鎖で表すもの
追加の添字 i+1 番目の状態が i 番目のみに依る
• 潜在変数の最も確からしい経路を求める Viterbi のアル
ゴリズムは、ナップサック DP とほとんど同じもの
• 音声認識
• 品詞分析
• 株価の変動予測
さまざまな応用
例(3): パネルの長さを揃える
53
さまざまな長さのパネルがたくさん並んでいる
それをいくつかのグループに分ける
各グループのパネルの長さの総和をなるべく揃えたい
実際にはパネルの幅も考慮
54
• どのグループの長さも「許される上限」以下とする
• 最短のグループの長さを、最大化する
dp[i][j] ← 最初の i 枚のパネルについて考える
現在形成中のグループの長さが j であるとした場合の
現在までに形成されたグループの長さの最小値
この長さが j
…
例(3): パネルの長さを揃える
3 つの代表的な遷移パターン
55
• 編集距離
編集距離
56
2 つの文字列 S, T がある
S に以下の 3 通りの操作を繰り返すことで T に変換したい
・変更: S の文字を 1 つ選んで変更
・削除: S の文字を 1 つ選んで削除
・挿入: S の好きな箇所に好きな文字を 1 文字挿入
最小回数を求めよ
例:
S = logistic
T = algorithm
→ 6 回
二系列の DP
57
例:
S = logistic
T = algorithm
→ 6 回
dp[i][j] ← S の最初の i 文字と、T の最初の j 文字との
間についての操作回数の最小値
編集距離を求める DP の遷移
58
dp[i][j] ← S の最初の i 文字と、T の最初の j 文字との
間についての操作回数の最小値
応用が広く、分野横断的!
59
• diff コマンド
• 音声認識、画像認識、空間認識
• DP マッチング
• 二系列データの類似度を考える問題全般に適用
• スペルチェッカー
• バイオインフォマティクス
• 系列アラインメント (2 つの DNA の類似度を測るなど)
• 手書き文字認識
3 つの代表的な遷移パターン
60
• 区間分割
区間分割
61
0 1 2 3 4 5 6 7 8 9
• 系列データをいくつかの区間に分ける
• 区間分割の仕方を最適化したい
区間分割を扱う DP
62
i 個
j 個
dp[i] ← 最初の i 個をいくつかの区間に区切る方法の
「良さ」の最大値 (i 個目のところで一旦区切るとする)
dp[i] = min(dp[i], dp[j] + f(j, i))
区間分割を扱う DP
63
i 個
j 個
dp[i] = min(dp[i], dp[j] + f(j, i))
計算量は大きくなりがち
さまざまな高速化手法あり
例(4): 分かち書き
64
http://chasen.naist.jp/chaki/t/2009-09-30/doc/mecab-cabocha-nlp-seminar-2009.pdf
僕は君を愛している
僕 は 君 を 愛し て いる
単語ごとに区切る
例(5): 発電計画問題
65
• 発電の on と off のタイミングを最適化する
on off on off
• 需要供給バランスの考慮などもあって、各区間のコス
ト関数 f(i, j) はとても複雑なものになる
• 「~時間以上連続稼働」といった制約も考慮
例(6): タイムスケジューリング
66
• お客さまを順に回る配送 (配送順序は固定)
• 「何時から何時の間に届けてほしい」
• 「~分間に 1 回は休憩が必要」という制約もある
→ どこで休憩をとるかを最適化
休憩場所ごとに区切る
まとめ
67
• ナップサック問題
• 編集距離
• 区間分割
• 経験上、動的計画法によって解決できる問題のほとんど
が共通の遷移パターンで扱える!
• 共通の「問題の構造」に着目することで明快に解ける
• 「共通の理論」と、「問題に特有の事情」とに分離
することで、見通しのよい問題解決ができる
モデリング + 理論 + アルゴリズム
1 of 67

More Related Content

Similar to 210122 msi dp(20)

Scrum alliance regional gathering tokyo 2013 pubScrum alliance regional gathering tokyo 2013 pub
Scrum alliance regional gathering tokyo 2013 pub
グロースエクスパートナーズ株式会社/Growth xPartners Incorporated.1.7K views
2012-03-08 MSS研究会2012-03-08 MSS研究会
2012-03-08 MSS研究会
Kimikazu Kato1.4K views
Or seminar2011finalOr seminar2011final
Or seminar2011final
Mikio Kubo2.3K views
T69 epistemeT69 episteme
T69 episteme
えぴ 福田484 views
競プロは人生の役に立つ!競プロは人生の役に立つ!
競プロは人生の役に立つ!
Kensuke Otsuki144 views
Web本文抽出 using crfWeb本文抽出 using crf
Web本文抽出 using crf
Shuyo Nakatani6.4K views
Code iq×japanr 公開用Code iq×japanr 公開用
Code iq×japanr 公開用
Nobuaki Oshiro1.2K views

210122 msi dp