IZBRANI ALGORITMI
Transcription
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