データ構造とアルゴリズム

第十三回 (2014年12月19日)

アルゴリズムの設計方針

http://www.sw.it.aoyama.ac.jp/2014/DA/lecture13.html

Martin J. Dürst

AGU

© 2009-14 Martin J. Dürst 青山学院大学

今日の予定

 

これからの予定

 

期末試験の内容

試験範囲:
授業・プリント・プログラムの全ての内容
プログラムそのものは書く必要がないが、理解する必要はある
問題の種類:
情報数学 I や計算機実習 I と類似
過去の問題 (2008年度2009年度2010年度2011年度2012年度2013年度):
図と解答例の一部は不足
解答例の表示のために、
Opera 12.17 (Windows/Mac/Linux)、
Google Chrome + Style Chooser 又は
Firefox + Context Style Switcher を使用
「表示」→「スタイル」→「solutions」で表示
注意点:
問題をよく読む (計算、証明、説明などの区別)
概念の定義を自分の言葉でおさえる
綺麗な字で書く

 

アルゴリズムの設計方針

  

ナップサック問題

問題の詳細によって、アルゴリズムと設計方針が変わる

 

ナップサック問題の変形

  1. 同じ品を何個詰めるか
  2. 品をできるだけ数多く詰む
  3. 容量をできるだけ利用する (整数編)
  4. 価値をできるだけ多くする

 

詰める品が全部同じ

具体例: 容量 c = 20kg, 品の重さは全て 3.5㎏

「アルゴリズム」: ナップサックの容量を品の重さで割る

具体例の正解: 5品

設計方針: 単純なアルゴリズム

 

単純なアルゴリズム

 

品をできるだけ多く詰める

具体例: 容量 c = 20kg, 品の重さは 8kg, 2kg, 4kg, 7kg, 2kg, 1kg, 5kg, 12kg

アルゴリズム: 品を昇順に並び替え (1kg, 2kg, 2kg, 4kg, 5kg, 7kg, 8kg, 12kg)、一番軽いものから詰める

具体例の正解: 5個 (例えば 1kg, 2kg, 2kg, 4kg, 5kg)

設計方針: 貪欲アルゴリズム

 

貪欲アルゴリズム

 

容量をできるだけ利用する (整数編)

具体例: 容量 c = 20kg, 品の重さは 8kg, 2kg, 4kg, 7kg, 2kg, 1kg, 5kg, 12kg

アルゴリズム: 容量 c'c と品 s1,..., sk (kn) の部分問題を検討 (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 (様々なアルゴリズムのなか、総当たりだけで最善解)

 

ナップサック問題の変形 (総括)

  1. 同じ品を何個詰めるか
    解決: ナップサックの容量を品の重さで割る
    設計方針: 単純なアルゴリズム
  2. 品をできるだけ数多く詰む
    解決: 軽い品から容量を超える寸前まで詰む
    設計方針: 貪欲アルゴリズム
  3. 容量をできるだけ利用する (整数編)
    解決: 容量 c'c と品 s1,..., sk (kn) の部分問題を検討 (O(cn))
    設計方針: 動的計画法
  4. 価値をできるだけ多くする
    設計方針: 総当たり方

アルゴリズムの設計方針

これからの目的

問題例 1: 3-SAT

  

問題例 2: 独立集合

(Independent Set)

 

問題例 3: 巡回セールスマン

(Traveling Salesman)

 

宿題