IZBRANI ALGORITMI

NIKOLA GUID
IZBRANI ALGORITMI
Fakulteta za elektrotehniko,
računalništvo in informatiko
Maribor, 2010
Kazalo
7 Aproksimacijski algoritmi
7.1 Problem pokritja vozlišč . . . . . . . . . . . . . . . .
7.2 Problem trgovskega potnika . . . . . . . . . . . . . .
7.2.1 Algoritem najbližjega soseda . . . . . . . . . .
7.2.2 Algoritem z večdelno hevristiko . . . . . . . .
7.2.3 Algoritmi, ki temeljijo na minimalnem vpetem
. . . .
. . . .
. . . .
. . . .
drevesu
7-1
7-3
7-6
7-6
7-8
7-9
Poglavje
7
Aproksimacijski algoritmi
Če je problem NP-polni, je problem eksponentni. V praksi zato često rešujemo te probleme z aproksimacijskimi algoritmi.
Če uporabljamo algoritem, katerega rezultat je samo aproksimacija dejanske optimalne rešitve, nas mora zanimati, kako natančna je ta aproksimacija. Če aproksimativna rešitev sa da vrednost kriterijske funkcije f (sa )
in eksaktna rešitev s∗ vrednost kriterijske funkcije f (s∗ ), lahko točnost
aproksimativne rešitve izrazimo kot relativno napako:
∆r (sa ) =
f (sa ) − f (s∗ )
f (sa )
=
− 1.
f (s∗ )
f (s∗ )
(7.1)
Običajno uporabljamo kot merilo točnosti sa v enačbi 7.1 samo prvi sumand,
ki ga imenujemo razmerje točnosti (accuracy ratio):
r(sa ) =
f (sa )
.
f (s∗ )
(7.2)
Razmerje točnosti za aproksimativne rešitve maksimizirajočih problemov
često računamo kot inverzno vrednost k vrednosti enačbe 7.2:
f (s∗ )
r(sa ) =
.
f (sa )
(7.3)
Pri mnogih problemih ne moremo izračunati razmerja točnosti, ker ne poznamo resnične optimalne vrednosti kriterijske funkcije. Zato je naša želja
določiti dobro zgornjo mejo od r(sa ), kar vodi do naslednje definicije.
7-2
Definicija 7.1. Polinomski aproksimacijski algoritem je c-aproksimacijski
algoritem ( c-approximation algorithm), kjer je c ≥ 1, če razmerje točnosti
aproksimacije ne preseže c za katerikoli primer problema:
r(sa ) ≤ c.
(7.4)
Najboljša (tj. najmanjša) vrednost od c, za katero velja neenakost 7.4 pri
vseh primerih problema, se imenuje razmerje učinkovitosti ( performance
ratio) algoritma, ki ga označimo z RA .
Razmerje učinkovitosti služi kot glavna metrika za kvaliteto aproksimacijskega algoritma. Naša želja je, da imajo aproksimacijski algoritmi RA
čim bližje vrednosti 1. Na nesrečo imajo nekateri aproksimacijski algoritmi
neskončno veliko razmerje učinkovitosti (RA = ∞). To sicer ne pomeni,
da takih algoritmov ne smemo uporabljati, temveč, da smo pri delu z njimi
bolj pazljivi.
7-3
7.1 Problem pokritja vozlišč
7.1
Problem pokritja vozlišč
Rečemo, da vozlišče pokriva (covers) povezave, ki izhajajo iz njega [Cormen et al., 2001].
0
Definicija 7.2. Pokritje vozlišč V ( vertex cover) za neusmerjen graf
G(V, E) je množica vozlišč, ki pokriva vse povezave E v grafu. Pokritje
0
vozlišč je v splošnem podmnožica vozlišč V ⊆ V . Za vsako povezavo (u, v)
0
0
v G velja, da je v V bodisi vozlišče u bodisi vozlišče v ali pa sta v V kar
obe vozlišči.
Definicija 7.3. Problem pokritja vozlišč ( vertex-cover problem) išče
pokritje vozlišč minimalne velikosti. Tako pokritje vozlišč imenujemo optimalno pokritje vozlišč.
Omenjeni problem je NP-poln, kar pomeni, da ima eksponentno časovno
zahtevnost. Izkaže se, da pa ni težko rešiti pokritja vozlišč, ki je približno
optimalno. Obravnavani aproksimacijski algoritem vrne pokritje vozlišč,
za katerega je zajamčeno, da nima več od dvakratne velikosti optimalnega
pokritja vozlišč.
Podajmo psevdokod aproksimacijske rešitve problema pokritja vozlišč:
APPROX-VERTEX-COVER(G)
1 C ← ∅ % izprazni množico pokritja vozlišč
0
0
2 E ← E[G] % kopiraj povezave od G v množico E
0
3 while E 6= ∅
0
4
do izberi poljubno povezavo (u, v) iz E
5
C ← C ∪ {u, v}
0
6
odstrani iz E vsako povezavo, ki je povezana bodisi
z u bodisi z v
7 return C
Spremenljivka C je množica vozlišč, ki predstavlja pokritje vozlišč. V
vrstici 1 množico C izpraznimo. V vrstici 2 naredimo kopijo množice
0
povezav E[G] in jo označimo z E . V zanki while (vrstice 3–6) ponavljajoče
0
jemljemo povezave iz E , dodamo njeni krajišči u in v v C in odstranimo
0
vse povezave v E , ki že pokrivajo bodisi u bodisi v. Časovna zahtevnost
algoritma je O(E).
7.1 Problem pokritja vozlišč
7-4
Zgled 1:
Delovanje algoritma APPROX-VERTEX-COVER ponazarja slika 7.1. Vhodni
graf G na sliki 7.1a ima 7 vozlišč in 8 povezav. Algoritem izbere naključno,
na primer, prvo povezavo (b, c) (na sliki 7.1b označena poudarjeno). Nato
vozlišči b in c v vrstici 5 (prikazani s svetlo barvo) dodamo množici C.
Izbrana povezava (b, c), kot tudi povezave (a, b), (c, e) in (c, d) (prikazane s
0
prekinjeno črto) se v vrstici 6 odstranijo iz E , saj so te povezave dotikajo
bodisi z vozliščem b bodisi z vozliščem c. Položaj na koncu prve iteracije
zanke while prikazuje slika 7.1c. V “igri” so še štiri povezave.
Denimo, da v drugem ciklu izberemo povezavo (e, f ) (slika 7.1d). Vo0
zlišči e in f gresta v C, medtem ko iz E odstranimo povezave (e, f ), (e, d)
in (f, d) (slika 7.1e).
Ostane nam še samo ena povezava, tj. (d, g), ki se izbere v tretjem ciklu
0
zanke while (slika 7.1f). Vozlišči d in g gresta v C. Množico E zapusti
0
še zadnja povezava, kar pomeni, da je E = ∅ in zanka while se zaključi.
Položaj na koncu tretje iteracije zanke while prikazuje slika 7.1g. Algoritem
APPROX-VERTEX-COVER nam vrne množico C kot pokritje vozlišč, ki vsebuje
šest vozlišč: b, c, d, e, f, g (slika 7.1g).
Če bi v drugi iteraciji izbrali povezavo (e, d), bi zajeli vse štiri preostale
povezave. V tem primeru bi množica C vsebovala štiri vozlišča: b, c, e, d
(slika 7.1h).
Optimalno pokritje vozlišč za ta problem vsebuje samo tri vozlišča b, d, e
(slika 7.1i). ♦
7.1 Problem pokritja vozlišč
Slika 7.1: Delovanje algoritma APPROX-VERTEX-COVER
7-5
7.2 Problem trgovskega potnika
7.2
7-6
Problem trgovskega potnika
Problem trgovskega potnika smo eksaktno rešili z dinamičnim programiranjem (pri predmetu Algoritmi in podatkovne strukture in pri predmetu
Osnove algoritmov) in s strategijo razveji-in-omeji (pri predmetu Osnove
algoritmov). V tem razdelku bomo spoznali le nekaj aproksimacijskih algoritmov, saj jih literatura pozna na ducate [Levitin, 2007].
7.2.1
Algoritem najbližjega soseda
To je preprosti algoritem požrešne tehnike, ki temelji na hevristiki najbližjega soseda. Trgovski potnik vedno obišče najbližjega še neobiskanega
soseda.
TSP-NEAREST-NEIGHBOR(G)
1 za izhodišče izberi poljubno vozlišče
2 while niso obiskana vsa vozlišča
3
do pojdi v najbližje neobiskano vozlišče od nazadnje
obiskanega vozlišča
4 vrni se v izhodišče
Slika 7.2: Polni graf s 4 vozlišči
Zgled 2:
Primer grafa kaže slika 7.2. Naj bo vozlišče a začetno vozlišče. Algoritem
najbližjega soseda nam da naslednji Hamiltonov obhod (tour ) sa : a − b −
c − d − a z dolžino 1 + 2 + 1 + 6 = 10.
7-7
7.2 Problem trgovskega potnika
Optimalna rešitev je obhod s∗ : a−b−d−c−a z dolžino 1+3+1+3 = 8.
Razmerje točnosti dane aproksimacije je:
r(sa ) =
f (sa )
10
=
= 1.25.
∗
f (s )
8
Obhod sa je 25 % daljši kot optimalni obhod s∗ . ♦
Na nesrečo razen preprostosti, ne moremo povedati nič dobrega o tem
algoritmu. Slaba stran je, na primer, da se lahko na koncu vrne v izhodišče
po zelo dolgi povezavi. Spremenimo utež povezave (a, d) iz 6 na poljubno
veliko vrednost w ≥ 6. Sedaj je ta obhod dolžine 4 + w, medtem ko je
optimalna rešitev še vedno dolžine 8. Sedaj imamo:
r(sa ) =
f (sa )
4+w
=
,
∗
f (s )
8
kar ne pomeni nič dobrega za to metodo, saj je razmerje učinkovitosti RA =
∞.
7.2 Problem trgovskega potnika
7.2.2
7-8
Algoritem z večdelno hevristiko
TSP-MULTIFRAGMENT-HEURISTIC(G)
1 Uredi povezave v naraščajočem vrstnem redu glede na uteži.
Inicializiraj množico povezav v obhodu na 0.
2 while obhod nima velikosti n
3
do Dodaj naslednjo povezavo iz urejenega seznama povezav
v množico povezav v obhodu. Pri tem ne tvori vozlišča
stopnje 3 ali cikla z dolžino manj kot n, drugače
preskoči povezavo.
4 return množica povezav v obhodu
Ta algoritem nam na isti sliki 7.2 da množico povezav [(a, b), (c, d), (b, c),
(a, d)]. Ta množica povezav tvori isti obhod, kot ga je tvoril algoritem
najbližjega soseda. V splošnem algoritem z večdelno hevristiko proizvede
boljše obhode kot algoritem najbližjega soseda. Toda razmerje učinkovitosti
algoritma z večdelno hevristiko je tudi neomejeno (RA = ∞).
Veliko večino praktičnih aplikacij problema trgovskega potnika predstavljajo evklidski grafi, ki imajo naslednji lastnosti:
• trikotniško neenakost (triangle inequality):
d[i, j] ≤ d[i, k] + d[k, j], za poljubne i, j, k.
To pomeni, da razdalja med mestoma i in j ne more preseči dolžine
poti med mestom i, mestom k in j.
• simetrijo (symmetry):
d[i, j] = d[j, i], za kateri koli par i in j.
7.2 Problem trgovskega potnika
7.2.3
7-9
Algoritmi, ki temeljijo na minimalnem vpetem
drevesu
Obstajajo aproksimacijski algoritmi za problem trgovskega potnika, ki izkoriščajo povezavo med Hamiltonovimi cikli in vpetimi drevesi v istem grafu.
Če odstranimo eno povezavo iz Hamiltonovega cikla, dobimo vpeto drevo.
Zato lahko pričakujemo, da struktura minimalnega vpetega drevesa daje
dobro osnovo za izgradnjo aproksimacije najkrajšega obhoda.
a) Algoritem z dvakratnim obhodom drevesa
Podajmo psevdokod algoritma, ki implementira to idejo na direkten način:
TSP-TWICE-AROUND-THE-TREE ALGORITHM(G)
1 Tvori minimalno vpeto drevo grafa.
2 Začni v poljubnem vozlišču, izvrši sprehod okoli minimalnega
vpetega drevesa, tako da zabeležiš vsa vozlišča, ki jih
obiščeš.
3 Odstrani iz seznama obiskanih vozlišč vse ponavljajoče
nastope istega vozlišča razen začetnega vozlišča.
Vozlišča, ki ostanejo v seznamu, tvorijo Hamiltonov cikel,
ki predstavlja izhod algoritma.
7-10
7.2 Problem trgovskega potnika
Zgled 3:
Slika 7.3: Algoritem z dvakratnim obhodom drevesa: a) graf, b) sprehod
okoli minimalnega vpetega drevesa z dvema premostitvama
Uporabimo algoritem nad grafom na sliki 7.3a. Minimalno vpeto drevo
danega grafa tvorijo povezave (a, b), (b, c), (b, d) in (d, e) (slika 7.3b). Dvakratni obhod drevesa, ki začne in konča v a, je
a, b, c, b, d, e, d, b, a.
Če odstranimo drugi b (premostitev iz c v d), drugi d in tretji b (premostitev
iz e v a), dobimo Hamiltonov cikel
a, b, c, d, e, a
z dolžino 4 + 6 + 10 + 7 + 12 = 39. ♦
Obhod, ki ga dobimo, ni optimalen. Ker ne poznamo dolžine optimalne
poti, ne moremo izračunati razmerja točnosti. Če je graf evklidski, tako
oceno lahko naredimo. Velja naslednji izrek:
Izrek 7.1. Algoritem z dvakratnim obhodom drevesa je 2-aproksimacijski
algoritem za problem trgovskega potnika z evklidskimi razdaljami.
7.2 Problem trgovskega potnika
7-11
b) Christofidesov algoritem
Najprej ponovimo dve definiciji in izrek:
Definicija 7.4. Sklenjeni sprehod ali obhod ( tour) v grafu G je zaporedje
povezav in vozlišč grafa G oblike v1 e1 v2 e2 ..vk ek v1 (vi ∈ V, ei ∈ E). Če so
vse povezave obhoda različne, potem ga imenujemo enostavni obhod ali
sklenjena sled. Če so v obhodu vse povezave in vozlišča različna, potem ga
imenujemo cikel.
Definicija 7.5. Povezani graf je Eulerjev, če obstaja enostaven obhod, ki
vsebuje vse povezave grafa. Tak obhod imenujemo Eulerjev obhod.
Izrek 7.2. Graf G je Eulerjev graf, če je vsako vozlišče v G sode stopnje.
Christofidesov algoritem je aproksimacijski algoritem za problem evklidskega trgovskega potnika. Najprej tvori minimalno vpeto drevo. Vozliščem,
ki imajo liho stopnjo, doda povezave. Dovoljene so tudi podvojitve istih povezav med lihimi vozlišči. Izmed več možnosti izbere tiste dodane
povezave, katerih vsota uteži je minimalna. Na ta način dobimo Eulerjev graf, ki je v splošnem multigraf (to pomeni, da posamezne dele grafa
povezuje le eno vozlišče).
V Eulerjevem grafu nato algoritem poišče Eulerjev obhod, ki ga transformira v Hamiltonov cikel s premostitvami, tako kot to naredi algoritem z
dvakratnim obhodom drevesa v zadnjem koraku.
7.2 Problem trgovskega potnika
7-12
Zgled 4:
Izvedimo Christofidesov algoritem na istem grafu kot algoritem z dvakratnim obhodom drevesa (slika 7.4a). Minimalno vpeto drevo grafa je prikazano
na sliki 7.4b (povezave, ki so narisane s polno črto). Vpeto drevo ima štiri
vozlišča z liho stopnjo: a, b, c in e.
Če vpetemu drevesu dodamo dve povezavi (a, b) in (c, e) (povezavi, ki sta
narisani s prekinjeno črto), ki povežeta dva para lihih vozlišč, dobimo graf,
v katerem so vsa soda vozlišča (slika 7.4b). Utež obeh dodatnih povezav je
4 + 11 = 14.
Vpetemu drevesu lahko dodamo dve povezavi (a, c) in (b, e) (povezavi,
ki sta narisani s prekinjeno črto) in spet dobimo graf, v katerem so vsa soda
vozlišča (slika 7.4c). Utež obeh dodatnih povezav je 8 + 9 = 17.
Vpetemu drevesu lahko dodamo tudi dve povezavi (a, e) in (b, c) (povezavi, ki sta narisani s prekinjeno črto) in spet dobimo graf, v katerem so vsa
soda vozlišča (slika 7.4d). Utež obeh dodatnih povezav je 12 + 6 = 18.
Od vseh treh možnosti (slike 7.4b, 7.4c in 7.4d) izberemo tisto, ki ima
skupno utež dodanih povezav minimalno. To se zgodi v primeru, ko dodamo
para (a, b) in (c, e) (slika 7.4b). Graf z vključenima povezavama je sedaj
Eulerjev graf. V tem grafu poiščemo Eulerjev obhod, tako da začnemo v
vozlišču a: a−b−c−e−d−b−a. Eulerjev obhod pomeni, da se sprehodimo
po vseh povezavah grafa natanko enkrat, čeprav obiščemo kakšno vozlišče
dvakrat (v našem primeru vozlišče b).
Z uvedbo ene premostitve (povezava (d, a)) nam ni treba več obiskati
vozlišča b dvakrat in dobimo Hamiltonov cikel a − b − c − e − d − a dolžine
= 4 + 6 + 11 + 7 + 9 = 37 (slika 7.4e). ♦
V literaturi so izračunali, da je razmerje učinkovitosti Christofidesovega
algoritma na evklidskih grafih enako 1.5. To je dosti bolje kot pri algoritmu
z dvakratnim obhodom drevesa.
7.2 Problem trgovskega potnika
7-13
Slika 7.4: Christofidesov algoritem: a) graf, b) minimalno vpeto drevo z
dodanima povezavama (s prekinjeno črto), c) minimalno vpeto
drevo z drugim parom dodanih povezav, d) minimalno vpeto
drevo s tretjim parom dodanih povezav, e) Hamiltonov cikel
7.2 Problem trgovskega potnika
7-14
c) Lokalne iskalne hevristike
Pri evklidskih grafih lahko dosežemo dobro aproksimacijo z algoritmi z iterativnim izboljševanjem, ki jih imenujemo lokalne iskalne hevristike, izmed katerih so najbolj znane 2-opt, 3-opt in Lin-Kernighanov algoritem. Ti
algoritmi začnejo z nekim začetnim obhodom, ki ga zgradimo npr. naključno
ali z nekim preprostim aproksimacijskim algoritmom, kot je najbližji sosed.
Pri vsaki iteraciji algoritem izhaja iz tekočega obhoda, tako da nadomesti
nekaj povezav v njem z drugimi povezavami. Če sprememba povezav tvori
krajši obhod, ga algoritem postavi za nov tekoči obhod in postopek se
ponavlja na isti način. Če ne najdemo več boljšega obhoda, algoritem konča
in vrne zadnji obhod.
Algoritem 2-opt dela tako, da odstrani par nesosednih povezav v obhodu
in ponovno poveže njihova krajišča z različnimi pari povezav. Na ta način
dobimo druge obhode (slika 7.5). To operacijo imenujemo 2-sprememba
(2-change). Obstaja samo en način ponovne povezave, ker alternativa tvori
dva nepovezana grafa.
Slika 7.5: 2-sprememba: a) originalni obhod, b) novi obhod
7.2 Problem trgovskega potnika
7-15
Zgled 5:
Izhajajmo iz grafa na sliki 7.3. Začnimo z obhodom a − b − c − d − e − a, ki
ga dobimo s pomočjo metode najbližjega soseda (slika 7.6a). Dolžina tega
obhoda je lnn = 4+6+10+7+12 = 39. Če zamenjamo par povezav (a, b) in
(c, d) s parom (a, c) in (b, d), dobimo obhod a − c − b − d − e − a na sliki 7.6b,
ki ima dolžino l = 9+6+8+7+12 = 42. Ker je l > lnn (42 > 39), vzamemo
drugi par, tj. (a, b) in (d, e) (slika 7.6c) in nadaljujemo z zamenjavo. Šele
v primeru zamenjave povezav (a, e) in (b, c) (7.6g), algoritem 2-opt najde
boljši obhod, saj je l < lnn (38 < 39) (7.6h). ♦
7.2 Problem trgovskega potnika
7-16
Slika 7.6: 2-spremembe iz obhoda najbližjega soseda grafa na sliki 7.3
7.2 Problem trgovskega potnika
7-17
Če želimo posplošiti notacijo 2-spremembe, lahko obravnavamo k-spremembo za katerikoli k ≥ 2. Ta operacija nadomesti do k povezav v tekočem
obhodu. V praksi so zanimive samo 3-spremembe. Dve glavni možnosti 3sprememb kaže slika 7.7.
Slika 7.7: 3-spremembe: a) originalni obhod, b) nov obhod, c) nov obhod
7-18
7.2 Problem trgovskega potnika
Obstaja več drugih algoritmov z lokalno kontrolo za problem trgovskega
potnika. Najpomembnejši izmed njih je Lin-Kernighanov algoritem, ki
daje najkvalitetnejše aproksimacije optimalnih obhodov. Lin-Kernighanov
algoritem je algoritem spremenljivka-opt (variable-opt): njegov premik
lahko smatramo kot premik 3-opt, ki mu sledi zaporedje premikov 2-opt.
Zaradi njegove kompleksnosti ga ne bomo obravnavali.
Izkustveni rezultati
V zadnjih petdesetih letih se je problem trgovskega potnika proučeval intenzivno. Raziskave so bile vzpodbujene zaradi čisto teoretičnega zanimanja
in tudi praktičnih potreb v aplikacijah, kot so izdelava VLSI-čipov, kristalografija z X-žarki in genetski inženiring.
Kako lahko rečemo, kako dobra ali slaba je aproksimativna rešitev, če
ne poznamo dolžine optimalne rešitve. Običajna pot, ki premaga to težavo,
je v rešitvi problema linearnega programiranja, ki opisuje primer, tako da
ignorira omejitve popolnosti. To omogoča spodnja meja, imenovana HeldKarpova meja na dolžini najkrajšega obhoda. Held-Karpova meja je
običajno zelo blizu dolžini optimalnega obhoda (manj kot 1 %). Mejo lahko
izračunamo v sekundah ali minutah, če primeri niso zelo obsežni. Tako za
obhod sa , ki ga dobimo z neko hevristiko, ocenjujemo razmerje točnosti
r(sa ) = f (sa )/f (s∗ ) z razmerjem
f (sa )
,
H(s∗ )
kjer je f (sa ) dolžina hevrističnega obhoda sa in H(s∗ ) Held-Karpova spodnja
meja dolžine najkrajšega obhoda.
7-19
7.2 Problem trgovskega potnika
Preglednica 7.1 kaže rezultate obsežne izkustvene študije, ki sta jo opravila D. S. Johnson in L. A. McGeoch leta 2002. V njej je prikazana povprečna kvaliteta obhoda in čas izvajanja pri obravnavanih hevristikah. Primeri
so imeli 10000 vozlišč, ki so tvorjena naključno in enakomerno s celoštevilskimi koordinatami v ravnini z evklidskimi razdaljami, ki so zaokrožena na
najbližje celo število.
Preglednica 7.1: Povprečna kvaliteta obhoda in čas izvajanja za različne
hevristike na 10000 naključno tvorjenih vozlišč z evklidskimi razdaljami
hevristika
najbližji sosed
večdelna hevristika
Christofides
2-opt
3-opt
Lin-Kernighan
% presežka nad
Held-Karpovo mejo
24.79
16.42
9.81
4.70
2.88
2.00
čas izvajanja
[s]
0.28
0.20
1.04
1.41
1.50
2.06