Jenov alogritam

S Vikipedije, slobodne enciklopedije

Jenov algoritam računa K-najkraćih putanja bez ciklova u grafu sa jednim izvorom i ne-negativnim cenama grana.[1] Algoritam je objavljen 1971. od strane Đin J. Jena i koristi bilo koji algoritam za traženje najkraćeg puta u grafu da pronađe najbolju putanju, a zatim nastavlja da pronađe K-1 odstupanja od najbolje putanje.[2]

Algoritam[uredi | uredi izvor]

Terminologija i oznake[uredi | uredi izvor]

Oznaka Opis
Veličina grafa, tj. broj čvorova u grafu.
-ti čvor grafa, gde uzima vrednosti od do . Ovo znači da je čvor izvor, a čvor ponor grafa.
Cena grane između i , pod pretpostavkom da i .
-ta najkraća putanja od do , gde ide od do . Tada je , a je drugi čvor -te najkraće putanje, je treći čvor -te najkraće putanje, itd.
Odstupajuća putanja od kod čvora , gde ide od do . Maksimalna vrednost je , koji je čvor odmah ispred ponora u najkraćoj putanji. Ovo znači da odstupajuća putanja ne može da odstupa od najkraće putanje u ponoru. Putanje i prate isti put do -tog čvora, gde je grana ne pripada ni jednoj putanji u , i uzima vrednosti od do .
Korenska putanja od koja prati sve do -tog čvora od .
Sporedna putanja od koja počinje u -tom čvoru i završava se u ponoru.

Opis[uredi | uredi izvor]

Algoritam se može podeliti na dva dela, određivanje prve k-najkraće putanje, , a zatim, određivanje svih ostalih k-najkraćih putanja. Da bismo odredili , najkraću putanju od izvora do ponora, možemo iskoristiti bilo koji efikasni algoritam za traženje najkraćeg puta u grafu.

Da bismo pronašli , gde uzima vrednosti od do , algoritam pretpostavlja da su sve putanje od do prethodno pronađene. -to ponavljanje može biti podeljeno na dva postupka, pronalaženje svih odstupanja i odabir najkraćeg koji će postati . Obratite pažnju da u ovom ponavljanju uzima vrednosti od do .

Prvi postupak se može dodatno podeliti na tri operacije: pronalaženje , pronalaženje , a zatim dodavanje u spremište . Korenska putanja, , se odabira traženjem potputanje u koja prati prvih čvorova od , gde uzima vrednosti od do . Onda, ako je putanja pronađena, cena grane od se postavlja na beskonačno. Sledeće, sporedna putanja, , se pronalazi tako što se računa najkraća putanja od sporednog čvora do ponora. Odstranjivanje prethodno korištenih grana od do osigurava nam da je sporedna putanja različita. , zbir korenske putanje i sporedne putanje, se dodaje u . Sledeće, grane koje su uklonjene, tj. čija cena je bila postavljen na beskonačno, se vraćaju u prvobitno stanje.

Drugi postupak određuje odgovarajuću putanju za , tako što pronalazi putanju u spremištu sa najmanjom cenom. Ova putanja se uklanja iz i ubacuje u i algoritam nastavlja sa sledećim korakom. Ako je broj putanji u jednak ili veći od broja k-najkraćih putanja koje još treba pronaći, onda se tražene putanje iz dodaju u i algoritam se završava.

Pseudokod[uredi | uredi izvor]

Algoritam pretpostavlja da se koristi Dijkstra algoritam za traženje najkraćih putanja između dva čvora, ali se može iskoristiti i neki drugi algoritam.

function YenKSP(Graph, source, sink, K):
   // Одређивање најкраће путање од извора до понора
   A[0] = Dijkstra(Graph, source, sink);
   // Иницијализујемо хип у коме чувамо потенцијалну к-ту најкраћу путању
   B = [];
   
   for k from 1 to K:
       // Споредни чвор је из опсега од првог од претпоследњег у најкраћој путањи
       for i from 0 to size(A[k − 1]) − 1:
           
           // Споредни чвор се узима преходне к-најкраће путање, k − 1.
           spurNode = A[k-1].node(i);
           // Низ чворова од извора до споредног чвора претходне к-најкраће путање
           rootPath = A[k-1].nodes(0, i);
           
           for each path p in A:
               if rootPath == p.nodes(0, i):
                   // Уклонити везе које су део претходне најкраће путање које деле исту коренску путању
                   remove p.edge(i, i + 1) from Graph;
           
           // Израчунати споредну путању од споредног чвора до понора
           spurPath = Dijkstra(Graph, spurNode, sink);
           
           // Цела путања настаје спајање коренске путање и споредне путање
           totalPath = rootPath + spurPath;
           // Додати потензијалну к-најкраћу путању на хип
           B.append(totalPath);
           
           // Вратити гране које су уклоњене из графа
           restore edges to Graph;
       
       // Сортирати потенцијалне к-најкраће путање по цени.
       B.sort();
       // Путања најмање цене постаје к-та најкраћа путања
       A[k] = B[0];
   
   return A;

Primer[uredi | uredi izvor]

Jenov algoritam, K=3, C do H
Jenov algoritam, K=3, C do H

