組合せ爆発に対処する アルゴリズム«–/4...t f u x y...
TRANSCRIPT
• 太郎から五郎の 作業A~Eにかかる 時間(分)を右表に示す.
• この時,人と作業をどのように組み合わせれば,総作業時間を最小にできるか? →まず表を写す 3分間で調べる
人
作業
太郎
次郎
三郎
四郎
五郎
A 10 5 7 12 8
B 14 20 15 10 15
C 18 30 20 25 22
D 35 8 18 20 12
E 20 13 8 10 17
(分) 資源(人材)割当問題
• すべての事象(組合せ)を発生させて調べて,
最良結果を選ぶ方法
太郎 次郎 三郎 四郎 五郎 総時間(分) A(10)B(20)C(20)D(20)E(17) 87 →Min
A(10)B(20)C(20)E(10)D(12) 72 →Min
A(10)B(20)D(18)C(25)E(17) 90
★5!=5X4X3X2X1=120 通りを調べて最小値を求める
腕ずくの方法
(Brute Force Method)
組合せ爆発
(Combinatory Explosion) n n!
5 120
8 40,320
10 3,628,800
腕ずくの方法:nが大きくなるとすぐに破綻する
→無意味な組合せを排除することを考える
貪欲法(欲張りの方法) (Greedy Method)
• 後先の事は考えず,目先の事だけ考える方法
→各時点(状態)で最良事象を選択すること
• 局所的最適解の積み重ね
→全体最適になる保障はない!
→準最適解=近似解を求める方法
Greedy Method を
資源割当て問題に適用(1)
人
作業
太郎 次郎 三郎 四郎 五郎
A 10 5 7 12 8
B 14 20 15 10 15
C 18 30 20 25 22
D 35 8 18 20 12
E 20 13 8 10 17
A-
B-
C-
D-
E-
次郎
現状態で最小コスト
の(作業,人)は?
人
作業 太郎 次郎 三郎 四郎 五郎
B 14 15 10 15
C 18 20 25 22
D 35 18 20 12
E 20 8 10 17
A-次郎 5
B-四郎 10
C-太郎 18
D-五郎 12
E- 8
Greedy Method を
資源割当て問題に適用(2)
三郎
現状態で最小コスト
の(作業,人)は?
Greedy Method を続けて適用し
最小の総作業時間(近似解)を求めよ
→最適解か?
最短経路問題
(ダイクストラの方法)
• Greedy Methodにより近似解ではなく
最適解が求まる例
開始点から Tの隣接 その他の
最短経路が ノード集合 ノード集合
求まった
ノード集合
T F U ○
X
○
y
ダイクストラのアルゴリズム
①Tは始点x,FはT(最初はx)に隣接節点集合
②Fの中でxからの最小距離節点kを探す
③T追加(kの追加)
④F更新:Fの節点で,kを経由した距離の方が短かければその値に更新
⑤F追加:Uからkの隣接ノード集合をFに追加
Go to ② 終点yがTに入るまで
②-⑤を繰り返す
x
b
a
e
d
c
y
f
g
10
10
15
5
20
20
20
30
10
15
5 25
5
25
5
5
20
T F
x a(x,10), b(x,15)
x,a b(x,15),c(a,15),d(a,30),e(a,40)
x,a,b c(a,15),d(a,30),e(b,35)
x,a,b,c d(c,20),e(b,35),f(c,30),y(c,40)
x,a,b,c,d e(d,30),f(d,25),y(c,40)
x
b
a
e
d
c
y
f
g
10
10
15
5
20
20
20
30
10
15
5 25
5
25
5
5
20 T F
x,a,b,c,d e(d,30),f(d,25),y(c,40)
x,a,b,c,d,f e(d,30),y(c,40),g(f,30)
x,a,b,c,d,f,e y(c,40),g(f,30)
x,a,b,c,d,f,e,g y(g,35)
x,a,b,c,d,f,e,g,y 終了
T(到達点集合)とF(隣接点集合)を完成させよ
T(到達点集合) F(隣接点集合)
A B(A,200), D(A,550), C(A,1000)
A,B D(A,550), C(A,1000), E(B,1000)
A,B,D C(A,1000), E(D,850), H(D,1430)
A,B,D,E C(A,1000), H(E,1300)
A,B,D,E,C H(E,1300), F(C,1250),G(C,1330)
A,B,D,E,C,F H(E,1300), G(C,1330)
A,B,D,E,C,F,H
演習問題2:演習問題1を双方向性グラフ
とすればA駅~H駅への最小料金は?
T(到達点集合) F(隣接点集合)
A B(A,200), D(A,550), C(A,1000)
A,B D(A,550), C(A,1000), E(B,1000)
A,B,D C(A,670), E(B,850), H(D,1430)
A,B,D,C E(B,850), H(D,1430),F(C.920),
G(C,1000)
A,B,D,C,E H(D,1300), F(C,920), G(C,1000)
A,B,D,C,E,F H(D,1300),G(C,1000)
A,B,D,C,E,F,G H(G,1130)
平成22年度 第3回小テスト 道路(エッジ)に記した数字を移動時間(分)とする.ダイクストラ法により,地点1(赤坂)から地点8(東京)まで最短到達時間を求めよ
.
赤坂1
目黒3
広尾4
青山5
神田7
東京8
山王6
六本木2
3
4
3
4
24
8
5
34
7
1
8
平成22年度 第3回小テスト 道路(エッジ)に記した数字を移動時間(分)とする.
ダイクストラ法により,地点1(赤坂)から地点8(東京)まで最短到達時間を求めよ.
解答例
T F
1 2(1,3),3(1,4)
1,2 3(1,4),4(2,7),5(2,11)
1,2,3 4(2,7),5(2,11),6(3,11)
1,2,3,4 5(2,11),6(3,11),7(4,9)
1,2,3,4,7 5(2,11),6(7,10),8(7,12)
1,2,3,4,7,6 5(2,11),8(7,12)
1,2,3,4,7,6,5 8(7,12)
1,2,3,4,7,6,5,8 終了
地点8までの最短到達時間:12分 経路:1 -> 2 -> 4 -> 7 -> 8
線形探索アルゴリズム(1) n=10, i =0,
target=54
a[i] : target
i++
START
END
=
≠
i : n
return i return -1
<
≧
前提:配列aにn個のデータが保存
処理:target と同じデータが蓄えられている配列要素の添え字を返し,ない場合は-1を返すフローチャートを記せ
key data
table[0]
table[1]
tabel[2]
table[3]
:
:
table[n-1]
table[n]
:
:
table[199]
75 福崎慎也
101 渡邊滋之
17 大野綾子
28 川島祐毅
: :
:
:
64 仲野弘幸
番人
(sentinel)
87
番人による少し早い線形探索
三浦宏之
target = 54, i =0, a[n] = target
a[i] : target
i=i+1
START
END
=
≠
i : N
return i return -1
<
≧
番人を利用した線形探索アルゴリズム
※ループ毎に
iとn-1の比較が不要
n=10, target = 54,
i =0
a[i] : target
i=i+1
START
END
=
≠
前処理
i : N
return i return -1
<
≧
n=10, target = 54,
i =0, a[n] = target
a[i] : target
i=i+1
START
END
=
≠
前処理
i : N
return i return -1
<
≧
番人なし 番人あり
2つの線形探索アルゴリズムの比較
二分探索法(バイナリサーチ)
a[0]=1
a[1]=3
a[2]=4
a[3]=8
a[4]=13
a[5]=14
a[6]=18
a[7]=20
a[8]=21
a[9]=25
探すキーの値は 14 とする。
low→
middle→
high→
<14
a[0]=1
a[1]=3
a[2]=4
a[3]=8
a[4]=13
a[5]=14
a[6]=18
a[7]=20
a[8]=21
a[9]=25
low→
middle→
high→
>14
=middle+1
a[0]=1
a[1]=3
a[2]=4
a[3]=8
a[4]=13
a[5]=14
a[6]=18
a[7]=20
a[8]=21
a[9]=25
high→
low, middle→ =14
=middle-1
探索範囲
二分探索アルゴリズム
(半分ずつ捨てるのがポイント)
サイズnの配列key(0~n-1)
においてsを探す
① first=0, last=n-1
② mid = (first+last)/2
③ key(mid)=s -> Found
key(mid)<s -> first=mid+1 Goto ②
key(mid)>s -> last=mid-1 Goto ②
上記アルゴリズムの問題点は? 完成させよ
線形探索の計算量(比較の回数)は
最良1、最悪n、平均n/2
データ数nに対して O(n)
二分探索の計算量(比較の回数)は
2k-1≦n<2kのとき k回
つまり、データ数nに対して 約O(log2n)
線形探索の計算量は O(n)
二分探索の計算量は O(log2 n)
n=1,000だったら?
n=1,000
log2n=約10 (なぜなら210=1,024)
100倍違う!
定数係数が少しくらい違ったって、
勝負は明らか!
ビッグO のグラフ化
N 5 10 15 20 25
O(2n) 32 1024 32768 1048576 33554432
O(N2) 25 100 225 400 625
O(NlogN) 3.49 10 17.64 26.02 34.94
O(N) 5 10 15 20 25
O(logN) 0.69 1 1.17 1.30 1.39
O(1) 1 1 1 1 1