データ構造とアルゴリズム2 第6回 組合せ問題 資料作成:井口幸洋 原案:玉木久夫 http://www.iguchi-meiji.com 1 組合せ問題とは? • 組合せ問題 – 組合せるべき「部品」の集まりが与えられる – 部品をくみあわせる時に守らなければいけない 条件(制約)が与えられる – 制約を満たすような組合せ(解)を求める • 探索問題: 解を一つ求める.解が存在しない場合は 「無い」と答える. • 列挙問題: 解をすべて求める. • 最適化問題: 解の良さ(悪さ)の基準が与えられて、 最も良い(悪くない)解を求める. 2 組合せ問題の例 • カーナビの最適経路問題 – 部品: 道路の区間 – 制約: 道路の区間がつながって、出発地点から終点ま でが結ばれた経路となっていること – 解: 最適化問題(時間、距離、料金) • 鉄道の路線の問題 • 論理式の簡単化 – Quine-McLuskyの方法 • 安定な結婚問題 – ゼミわけに使っている • マクドナルドのセット料金の問題なども組合せ問題 3 しらみつぶし探索 • Exhaustive search, Brute-force search – ehaustiveの意味:網羅的な、徹底的な、消耗的 な – brute-forceの意味: 強引な、力ずくの、総当りの、 しらみつぶしの • しらみ • 解の候補をすべてちからづくで 計算すること 4 しらみつぶし探索 • たいていの場合、時間がかかりすぎる • 基礎としては、重要 – 実際に解きたい問題の規模が小さいときは解け る場合もある – 現実的な規模の問題は解けなくても、小規模な 問題をとくことで、よりよい解法のヒントとなる – しらみつぶしの中で工夫して、無駄を省くことで解 ける規模を拡大することができる 5 べき集合を求める方法 • 与えられた集合の部分集合を求める A = {玉木, 石畑, 井口}. P(A) = {Φ, {玉木}, {石畑}, {井口}, {玉木, 石畑}, {玉木, 井口}, {石畑, 井口}, {玉木, 石畑, 井口}}. • 例 B ={0, 1, 2,..., n - 1} P(B)を求めなさい 6 n = 3の場合 • 3重のfor loopを使う(以下にプログラムコードを書く) • 問題点 7 package backTrackEx; // べき集合を求める public class BackTrackExample1 { static int n = 3; // 大域変数にしている static int[] s = new int[n]; // 大域変数にしている 再帰を使う方法 static void subsets(int i) { System.out.println("subsets(" + i + ")が呼ばれました。"); if (i == n) { System.out.print("{"); for (int j = 0; j < n; j++) { if (s[j] == 1) System.out.print(j + " "); } System.out.println("}"); System.out.println(""); return; } for (s[i] = 0; s[i] < 2; s[i]++) { subsets(i + 1); } } public static void main(String[] args) { subsets(0); } } 8 実行結果(各自書いてみること) 9
© Copyright 2024 ExpyDoc