データ構造とアルゴリズム
第十二回 (2013年
1月11日)
アルゴリズムの設計方針
http://www.sw.it.aoyama.ac.jp/2012/DA/lecture12.html
Martin J. Dürst
© 2009-13 Martin
J. Dürst 青山学院大学
今日の予定
- これからの予定
- 前回の残り
- アルゴリズムの設計方針
- 手に負える・負えない問題
- 授業改善のための学生アンケート
これからの予定
- 1月15日 (火曜日1限、補講):
13回目の授業
- 1月18日 (金): 14回目の授業
- 1月25日 (金) 9:30-10:55: 期末試験
補講についての注意
アルゴリズムの設計方針
- 単純なアルゴリズム
- 総当たり方 (腕力法、虱潰し、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円
アルゴリズム: すべての組み合わせを試す
設計方針: 総当たり方
実装: Cknapsack.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')
- 解答候補は O(2n)
- それを全部調べると時間も
O(2n)
- それより早いアルゴリズムは知られてない
- 早いアルゴリズムが無いことも現在証明できない
問題例 2: 独立集合
(Independent Set)
- n 個の元の集合 (グラフの頂点)
- 元と元の間に競合 (conflict) がありうる
(頂点が辺で結ばれている)
- 問題:
競合がないようなできるだけ大きい部分集合を算出
- 問題の変形: k
以上の競合のない部分集合の有無
- 解答候補は O(2n)
- それを全部調べると時間も
O(2n)
- それより早いアルゴリズムは知られてない
- 早いアルゴリズムが無いことも現在証明できない
問題例 3: 巡回セールスマン
(Traveling Salesman)
- n 個の「町」
- 全ての町と町の間の「距離」(時間や費用でもよい)
- 問題: 全ての町に一回だけ立ち寄る一番短い
(費用の少ない) 巡回
- 問題の変形: k 以下の長さ (費用)
の巡回の有無
- 解答候補は O(n!)
- それを全部調べると時間も O(n!)
- それより早いアルゴリズムは知られてない
- 早いアルゴリズムが無いことも現在証明できない
宿題
- 復習
- 3-SAT、独立集合、巡回セールスマンの共通点を考える
- 期末試験の準備
授業改善のための学生アンケート
お願い:
できるだけ自由記述を使って、具体的に書いてください
(悪い例: 発音が分かりにくい; 良い例:
さ行が濁っているかどうか分かりにくい)