組合せ問題とは?

データ構造とアルゴリズム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