組合せ爆発に対処する アルゴリズム«–/4...t f u x y...

35
組合せ爆発に対処する アルゴリズム アルゴリズム論 第4回講義 20121019(金)

Upload: lamnhi

Post on 01-Aug-2019

220 views

Category:

Documents


0 download

TRANSCRIPT

組合せ爆発に対処する

アルゴリズム

アルゴリズム論 第4回講義

2012年10月19日(金)

• 太郎から五郎の 作業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が大きくなるとすぐに破綻する

→無意味な組合せを排除することを考える

財宝を発見したらどうする?

5人グループが宝島で

財宝を発見した.各自

手に持てる宝石は両手

に2つだけ.すぐにでも

海賊が帰ってくるかも

しれない.

このグループはどうする?

貪欲法(欲張りの方法) (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

xからyへの

最短経路を求めよ

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 終了

演習問題1:A駅~H駅への最小料金は?

A

B

C

D

E

H

G

F

200

550

1000 120

330

250 120

800

300

880

130

450

T(到達点集合)とF(隣接点集合)を完成させよ

T(到達点集合) F(隣接点集合)

A B(A,200), D(A,550), C(A,1000)

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

24

34

平成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

O(1)

O(logN)

O(N)

O(NlogN) O(N2) O(2n)

ビッグオーの

グラフ化

データの登録も考えると

登録(n要素当り) 探索(1回当り)

線形探索 O(n) O(n)

二分探索 O(n2) O(log n)

クイックソートで

O(n log n)

登録1回あたりの探索回数をSとすると、

線形探索 O(n)+S・O(n)

二分探索 O(n log n)+S・O(log n)

n<<Sでないと、二分探索は有利に

ならない!

頻繁にデータ集合が変わるような応用には

二分探索は適さない