Ovaj primer koristi Jenov algoritam da izračuna 3 najkraće putanje od to . Dijkstrin algoritam je iskoršćen da se izračuna najbolja putanja od to , koja je sa cenom od 5. Ova putanja je dodata u i postaje prva k-ta najkraća putanja, .

Čvor od postaje sporedni čvor sa korenskom putanjom sačinjenom od samog sebe, . Grana se uklanja, jer se poklapa sa korenskom putanjom i putanjom u . Dijkstra se koristi da se izračuna sporedna putanja koje je , sa cenom 8. se dodaju u kao potencijalna k-najkraća putanja.

Čvor iz postaje sporedni čvor sa . Grana se uklanja jer se poklapa sa korenskom putanjom i putanjom u . Dijkstra se koristi za izračunavanje sporedne putanje , koja je , sa cenom 7. se dodaje u kao potencijalna k-najkraća putanja.

Čvor iz postaje sporedni čvor sa . Grana se uklanja jer se poklapa sa korenskom putanjom i putanjom u . Dijkstra se koristi za izračunavanje sporedne putanje , koja je , sa cenom 8. se dodaje u kao potencijalna k-najkraća putanja.

Od tri putanje u , je odabrana da postane , jer ima najmanju cenu od 7. Ovaj proces se nastavlja do 3. k-te najkraće putanje. Međutim, u trećem ponavljanju, neke sporedne putanje ne postoje, a putanja koja je odabrana da postane je .

Osobine[uredi | uredi izvor]

Prostorna složenost[uredi | uredi izvor]

Da bi se čuvale grane grafa, lista najkraćih putanja i lista potencijalnih najkraćih putanja , potrebno je memorije. [2] U najgorem slučaju, svaki čvor je povezan sa svim ostalim i tada nam treba memorije. Samo memorije je potrebno za liste i , jer se čuva najviše putanja, maksimalne dužine .[2]

Vremenska složenost[uredi | uredi izvor]

Vremenska složenost zavisi od algoritma za traženje najkraćeg puta koji se koristi u izračunavanju sporednih putanja, pa se pretpostavlja da se koristi Dijkstra algoritam. Dijkstra ima vremensku složenost najgoreg slučaja , ali ako se koristi Fibonačijev hip ono postaje ,[3] gde je broj grana u grafu. Pošto Jenov algoritam ima poziva Dijkstrinog algoritma u računanju sporednih putanja, vremenska složenost postaje .[4]

Unapređenja[uredi | uredi izvor]

Jenov algoritam može biti unapređen korišćenjem hipa za čuvanje potencijalnih k-najkraćih putanja u listi . Korišćenjem hipa umesto liste će se poboljšati brzina, ali ne i složenost. [5] Jedan od načina za blago smanjenje složenosti je da se preskoče čvorovi koji nemaju sporedne putanje. Ovaj slučaj nastaje kada su sve sporedne putanje iz nekog sporednog čvora iskorišćene u prethodnom . Takođe, ako ima putanja minimalne dužine, u vezi sa putanjama u , onda ih možemo ubaciti u , jer više nijedna putanja neće biti kraća.

Lolerovo unapređenje[uredi | uredi izvor]

Judžin Loler je predložio modifikaciju Jenovog algoritma u kome se duplikati putanja ne izračunavaju, za razliku od originalne ideje, gde se oni izračunavaju, ali se potom odbacuju kada se ustanovi da su duplikati.[6] Ovi duplikati nastaju kada se računaju sporedne putanje za čvorove iz korena od . Na primer odstupa od u nekom čvoru . Svaka sporedna putanja gde je , koje se izračuna će biti duplikat, jer su već izračunate u ponavljanju. Zbog toga, potrebno je izračunati samo sporedne putanje za čvorove koji su deo sporedne putanje od , tj. samo gde uzima vrednosti od do . Da bi se ovo uradilo za , potrebno je negde zabeležiti gde se odvojilo od .

Reference[uredi | uredi izvor]

  1. ^ Yen, Jin Y. (1970). „An algorithm for finding shortest routes from all source nodes to a given destination in general networks”. Quarterly of Applied Mathematics. 27: 526—530. MR 0102435. 
  2. ^ a b v Yen, Jin Y. (1971). „Finding the k Shortest Loopless Paths in a Network”. Management Science. 17 (11): 712—716. 
  3. ^ Fredman, Michael Lawrence; Tarjan, Robert E. (1984). „Fibonacci heaps and their uses in improved network optimization algorithms”. 25th Annual Symposium on Foundations of Computer Science. IEEE: 338—346. doi:10.1109/SFCS.1984.715934. 
  4. ^ Bouillet 2007.
  5. ^ Brander, Andrew William; Sinclair, Mark C. A comparative study of k-shortest path algorithms. Department of Electronic Systems Engineering, University of Essex, 1995. 
  6. ^ Lawler, EL (1972). „A procedure for computing the k best solutions to discrete optimization problems and its application to the shortest path problem.”. Management Science, Theory Series. 18: 401—405. 

Literatura[uredi | uredi izvor]

  • Bouillet, Eric (2007). Path routing in mesh optical networks. Chichester, England: John Wiley & Sons. ISBN 9780470032985. 
  • Brander, Andrew William; Sinclair, Mark C. A comparative study of k-shortest path algorithms. Department of Electronic Systems Engineering, University of Essex, 1995. 

Spoljašnje veze[uredi | uredi izvor]