「現実世界に活かす数学」 (麻布高等学校、教養総合、数学講義 5 回目)

Kensuke Otsuki
Kensuke OtsukiResearcher at NTT DATA MSI
現実世界に活かす数学
- グラフ, 漸化式から動的計画法へ -
NTT データ数理システム
大槻 兼資
(ペンネーム: けんちょん)
2021/5/15
@麻布学園
1
今日の話
2
グラフ 漸化式
動的計画法
現実世界への応用
an+1 = 2an + 3
/ 153
• 2014年:東京大学大学院情報理工学系研究科
数理情報学専攻修士課程修了
自己紹介 (本業編)
• 2015年~:NTT データ数理システム
• 専門は数理工学全般
• アルゴリズム
• 探索, ネットワークなど
• 数理最適化
• シフトスケジューリングなど
• 機械学習
• チャットボットなど
http://www.dis.uniroma1.it/challenge9/download.shtml 3
4
自己紹介 (趣味編)
(5月15日) (7 の形) (1234567890 で「コ」)
• 虫食算作り
• コミケなどにも出店
• 競技プログラミング
1
5
5
×
自己紹介 (趣味編)
(全部虫食い) (たのしい) (将棋: 美濃囲い)
• 虫食算作り
• コミケなどにも出店
• 競技プログラミング
6
アルゴリズム本を出版
• 2021 年 IT エンジニア本大賞特別賞
• 「問題の解き方」を重視したアルゴリズムの入門書
7
アルゴリズム本の章構成
第 1 章
アルゴリズムとは
第 2 章
計算量とオーダー記法
第 3 章
全探索
第 4 章
再帰と分割統治法
第 5 章
動的計画法
第 6 章
二分探索法
第 7 章
貪欲法
第 8 章
配列、連結リスト
ハッシュテーブル
第 9 章
スタックとキュー
第 10 章
グラフと木
第 11 章
Union-Find
第 12 章
ソート
第 13 章
グラフ探索
第 14 章
最短路問題
第 15 章
最小全域木問題
第 16 章
ネットワークフロー
第 17 章
P と NP
第 18 章
難問対策
8
アルゴリズム本の章構成
第 1 章
アルゴリズムとは
第 2 章
計算量とオーダー記法
第 3 章
全探索
第 4 章
再帰と分割統治法
第 5 章
動的計画法
第 6 章
二分探索法
第 7 章
貪欲法
第 8 章
配列、連結リスト
ハッシュテーブル
第 9 章
スタックとキュー
第 10 章
グラフと木
第 11 章
Union-Find
第 12 章
ソート
第 13 章
グラフ探索
第 14 章
最短路問題
第 15 章
最小全域木問題
第 16 章
ネットワークフロー
第 17 章
P と NP
第 18 章
難問対策
アルゴリズムとは
• ある問題を解くための方法、手順のこと
• それを実装したものがプログラム
• 「入力」を入れると「出力」を返す装置
9
アルゴリズム
入力 出力
10
アルゴリズムの例
カーナビ
地図
現在地
目的地
目的地へ
至る経路
単語検索
文書 文書に単語
が含まれるか
単語
数独
ソルバー
11
数学で現実の問題を解くとは
数理モデル化
数学パズル
な問題
解
解釈・意思決定
アルゴリズム
数理最適化
機械学習
12
現実の問題への数学の力
• AI や量子コンピュータなどの、分野の流行に依らない
一生モノのスキル
• むしろ AI を学ぶための強力な下地となる
グラフ
動的計画法
○○手法
電気 機械 化学 生物 経済 ○○
• さまざまな分野の問題が、数理モデル化によって
本質的に同じ問題になったりなる!
今日の話
13
グラフ
現実世界への応用
an+1 = 2an + 3
14
グラフ
• 物事の関係性を「丸」と「線」を用いて表したもの
• コンピュータサイエンスのあらゆる領域で使われる
頂点 辺
15
• 辺に「向き」があることもある (有向グラフ)
グラフ
• あれもこれも実はグラフ!
• さまざまな分野の問題をグラフに関する問題として
見通よく汎用的に扱える!
16
数理モデル化の精神
グラフ
例(1):友人関係
• 頂点:人間
17
• 辺:友人関係
タスク例
A さんの友達の友達が
何人いるか求める
例(2):鉄道路線図
• 頂点:駅
18
• 辺:線路
タスク例
A 駅から B 駅への
最短経路を求める
(Dijkstra 法)
例(3):数独ソルバー
• 頂点:局面
19
• 辺:局面遷移
タスク例
数独の解を求める
(深さ優先探索)
2
3
2
2
1
1
1 2
3
2
2
1
1
2
3
2
2
1
1
3
2
2
3
2
2
1
1
1
2
3
2
2
1
1
1 2
3
2
2
1
1
1
1 2 3
2
3
2
2
1
1
1
2
3
2
2
1
1
1 2
3
2
2
1
1
1
2 2 3
1 2 3
2
3
2
2
1
1
2
3
2
2
1
1
3
2
3
2
2
1
1
3 2
3
2
2
1
1
3
1 2 3
例(4):8パズルの最小手数
• 頂点:局面
20
• 辺:局面遷移
タスク例
8パズルの
最小手数を求める
(幅優先探索)
2
7
3
4
1
5
8 6
2
7
3
4
1
5
8 6
2
7
3
4
1
5
8 6
2
7
3
4
1
5
8 6
2
7
3
4 1
5
8 6
2
7
3
4
1
5
8
6
2
7
3
4
1
5
8 6
2
7
3
4
1
5
8 6
2
7
3
4
1 5
8 6
2
7
3
4
1
5
8
6
2
7
3
4
1
5
8 6
2
7
3
4
1
5
8
6
2
7
3
4
1
5
8
6
1
8
3
2
4
5
7 6
1
8
3
7
4
5
2
6
3
8
5
4
1
2
7 6
3
7
5
4
1
6
2
8
目標配置
初期配置
例(5):タスクの依存関係
• 頂点:タスク
21
• 辺:依存関係
タスク例
タスクの適切な順序
を決定する
(トポロジカルソート)
皿洗い
食事
帰宅 歯磨き
風呂
就寝
例(6):電気回路
• 頂点:素子
22
• 辺:導線
タスク例
有向グラフ (電流の向き考慮)
の有向閉路を検出
例(7):家系図
• 頂点:家族
23
• 辺:血縁関係
タスク例
A さんと B さんの
最近の共通祖先を求める
例(8):化学式
• 頂点:原子
24
• 辺:原子の結合
タスク例
CnH2n+2 の
異性体の個数を数え上げる
O
OH
例(9):しりとり
• 頂点:文字
25
• 辺:単語
タスク例
すべての単語を用いた
しりとりを見つける
(Euler 路)
d
DNA の部分系列の集まり
から全体を復元する問題
などに応用あり
g
dog
m
gram
good
dim
a
and
arm t
tea
team
例(10):マッチング
• 頂点:「男」と「女」
26
• 辺:恋愛対象
タスク例
最大で何組のペアを
作れるかを求める
(二部マッチング)
極めて多彩な応用あり
• あれもこれも実はグラフ!
• さまざまな分野の問題をグラフに関する問題として
見通よく汎用的に扱える!
27
数理モデル化の精神
グラフのすごさ (再掲)
• 数独ソルバー (by 深さ優先探索)
28
グラフを使って問題を解く例
• 迷路の最短路 (by 幅優先探索)
29
深さ優先探索
• 数独ソルバーを作ることを考える
https://ja.wikipedia.org/wiki/%E6%95%B0%E7%8B%AC
30
深さ優先探索
• 数独を解く過程もグラフで表せる!
2
3
2
2
1
1
1 2
3
2
2
1
1
2
3
2
2
1
1
3
2
2
3
2
2
1
1
1
2
3
2
2
1
1
1 2
3
2
2
1
1
1
1 2 3
2
3
2
2
1
1
1
2
3
2
2
1
1
1 2
3
2
2
1
1
1
2 2 3
1 2 3
2
3
2
2
1
1
2
3
2
2
1
1
3
2
3
2
2
1
1
3 2
3
2
2
1
1
3
1 2 3
https://ja.wikipedia.org/wiki/%E6%95%B0%E7%8B%AC
31
深さ優先探索の動き
• 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る
2
3
2
2
1
1
32
深さ優先探索の動き
2
3
2
2
1
1
1
2
3
2
2
1
1
• 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る
33
深さ優先探索の動き
2
3
2
2
1
1
1
2
3
2
2
1
1
1 1
2
3
2
2
1
1
• 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る
34
深さ優先探索の動き
2
3
2
2
1
1
1
2
3
2
2
1
1
1 1
2
3
2
2
1
1
• 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る
35
深さ優先探索の動き
• 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る
2
3
2
2
1
1
1
2
3
2
2
1
1
1
2
3
2
2
1
1
1 1 2
2
3
2
2
1
1
36
深さ優先探索の動き
• 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る
2
3
2
2
1
1
1
2
3
2
2
1
1
1
2
3
2
2
1
1
1 1 2
2
3
2
2
1
1
37
深さ優先探索の動き
• 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る
2
3
2
2
1
1
1
2
3
2
2
1
1
1
2
3
2
2
1
1
1 2
3
2
2
1
1
1
1 2 3
2
3
2
2
1
1
38
深さ優先探索の動き
• 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る
2
3
2
2
1
1
1
2
3
2
2
1
1
1
2
3
2
2
1
1
1 2
3
2
2
1
1
1
1 2 3
2
3
2
2
1
1
1 2
1
2
3
2
2
1
1
39
深さ優先探索の動き
• 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る
2
3
2
2
1
1
1
2
3
2
2
1
1
1
2
3
2
2
1
1
1 2
3
2
2
1
1
1
1 2 3
2
3
2
2
1
1
1 2
1
2
3
2
2
1
1
40
深さ優先探索の動き
• 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る
2
3
2
2
1
1
1
2
3
2
2
1
1
1
2
3
2
2
1
1
1 2
3
2
2
1
1
1
1 2 3
2
3
2
2
1
1
1
2
3
2
2
1
1
1 2 2
1 2
2
3
2
2
1
1
41
深さ優先探索の動き
• 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る
2
3
2
2
1
1
1
2
3
2
2
1
1
1
2
3
2
2
1
1
1 2
3
2
2
1
1
1
1 2 3
2
3
2
2
1
1
1
2
3
2
2
1
1
1 2 2
1 2
2
3
2
2
1
1
42
深さ優先探索の動き
• 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る
2
3
2
2
1
1
1
2
3
2
2
1
1
1
2
3
2
2
1
1
1 2
3
2
2
1
1
1
1 2 3
2
3
2
2
1
1
1
2
3
2
2
1
1
1 2
3
2
2
1
1
1
2 2 3
1 2 3
2
3
2
2
1
1
43
深さ優先探索の動き
• 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る
2
3
2
2
1
1
1
2
3
2
2
1
1
1
2
3
2
2
1
1
1 2
3
2
2
1
1
1
1 2 3
2
3
2
2
1
1
1
2
3
2
2
1
1
1 2
3
2
2
1
1
1
2 2 3
1 2 3
2
3
2
2
1
1
44
深さ優先探索の動き
• 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る
2
3
2
2
1
1
1 2
3
2
2
1
1
2
2
3
2
2
1
1
1
2
3
2
2
1
1
1 2
3
2
2
1
1
1
1 2 3
2
3
2
2
1
1
1
2
3
2
2
1
1
1 2
3
2
2
1
1
1
2 2 3
1 2 3
2
3
2
2
1
1
45
深さ優先探索の動き
• 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る
2
3
2
2
1
1
1 2
3
2
2
1
1
2
2
3
2
2
1
1
1
2
3
2
2
1
1
1 2
3
2
2
1
1
1
1 2 3
2
3
2
2
1
1
1
2
3
2
2
1
1
1 2
3
2
2
1
1
1
2 2 3
1 2 3
2
3
2
2
1
1
46
深さ優先探索の動き
• 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る
2
3
2
2
1
1
1 2
3
2
2
1
1
2
3
2
2
1
1
3
2
2
3
2
2
1
1
1
2
3
2
2
1
1
1 2
3
2
2
1
1
1
1 2 3
2
3
2
2
1
1
1
2
3
2
2
1
1
1 2
3
2
2
1
1
1
2 2 3
1 2 3
2
3
2
2
1
1
47
深さ優先探索の動き
• 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る
2
3
2
2
1
1
1 2
3
2
2
1
1
2
3
2
2
1
1
3
2
2
3
2
2
1
1
1
2
3
2
2
1
1
1 2
3
2
2
1
1
1
1 2 3
2
3
2
2
1
1
1
2
3
2
2
1
1
1 2
3
2
2
1
1
1
2 2 3
1 2 3
2
3
2
2
1
1
2
3
2
2
1
1
3 1
48
深さ優先探索の動き
• 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る
2
3
2
2
1
1
1 2
3
2
2
1
1
2
3
2
2
1
1
3
2
2
3
2
2
1
1
1
2
3
2
2
1
1
1 2
3
2
2
1
1
1
1 2 3
2
3
2
2
1
1
1
2
3
2
2
1
1
1 2
3
2
2
1
1
1
2 2 3
1 2 3
2
3
2
2
1
1
2
3
2
2
1
1
3 1
49
深さ優先探索の動き
• 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る
2
3
2
2
1
1
1 2
3
2
2
1
1
2
3
2
2
1
1
3
2
2
3
2
2
1
1
1
2
3
2
2
1
1
1 2
3
2
2
1
1
1
1 2 3
2
3
2
2
1
1
1
2
3
2
2
1
1
1 2
3
2
2
1
1
1
2 2 3
1 2 3
2
3
2
2
1
1
2
3
2
2
1
1
3
2
3
2
2
1
1
3 1 2
50
深さ優先探索の動き
• 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る
2
3
2
2
1
1
1 2
3
2
2
1
1
2
3
2
2
1
1
3
2
2
3
2
2
1
1
1
2
3
2
2
1
1
1 2
3
2
2
1
1
1
1 2 3
2
3
2
2
1
1
1
2
3
2
2
1
1
1 2
3
2
2
1
1
1
2 2 3
1 2 3
2
3
2
2
1
1
2
3
2
2
1
1
3
2
3
2
2
1
1
3 1 2
51
深さ優先探索の動き
• 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る
2
3
2
2
1
1
1 2
3
2
2
1
1
2
3
2
2
1
1
3
2
2
3
2
2
1
1
1
2
3
2
2
1
1
1 2
3
2
2
1
1
1
1 2 3
2
3
2
2
1
1
1
2
3
2
2
1
1
1 2
3
2
2
1
1
1
2 2 3
1 2 3
2
3
2
2
1
1
2
3
2
2
1
1
3
2
3
2
2
1
1
3 2
3
2
2
1
1
3
1 2 3
52
深さ優先探索の動き
• 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る
2
3
2
2
1
1
1 2
3
2
2
1
1
2
3
2
2
1
1
3
2
2
3
2
2
1
1
1
2
3
2
2
1
1
1 2
3
2
2
1
1
1
1 2 3
2
3
2
2
1
1
1
2
3
2
2
1
1
1 2
3
2
2
1
1
1
2 2 3
1 2 3
2
3
2
2
1
1
2
3
2
2
1
1
3
2
3
2
2
1
1
3 2
3
2
2
1
1
3
1 2 3
53
深さ優先探索の動き
• 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る
2
3
2
2
1
1
1 2
3
2
2
1
1
2
3
2
2
1
1
3
2
2
3
2
2
1
1
1
2
3
2
2
1
1
1 2
3
2
2
1
1
1
1 2 3
2
3
2
2
1
1
1
2
3
2
2
1
1
1 2
3
2
2
1
1
1
2 2 3
1 2 3
2
3
2
2
1
1
2
3
2
2
1
1
3
2
3
2
2
1
1
3 2
3
2
2
1
1
3
1 2 3
終了!
54
深さ優先探索の実応用
• 数独ソルバー
• https://github.com/drken1215/sudoku
• 虫食算ソルバーも同様に作れる
• コンピュータ将棋 AI の探索ルーチン
• makefile などのビルドシステム
• 動的計画法にもつながる
• ネットワークの輸送経路の確保
http://www.dis.uniroma1.it/challenge9/download.shtml
深さ優先探索のポイント
• 「目の付け所」がとても大事!
• 探索順序を工夫したり…探索不要なところを見出したり
• 数独なら、選択肢が少なそう
なマスから順に考えるなど
加藤徹作、大駒誠一, 武純也, 丸尾学著 『虫食算パズル700選』 問 698
56
幅優先探索
• 迷路の最短路を求めよう!
• スタート (S) からゴール (G) への最短経路は?
57
幅優先探索
• 迷路の最短路を求めよう!
• スタート (S) からゴール (G) への最短経路は?
これもグラフ!
・マス目が頂点
・マス目の隣接が辺
58
幅優先探索
• まず S から 1 手で行けるマスに「1」と書く
59
幅優先探索
• 次に「1」から 1 手で行けるマスに「2」と書く
60
幅優先探索
• 「2」から 1 手で行けるマスに「3」と書く
61
幅優先探索
• 「3」から 1 手で行けるマスに「4」と書く
62
幅優先探索
• 「4」から 1 手で行けるマスに「5」と書く
63
幅優先探索
• 「5」から 1 手で行けるマスに「6」と書く
64
幅優先探索
• 「6」から 1 手で行けるマスに「7」と書く
65
幅優先探索
• 「7」から 1 手で行けるマスに「8」と書く
66
幅優先探索
• 「8」から 1 手で行けるマスに「9」と書く
67
幅優先探索
• 「9」から 1 手で行けるマスに「10」と書く
68
幅優先探索
• 「10」から 1 手で行けるマスに「11」と書く
69
幅優先探索
• 「11」から 1 手で行けるマスに「12」と書く
70
幅優先探索
• 「12」から 1 手で行けるマスに「13」と書く
71
幅優先探索
• 「13」から 1 手で行けるマスに「14」と書く
72
幅優先探索
• 「14」から 1 手で行けるマスに「15」と書く
73
幅優先探索
• 「15」から 1 手で行けるマスに「16」と書く
• これでゴール!!!
74
幅優先探索
• ゴールから、「数値が 1 ずつ下がっていくように」
遡っていくと、最短経路が得られる
75
幅優先探索の応用
• カーナビ
• 電車の乗り換え案内
• パズル (15-パズルなど) の最小手数
76
最短経路問題 - 実応用に向けて
• 道路の長さも考慮
• ダイクストラ法などより高度なアルゴリズムへ
• 道路の交通状況も考慮
• 「ここを通ると嬉しい」というボーナスも
• ベルマンフォード法などより高度なアルゴリズムへ
• 街の構造なども利用して高速化したり
今日の話
77
漸化式
現実世界への応用
an+1 = 2an + 3
漸化式とは
前の数値から、次の数値を作る規則
• 数列には大きく分けて 2 つの見方がある
• 一般項 (一般的な規則性)
• 漸化式 (前の数値から次の数値への規則)
3, 6, 9, 12, 15, 18, 21, 24, …
78
一般項
3, 6, 9, 12, 15, 18, 21, 24, …
例:
この数列を一般項としてみると…
n 番目は 3 × n 3, 6, 9, 12, 15, 18, 21, 24, …
3×1
an = 3n
79
一般項
3, 6, 9, 12, 15, 18, 21, 24, …
例:
n 番目は 3 × n 3, 6, 9, 12, 15, 18, 21, 24, …
3×2
an = 3n
この数列を一般項としてみると…
80
一般項
3, 6, 9, 12, 15, 18, 21, 24, …
例:
n 番目は 3 × n 3, 6, 9, 12, 15, 18, 21, 24, …
3×3
an = 3n
この数列を一般項としてみると…
81
一般項
3, 6, 9, 12, 15, 18, 21, 24, …
例:
n 番目は 3 × n 3, 6, 9, 12, 15, 18, 21, 24, …
3×4
an = 3n
この数列を一般項としてみると…
82
漸化式
前の数値から、次の数値を作る規則
3, 6, 9, 12, 15, 18, 21, 24, …
例:
漸化式としてみると…
a1 = 3
,
初項が 3
前の数に
3 を足していく
83
an = an−1 + 3
漸化式
前の数値から、次の数値を作る規則
3, 6, 9, 12, 15, 18, 21, 24, …
例:
a1 = 3
,
初項が 3
3,
漸化式としてみると…
84
前の数に
3 を足していく
an = an−1 + 3
漸化式
前の数値から、次の数値を作る規則
3, 6, 9, 12, 15, 18, 21, 24, …
例:
a1 = 3
,
初項が 3
3, 6,
+3
漸化式としてみると…
85
前の数に
3 を足していく
an = an−1 + 3
漸化式
前の数値から、次の数値を作る規則
3, 6, 9, 12, 15, 18, 21, 24, …
例:
a1 = 3
,
初項が 3
3, 6, 9,
+3 +3
漸化式としてみると…
86
前の数に
3 を足していく
an = an−1 + 3
漸化式
前の数値から、次の数値を作る規則
3, 6, 9, 12, 15, 18, 21, 24, …
例:
a1 = 3
,
初項が 3
3, 6, 9, 12,
+3 +3 +3
漸化式としてみると…
87
前の数に
3 を足していく
an = an−1 + 3
漸化式
前の数値から、次の数値を作る規則
3, 6, 9, 12, 15, 18, 21, 24, …
例:
a1 = 3
,
初項が 3
3, 6, 9, 12, 15, …
+3 +3 +3 +3
漸化式としてみると…
88
前の数に
3 を足していく
an = an−1 + 3
三項間漸化式も
前の数値から、次の数値を作る規則
フィボナッチ数列
例:
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, …
89
an = an−1 + an−2
a1 = 1
a2 = 1
三項間漸化式も
前の数値から、次の数値を作る規則
フィボナッチ数列
例:
1, 1, 2
90
an = an−1 + an−2
a1 = 1
a2 = 1
三項間漸化式も
前の数値から、次の数値を作る規則
フィボナッチ数列
例:
1, 1, 2, 3
91
an = an−1 + an−2
a1 = 1
a2 = 1
三項間漸化式も
前の数値から、次の数値を作る規則
フィボナッチ数列
例:
1, 1, 2, 3, 5
92
an = an−1 + an−2
a1 = 1
a2 = 1
三項間漸化式も
前の数値から、次の数値を作る規則
フィボナッチ数列
例:
1, 1, 2, 3, 5, 8
93
an = an−1 + an−2
a1 = 1
a2 = 1
三項間漸化式も
前の数値から、次の数値を作る規則
フィボナッチ数列
例:
1, 1, 2, 3, 5, 8, 13, …
94
an = an−1 + an−2
a1 = 1
a2 = 1
漸化式をグラフで表す
例:
95
3, 6, 9, 12, 15, 18, 21, 24, …
例:
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, …
+3 +3 +3 +3 +3
3
an = an−1 + 3
an = an−1 + an−2
…
漸化式をグラフで表す
例:
96
3, 6, 9, 12, 15, 18, 21, 24, …
例:
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, …
+3 +3 +3 +3 +3
3
an = an−1 + 3
an = an−1 + an−2
…
6
漸化式をグラフで表す
例:
97
3, 6, 9, 12, 15, 18, 21, 24, …
例:
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, …
+3 +3 +3 +3 +3
3
an = an−1 + 3
an = an−1 + an−2
…
6 9
漸化式をグラフで表す
例:
98
3, 6, 9, 12, 15, 18, 21, 24, …
例:
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, …
+3 +3 +3 +3 +3
3
an = an−1 + 3
an = an−1 + an−2
…
6 9 12
漸化式をグラフで表す
例:
99
3, 6, 9, 12, 15, 18, 21, 24, …
例:
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, …
+3 +3 +3 +3 +3
3
an = an−1 + 3
an = an−1 + an−2
…
6 9 12 15
漸化式をグラフで表す
例:
100
3, 6, 9, 12, 15, 18, 21, 24, …
例:
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, …
+3 +3 +3 +3 +3
3
an = an−1 + 3
an = an−1 + an−2
…
…
1
6 9 12 15
1
漸化式をグラフで表す
例:
101
3, 6, 9, 12, 15, 18, 21, 24, …
例:
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, …
+3 +3 +3 +3 +3
3
an = an−1 + 3
an = an−1 + an−2
…
…
1 1
6 9 12 15
2
漸化式をグラフで表す
例:
102
3, 6, 9, 12, 15, 18, 21, 24, …
例:
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, …
+3 +3 +3 +3 +3
3
an = an−1 + 3
an = an−1 + an−2
…
…
1 1
6 9 12 15
2 3
漸化式をグラフで表す
例:
103
3, 6, 9, 12, 15, 18, 21, 24, …
例:
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, …
+3 +3 +3 +3 +3
3
an = an−1 + 3
an = an−1 + an−2
…
…
1 1
6 9 12 15
2 3 5
漸化式をグラフで表す
例:
104
3, 6, 9, 12, 15, 18, 21, 24, …
例:
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, …
+3 +3 +3 +3 +3
3
an = an−1 + 3
an = an−1 + an−2
…
…
1 1
6 9 12 15
2 3 5 8
道順を求めるやつも漸化式
105
1 1 1 1 1 1
1 2 3 4 5 6
1 3 6 10 15 21
1 4 10 20 35 56
1 5 15 35 70 126
道順を求めるやつも漸化式
106
1 1 1 1 1 1
1 2 3 4 5 6
1 3 6 10 15 21
1 4 10 20 35 56
1 5 15 35 70 126
今日の話
107
動的計画法
現実世界への応用
an+1 = 2an + 3
動的計画法とは
108
問題を一連の部分問題に分割し、
各部分問題の解をメモ化しながら順に求めていく手法
• とても抽象的で汎用的でわかりにくい
• 適用範囲が広い
• 実はさっきの漸化式をグラフで解釈する方法に近い
動的計画法の例題
109
足場を「ジャンプ」しながら左端から右端へ行きたい
AtCoder Educational DP Contest A - Frog
ただし「隣の足場」か「1 個飛ばしの足場」にのみ進める
ジャンプの所要時間は「足場の高さの差」
左端から右端までの最短所要時間を求めよ
4m 7m
7 - 4 = 3 秒!
3m
グラフの問題と考える
110
例:
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)
111
0
7
2
5 1 4 5 4
4
3
1 9
1 2 3 4 5 6
• ノード 0 からノード 6 への最短経路を求める!
グラフの問題と考える
112
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
グラフの問題と考える
頂点 0 から順に求めていく
113
0
7
2
5 1 4 5 4
4
3
1 9
1 2 3 4 5 6
メモ
頂点 0 への最小コスト (初期条件)
114
0
7
2
5 1 4 5 4
4
3
1 9
1 2 3 4 5 6
0
メモ
頂点 1 への最小コスト
115
0
7
2
5 1 4 5 4
4
3
1 9
1 2 3 4 5 6
0
7
7
メモ
0 + 7 = 7
頂点 2 への最小コスト
116
0
7
2
5 1 4 5 4
4
3
1 9
1 2 3 4 5 6
0 7
2
5
2
12 と 2 の小さい方
メモ
頂点 3 への最小コスト
117
0
7
2
5 1 4 5 4
4
3
1 9
1 2 3 4 5 6
0 7
4
1
2 3
メモ
3 と 11 の小さい方
頂点 4 への最小コスト
118
0
7
2
5 1 4 5 4
4
3
1 9
1 2 3 4 5 6
メモ
0 7
3
4
2 3 5
7 と 5 の小さい方
頂点 5 への最小コスト
119
0
7
2
5 1 4 5 4
4
3
1 9
1 2 3 4 5 6
0 7
1
5
2
10 と 4
3 5 4
メモ
頂点 6 への最小コスト
120
0
7
2
5 1 4 5 4
4
3
1 9
1 2 3 4 5 6
0 7
9
4
2
8 と 14
3 5 4 8
メモ
動的計画法とは
121
• 問題を一連の部分問題に分割
• 頂点 0 へ至る最小コストを求める問題
• 頂点 1 へ至る最小コストを求める問題
• …
• 頂点 N-1 へ至る最小コストを求める問題
• メモ化しながら、各部分問題の解を順に求めた
問題を一連の部分問題に分割し、
各部分問題の解をメモ化しながら順に求めていく手法
やったことは漸化式の一種
122
an = min(an−1 + f(n − 1, n), an−2 + f(n − 2, n))
f(n-1, n)
f(n-2, n)
n-2 n-1 n
• いろんなグラフを考えると、いろんな問題が解ける!
記号
123
• これからは次の記号を使う
• 動的計画法 (dynamic programming) を実際に
プログラミングするときは配列を使うことを意識
an dp[n]
an,m dp[n][m]
1 1 1 1
1 2 3 4
1 3 6 10
動的計画法は汎用的
• 動的計画法で解決できる問題は数多くある
• ナップサック問題
• スケジューリング問題
• 発電計画問題
• 編集距離
• 音声認識パターンマッチング問題
• 文章の分かち書き
• 隠れマルコフモデル
124
• ここでは代表的なパターンを 3 つ紹介!
拙著の動的計画法の章
• 5 章 - 設計技法 (3):動的計画法
125
• 5.1 動的計画法とは
• 5.2 動的計画法の例題
• 5.3 動的計画法に関連する諸概念
• 5.4 動的計画法の例 (1):ナップサック問題
• 5.5 動的計画法の例 (2):編集距離
• 5.6 動的計画法の例 (3):区間分割の仕方を最適化
• 5.7 まとめ
パターン(1):ナップサック問題
126
0 1 2 3 4 5 6 7 8 9 10
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
• こんなイメージの遷移
dp[0]
dp[1]
dp[2]
dp[3]
dp[4]
パターン(2):編集距離
127
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):区間分割
128
i 個
j 個
• こんなイメージの遷移
3 つの代表的な遷移パターン
129
• ナップサック問題
• 編集距離
• 区間分割
ナップサック問題
130
N 個の品物があって、いくつか選びたい
各品物には「重さ」と「価値」の属性がある
選んだ品物の重さの合計が W を超えないようにしつつ
価値の総和を最大化せよ
https://www.msi.co.jp/nuopt/introduction/index.html
ナップサック問題
131
N 個の品物があって、いくつか選びたい
各品物には「重さ」と「価値」の属性がある
選んだ品物の重さの合計が W を超えないようにしつつ
価値の総和を最大化せよ
dp[i][w] ← N 個の品物のうち、最初の i 個のみ考える
その中から重さの合計が w を超えないようにしつつ
選んだときの価値の総和の最大値
最初の i 個についての問題 (部分問題)
ナップサック問題
132
dp[i+1][w] = max(dp[i][w],
dp[i][w-wei[i]] + val[i])
新たな品物を選ばない場合
新たな品物を選ぶ場合
重さ 価値
dp[i][w] ← N 個の品物のうち、最初の i 個のみ考える
その中から重さの合計が w を超えないようにしつつ
選んだときの価値の総和の最大値
• dp[i][0], dp[i][1], … を用いて、       
dp[i+1][0], dp[i+1][1], … を表す
ナップサック DP の遷移
133
ナップサックに入れた重さ
0 1 2 3 4 5 6 7 8 9 10
0 個
1 個
2 個
3 個
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 の遷移のポイント
134
• N 個の要素をシーケンシャルに処理していくもの
• そのために必要な添字を適宜追加していく
dp[i][w]
部分問題のサイズ 遷移に必要な追加の添字
2 個
3 個
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
例(1): サイゼリヤ問題
135
• 予算 1000 円で、最高何 kcal とれるか?
https://qiita.com/marusho_summers/items/a2d3681fac863734ec8a
• ナップサック問題そのもの
• ナップサックの容量が予算に対応:1000 円
• 品物の価値が、カロリーに対応
・ポテトのグリル
(199 円, 366 kcal)
・アーリオ•オーリオ
(574 円, 1120 kcal)
・ラージライス
(219 円, 454 kcal)
合計:992 円, 1940 kcal
例(2): 隠れマルコフモデル
136
• 系列データを「潜在変数」のマルコフ連鎖で表すもの
追加の添字 i+1 番目の状態が i 番目のみに依る
• 前回の状態によって、次回の各状態の起こりやすさが
変化する
https://mathwords.net/hiddenmarkov
風邪 or 元気
からなる系列データ
例(2): 隠れマルコフモデル
137
• 系列データを「潜在変数」のマルコフ連鎖で表すもの
追加の添字 i+1 番目の状態が i 番目のみに依る
• 潜在変数の最も確からしい経路を求める Viterbi のアル
ゴリズムは、ナップサック DP とほとんど同じもの
• 音声認識
• 品詞分析
• 株価の変動予測
さまざまな応用
例(3): パネルの長さを揃える
138
さまざまな長さのパネルがたくさん並んでいる
それをいくつかのグループに分ける
各グループのパネルの長さの総和をなるべく揃えたい
実際にはパネルの幅も考慮
139
• どのグループの長さも「許される上限」以下とする
• 最短のグループの長さを、最大化する
dp[i][j] ← 最初の i 枚のパネルについて考える
現在形成中のグループの長さが j であるとした場合の
現在までに形成されたグループの長さの最小値
この長さが j
…
例(3): パネルの長さを揃える
3 つの代表的な遷移パターン
140
• 編集距離
編集距離
141
2 つの文字列 S, T がある
S に以下の 3 通りの操作を繰り返すことで T に変換したい
・変更: S の文字を 1 つ選んで変更
・削除: S の文字を 1 つ選んで削除
・挿入: S の好きな箇所に好きな文字を 1 文字挿入
最小回数を求めよ
例:
S = logistic
T = algorithm
→ 6 回
二系列の DP
142
例:
S = logistic
T = algorithm
→ 6 回
dp[i][j] ← S の最初の i 文字と、T の最初の j 文字との
間についての操作回数の最小値
編集距離を求める DP の遷移
143
dp[i][j] ← S の最初の i 文字と、T の最初の j 文字との
間についての操作回数の最小値
応用が広く、分野横断的!
144
• diff コマンド
• 音声認識、画像認識、空間認識
• DP マッチング
• 二系列データの類似度を考える問題全般に適用
• スペルチェッカー
• バイオインフォマティクス
• 系列アラインメント (2 つの DNA の類似度を測るなど)
• 手書き文字認識
3 つの代表的な遷移パターン
145
• 区間分割
区間分割
146
0 1 2 3 4 5 6 7 8 9
• 系列データをいくつかの区間に分ける
• 区間分割の仕方を最適化したい
区間分割を扱う DP
147
i 個
dp[i] ← 最初の i 個をいくつかの区間に区切る方法の
「良さ」の最大値 (i 個目のところで一旦区切るとする)
区間分割を扱う DP
148
i 個
j 個
計算量は大きくなりがち
さまざまな高速化手法あり
dp[i] = min_{j = 0, 1, …, i-1}(dp[j] + f(j, i))
dp[j] dp[i]
例(4): 分かち書き
149
http://chasen.naist.jp/chaki/t/2009-09-30/doc/mecab-cabocha-nlp-seminar-2009.pdf
僕は君を愛している
僕 は 君 を 愛し て いる
単語ごとに区切る
例(5): 発電計画問題
150
• 発電の on と off のタイミングを最適化する
on off on off
• 需要供給バランスの考慮などもあって、各区間のコス
ト関数 f(i, j) はとても複雑なものになる
• 「~時間以上連続稼働」といった制約も考慮
例(6): タイムスケジューリング
151
• お客さまを順に回る配送 (配送順序は固定)
• 「何時から何時の間に届けてほしい」
• 「~分間に 1 回は休憩が必要」という制約もある
→ どこで休憩をとるかを最適化
休憩場所ごとに区切る
152
数学で現実の問題を解く (再掲)
数理モデル化
数学パズル
な問題
解
解釈・意思決定
アルゴリズム
数理最適化
機械学習
全体のまとめ
153
• さまざまな分野の問題が、
数理モデル化によって本質
的に同じ問題に!
• 数学は分野の流行によら
ない、一生モノのスキル
グラフ
動的計画法
○○手法
電気 機械 化学 生物 経済 ○○
1 of 153

More Related Content

What's hot(20)

Similar to 「現実世界に活かす数学」 (麻布高等学校、教養総合、数学講義 5 回目)(20)

「現実世界に活かす数学」 (麻布高等学校、教養総合、数学講義 5 回目)