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

第十二回 (2013年 1月11日)

アルゴリズムの設計方針

http://www.sw.it.aoyama.ac.jp/2012/DA/lecture12.html

Martin J. Dürst

AGU

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

今日の予定

これからの予定

補講についての注意

アルゴリズムの設計方針

  

ナップサック問題

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

ナップサック問題の変形

  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円

アルゴリズム: すべての組み合わせを試す

設計方針: 総当たり方

実装: Cknapsack.rb

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

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

これからの目的

問題例 1: 3-SAT

  

問題例 2: 独立集合

(Independent Set)

 

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

(Traveling Salesman)

 

宿題

授業改善のための学生アンケート

お願い: できるだけ自由記述を使って、具体的に書いてください

(悪い例: 発音が分かりにくい; 良い例: さ行が濁っているかどうか分かりにくい)