データ構造とアルゴリズム
第十三回
(2014年12月19日)
アルゴリズムの設計方針
http://www.sw.it.aoyama.ac.jp/2014/DA/lecture13.html
Martin J. Dürst
© 2009-14 Martin
J. Dürst 青山学院大学
今日の予定
- これからの予定
- 前回の残り
- アルゴリズムの設計方針
- 手に負える・負えない問題
これからの予定
- 1月9日 (金): 14回目の授業 (NP-完全性、帰着可能性)
- 1月16日 (金): 15回目の授業 (近似アルゴリズム)
- (1月23日 (金): 補講)
- 1月27日~2月3日: 期末試験
期末試験の内容
- 試験範囲:
- 授業・プリント・プログラムの全ての内容
- プログラムそのものは書く必要がないが、理解する必要はある
- 問題の種類:
- 情報数学 I や計算機実習 I と類似
- 過去の問題 (2008年度、2009年度、2010年度、2011年度、2012年度、2013年度):
- 図と解答例の一部は不足
解答例の表示のために、
Opera 12.17 (Windows/Mac/Linux)、
Google Chrome + Style
Chooser 又は
Firefox + Context
Style Switcher を使用
「表示」→「スタイル」→「solutions」で表示
- 注意点:
- 問題をよく読む (計算、証明、説明などの区別)
- 概念の定義を自分の言葉でおさえる
- 綺麗な字で書く
アルゴリズムの設計方針
- 単純なアルゴリズム
- 総当たり方 (腕力法、虱潰し、brute force)
- 貪欲アルゴリズム (greedy algorithm)
部分的な選択で最適な解を得る
- 分割統治法 (divide and conquer)
重複しない部分問題に分割
- 動的計画法 (dynamic programming)
- ネットワークフロー (network flow)
コストをグラフ上に移動しながら最適化
ナップサック問題
- ある容量 c (重さ又は体積)
のナップサックと
- n 個の品 s1,...,
sn
(それぞれ重さ、そして問題の種類によって価値がある)
- ナップサックの最適な詰め方を求める
問題の詳細によって、アルゴリズムと設計方針が変わる
ナップサック問題の変形
- 同じ品を何個詰めるか
- 品をできるだけ数多く詰む
- 容量をできるだけ利用する (整数編)
- 価値をできるだけ多くする
詰める品が全部同じ
具体例: 容量 c = 20kg, 品の重さは全て 3.5㎏
「アルゴリズム」:
ナップサックの容量を品の重さで割る
具体例の正解: 5品
設計方針: 単純なアルゴリズム
単純なアルゴリズム
- アルゴリズムとは言い難い
- 具体例:
- ソートされたデータで三番目に小さいものを選ぶ
- 長方形の面積を辺の長さから算出
- 数列などの「閉じた式」(closed formula)
- 計算機の速い時代で意外と忘れがち
品をできるだけ多く詰める
具体例: 容量 c = 20kg, 品の重さは 8kg, 2kg, 4kg, 7kg,
2kg, 1kg, 5kg, 12kg
アルゴリズム: 品を昇順に並び替え (1kg, 2kg, 2kg, 4kg, 5kg,
7kg, 8kg, 12kg)、一番軽いものから詰める
具体例の正解: 5個 (例えば 1kg, 2kg, 2kg, 4kg, 5kg)
設計方針: 貪欲アルゴリズム
貪欲アルゴリズム
- 解を少しずつ積み上げる
- 局所的な最適解だけ考慮
- 部分構造の最適性 (optimal substructure)
が条件が、構造が動的計画法と違う
- 計算量では O(n) や O(n
log n) などが多い
- 応用例: つり銭の計算など
容量をできるだけ利用する (整数編)
具体例: 容量 c = 20kg, 品の重さは 8kg, 2kg, 4kg, 7kg,
2kg, 1kg, 5kg, 12kg
アルゴリズム: 容量 c' ≦ c と品
s1,..., sk (k
≦ n) の部分問題を検討
(O(cn))
具体例の正解 (例): 8kg, 2kg, 4kg, 1kg, 5kg (合計20kg)
設計方針: 動的計画法
価値の最大化
具体例: 8kg, 500円; 2kg, 2000円; 4kg, 235円; 7kg, 700円; 2kg, 400円;
1kg, 1円; 5kg, 450円; 12kg, 650円
アルゴリズム: すべての組み合わせを試す
設計方針: 総当たり方
実装: Dknapsack.rb
(様々なアルゴリズムのなか、総当たりだけで最善解)
ナップサック問題の変形 (総括)
- 同じ品を何個詰めるか
解決: ナップサックの容量を品の重さで割る
設計方針: 単純なアルゴリズム
- 品をできるだけ数多く詰む
解決: 軽い品から容量を超える寸前まで詰む
設計方針: 貪欲アルゴリズム
- 容量をできるだけ利用する (整数編)
解決: 容量 c' ≦ c と品
s1,..., sk
(k ≦ n) の部分問題を検討
(O(cn))
設計方針: 動的計画法
- 価値をできるだけ多くする
設計方針: 総当たり方
アルゴリズムの設計方針
- アルゴリズムの開発に役立つ
- 設計方針を一つ一つ検討
- 問題によって、すぐ除外できる方針も
- 問題の詳細によって、適切な設計方針が違うことも
- 同じ方針で複数のアルゴリズムも
これからの目的
- 「簡単な問題」とそうでない問題を見分ける
- 視野の拡大、アルゴリズムの「宇宙」の展望
問題例 1: 3-SAT
- n 個の論理変数
- その変数で作られている論理式
- 論理式は (否定の) 和の積
- 和はそれぞれ三つの項
- 問題: 式が真になるように変数の値を決定
- 問題の変形: そのような変数の値の有無
- 具体例 (' が否定):
(x1∨x2∨x5)
∧
(x1'∨x3∨x4')
∧
(x2∨x4∨x5)
∧
(x1'∨x3'∨x5')
- 解答候補は 2n
- それを全部調べると時間が
O(n2n)
- それより早いアルゴリズムは知られてない
- 早いアルゴリズムが無いことも現在証明できない
問題例 2: 独立集合
(Independent Set)
- n 個の元の集合 (グラフの頂点)
- 元と元の間に競合 (conflict) がありうる
(頂点が辺で結ばれている)
- 問題:
競合がないようなできるだけ大きい部分集合を算出
- 問題の変形: k
以上の競合のない部分集合の有無
- 解答候補は 2n
- それを全部調べると時間が
O(n2n)
- それより早いアルゴリズムは知られてない
- 早いアルゴリズムが無いことも現在証明できない
問題例 3: 巡回セールスマン
(Traveling Salesman)
- n 個の「町」
- 全ての町と町の間の「距離」(時間や費用でもよい)
- 問題: 全ての町に一回だけ立ち寄る一番短い
(費用の少ない) 巡回
- 問題の変形: k 以下の長さ (費用)
の巡回の有無
- 解答候補は n!
- それを全部調べると時間が O(n!)
- それより早いアルゴリズムは知られてない
- 早いアルゴリズムが無いことも現在証明できない
宿題
- 復習
- 3-SAT、独立集合、巡回セールスマンの共通点を考える
- 期末試験の準備