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

Terminologija i oznake

uredi
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.

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

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

Prostorna složenost

uredi

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

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

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

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
  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
  • 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