Univerza v Ljubljani
Fakulteta za računalnǐstvo in informatiko
Fakulteta za matematiko in fiziko
Tinkara Toš
Algoritmi nad grafi v jeziku linearne
algebre
DIPLOMSKO DELO
UNIVERZITETNI ŠTUDIJSKI PROGRAM PRVE STOPNJE
RAČUNALNIŠTVO IN MATEMATIKA
Mentor: doc. dr. Tomaž Dobravec
Ljubljana 2012
Rezultati diplomskega dela so intelektualna lastnina avtorja in Fakultete za računalnǐstvo
in informatiko Univerze v Ljubljani. Za objavljanje ali izkorǐsčanje rezultatov diplom-
skega dela je potrebno pisno soglasje avtorja, Fakultete za računalnǐstvo in informatiko
ter mentorja.
original izdane teme diplomskega dela
Izjava o avtorstvu diplomskega dela
Spodaj podpisana Tinkara Toš, z vpisno številko 63090185, sem avtorica diplom-
skega dela z naslovom:
Algoritmi nad grafi v jeziku linearne algebre
S svojim podpisom zagotavljam, da:
• sem diplomsko delo izdelala samostojno pod mentorstvom doc. dr. TomažaDobravca,
• so elektronska oblika diplomskega dela, naslov (slov., angl.), povzetek (slov.,angl.) ter ključne besede (slov., angl.) identični s tiskano obliko diplomskega
dela,
• soglašam z javno objavo elektronske oblike diplomskega dela v zbirki ”DelaFRI”.
V Ljubljani, dne 17. avgusta 2012 Podpis avtorice:
Kazalo
Povzetek
Abstract
1 Predstavitev 1
1.1 Motivacija, cilji . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
2 Definicije in zapisi 3
2.1 Definicije . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2.2 Zapisi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
3 Redke matrike 11
3.1 Definicija in opis . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
3.2 Teorija grafov . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3.3 Shranjevanje redkih matrik . . . . . . . . . . . . . . . . . . . . . . . 15
3.4 Operacije na redkih matrikah . . . . . . . . . . . . . . . . . . . . . 21
3.5 Cilj uporabe redkih matrik . . . . . . . . . . . . . . . . . . . . . . . 24
4 Linearna algebra matrik in vektorjev 25
4.1 Vektorji v prostoru . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
4.2 Matrike . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
5 Algoritmi 31
5.1 BFS - iskanje v širino . . . . . . . . . . . . . . . . . . . . . . . . . . 31
5.2 Algoritem minimalne poti . . . . . . . . . . . . . . . . . . . . . . . 34
KAZALO
5.3 Bellman-Fordov algoritem . . . . . . . . . . . . . . . . . . . . . . . 41
5.4 Floyd-Warshallow algoritem . . . . . . . . . . . . . . . . . . . . . . 51
5.5 Primov algoritem . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
6 Testiranje algoritmov 63
6.1 Uvod v testiranje . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
6.2 Množenje matrike z vektorjem . . . . . . . . . . . . . . . . . . . . . 64
6.3 Iskanje v širino (BFS algoritem) . . . . . . . . . . . . . . . . . . . . 68
6.4 Iskanje minimalnih poti . . . . . . . . . . . . . . . . . . . . . . . . 73
6.5 Bellman-Fordov algoritem . . . . . . . . . . . . . . . . . . . . . . . 77
6.6 Floyd-Warshallov algoritem . . . . . . . . . . . . . . . . . . . . . . 84
6.7 Primov algoritem . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
7 Zaključek 95
Povzetek
Diplomsko delo predstavlja uporabnost dualnosti med grafom in njegovo sosedno
matriko. V teoretičnem delu predstavi osnove teorije grafov in matrične algebre,
predvsem se osredotoči na redke matrike in možnosti zapisov le-teh, ki upoštevajo
število neničelnih elementov matrike. V delu so predstavljene operacije na redkih
matrikah, preko katerih se naveže algoritme, ki v osnovi delujejo na grafih, a jih
s pomočjo dualnosti grafa in matrike lahko spremenimo v zaporedje operacij na
matrikah.
V nadaljevanju delo podrobneje predstavi nekaj algoritmov na grafih ter njihove
komplementarne interpretacije na matrikah, ki v nadaljevanju postanejo predmet
raziskovanja. Opisana je implementacija teh algoritmov v programskem jeziku
Java in v nadaljevanju testiranje delovanja algoritmov na matrikah.
Pri praktičnem delu je poudarek na primerjavi med delovanjem teh algoritmov, ki
uporabljajo standardni zapisa matrike s poljem, ter različico, ki uporablja zapis
redke matrike. V delu je raziskano tudi, kdaj je katera različica bolǰsa oziroma
slabša.
Ključne besede
Matrika, sosedna matrika, matrika cene, redka matrika, teorija grafov, iskanje v
širino, minimalne poti, Bellman-Fordov algoritem, Floyd-Warshallov algoritem,
minimalno vpeto drevo, Primov algoritem.
Abstract
The thesis presents usefulness of duality between graph and his adjacency ma-
trix. The teoretical part provides the basis of graph theory and matrix algebra
mainly focusing on sparse matrices and options of their presentation witch takes
into account the number of nonzero elements in the matrix. The thesis includes
presentation of possible operations on sparse matrices and algorithms that basi-
cally work on graphs, but with help of duality between graph and his adjacency
matrix can be presented with sequence of operations on matrices.
Practical part presents implementation of some algorithms that can work both
with graphs or their adjacency matrices in programming language Java and testing
algorithms that work with matrices.
It focuses on comparison in efficiency of algorithm working with matrix written
in standard mode and with matrix written in format for sparse matrices. It also
studies witch presentation of matrices works beter for witch algorithm.
Keywords
Matrix, adjacency matrix, sparse matrix, grapg theory, breath first search, min-
imum path, Bellman-Ford algorithm, Floyd-Warshall algorithm, minimum span-
ning tree, Prim’s algorithm.
Poglavje 1
Predstavitev
1.1 Motivacija, cilji
Dualnost med kanonično predstavitvijo grafov kot abstraktno kolekcijo vozlǐsč in
povezav ter redko sosedno matriko je del teorije grafov vse od njenega začetka,
matrična algebra pa je pri predstavitvi te dualnosti lahko zelo uporaben pri-
pomoček. Vseeno se matrike tradicionalno niso uporabljale za praktično računanje
z grafi, predvsem zato, ker predstavitev matrike kot 2-dimenzionalna tabela ni
najučinkoviteǰsa predstavitev redkega grafa. Z razvojem in večanjem učinkovitosti
podatkovnih struktur in algoritmov za redka polja in matrike je postalo mogoče
razviti praktičen pristop, povezan s polji za izvajanje operacij na velikih redkih
matrikah.
Vsak problem na matrikah je problem na grafih in vsak problem na grafih je
problem na matrikah.
Ta dualnost je osnovni koncept pri algoritmih, ki delujejo na grafih, prestavljenih
z matrikami.
Ker so matrike postale zelo primeren način za predstavitev grafov, so na primer v
MATLABU matrike postale najpogosteje uporabljena struktura za reševanje pro-
blemov, povezanih z grafi. Veliko raziskovalnih skupin gradi knjižnice za paralelne
algoritme na grafih s pomočjo redkih matrik.
Naša naloga v tem diplomskem delu bo preučiti nekaj algoritmov na grafih, pred-
1
2 POGLAVJE 1. PREDSTAVITEV
stavljenih z matrikami, ter možne načine zapisa redkih matrik in gostih matrik ter
operacij na le-teh. Ugotovili bomo, kateri algoritmi, operacije in zapisi matrik so
časovno najmanj potratni.
Predvidevam, da bo na učinkovitost algoritmov poleg velikosti matrik vplivala tudi
uporaba zapisa redke matrike.
Naš cilj bo ugotoviti, ne samo kateri zapis redke matrike je manj časovno potraten,
ampak tudi kdaj, saj predvidevam, da se bodo na različnih matrikah različni zapisi
matrik obnašali različno.
Poglavje 2
Definicije in zapisi
2.1 Definicije
Definicija KOLOBAR je množica K z dvema računskima operacijama, ki ju za-
radi preprostosti imenujemo seštevanje in množenje, ni pa nujno, da pomenita
klasično seštevanje in množenje. Označimo ju z znakoma + (plus) in * (krat). Za
poljubne elemente kolobarja a,b,c mora veljati [9] :
• a+ b = b+ a
(komutativnost za seštevanje)
• a+ (b+ c) = (a+ b) + c
(asociativnost za seštevanje)
• obstaja nevtralni element za seštevanje (označimo z oznako 0) , da veljaa+ 0 = 0 + a = a
• poljubni element a ima nasprotni element -a, tako da velja a + (−a) =(−a) + a = 0
• a ∗ (b ∗ c) = (a ∗ b) ∗ c
(asociativnost za množenje)
3
4 POGLAVJE 2. DEFINICIJE IN ZAPISI
• distributivnost iz leve in desne strani, ki povezuje seštevanje in množenje
a ∗ (b+ c) = a ∗ b+ a ∗ c
(a+ b) ∗ c = a ∗ c+ b ∗ c
Kolobar je za operacijo + Abelova grupa.
Kolobar določajo tile podatki: K množica njegovih elementov, operacija “+” ime-
novana seštevanje in “*” imenovana množenje. Če enega izmed teh podatkov
spremenimo, dobimo drug kolobar [3].
Definicija OBSEG je v abstraktni algebri ime za algebrsko strukturo, v kateri je
možno brez omejitev seštevati, odštevati, množiti in deliti (razen deljenja z 0).
Obseg je množica O z dvema računskima operacijama, ki ju zaradi preprostosti
imenujemo seštevanje in množenje in ju označimo z znakoma + (plus) in * (krat),
lahko pa ti operaciji pomenita kaj drugega kot navadno seštevanje in množenje
števil.
Da bo algebrska struktura res obseg, mora veljati:
• (O, + ,*) je kolobar
• obstaja nevtralni element za množenje, ki ga označimo z 1 (enota) in jerazličen od nevtralnega elementa za seštevanje (0)
1 ∗ a = a ∗ 1 = a
• za vsak od 0 različen element a obstaja inverzni element a−1, tako da velja:
a ∗ a−1 = a−1 ∗ a = 1
Če v nekem obsegu velja še komutativnost za množenje (a ∗ b = b ∗ a), potem jeto komutativni obseg [9].
Definicija Naj bo V množica in F obseg (na primer obseg realnih ali kompleksnih
števil) in naj bosta definirani naslednji operaciji:
- operacija vektorske vsote ali seštevanja vektorjev, označena kot v + w (kjer sta
v, w ∈ V )
2.1. DEFINICIJE 5
- operacija množenja s skalarjem, označena z a ∗ v (kjer je v ∈ V in a ∈ F )Množico V tedaj po definiciji imenujemo VEKTORSKI PROSTOR nad obsegom
F, če veljajo naslednje značilnosti [9] :
• če v, w ∈ V , potem tudi v + w ∈ V
(z drugimi besedami: V je zaprta za seštevanje vektorjev)
• u+ (v + w) = (u+ v) + w
(asociativnost seštevanja vektorjev v V)
• v množici V obstaja nevtralni element 0, da za vse elemente v ∈ V veljav + 0 = v
(obstoj aditivne identitete v V)
• za vsak v ∈ V obstaja element w ∈ V , da je v + w = 0
(obstoj nasprotnih vrednosti v V)
• v + w = w + v
(komutativnost vektorske vsote v V)
• a ∗ v ∈ V
(zaprtost V za množenje s skalarjem)
• a ∗ (b ∗ v) = (ab) ∗ v
(asociativnost množenja s skalarjem v V)
• Če 1 označuje identiteto za množenje v obsegu F, potem velja 1 ∗ v = v
(nevtralnost elementa 1)
• a ∗ (v + w) = a ∗ v + a ∗ w
(distributivnost glede na seštevanje vektorjev)
• (a+ b) ∗ v = a ∗ v + b ∗ v
(distributivnost glede na seštevanje v obsegu)
6 POGLAVJE 2. DEFINICIJE IN ZAPISI
Definicija MATRIKA je v matematiki pravokotna razpredelnica števil ali v splošnem
elementov poljubnega kolobarja. V tem delu bodo elementi realna števila, če ni
drugače rečeno. Vodoravni “črti” matrike rečemo vrstica, navpični pa stolpec.
Matrika z m vrsticami in n stolpci se imenuje m x n matrika, m in n pa sta njeni
razsežnosti. Element, ki leži v i-ti vrstici in j-tem stopcu matrike (kjer vrstice in
stolpce ponavadi štejemo od 1 naprej, razen v kakšen programskem jeziku od 0
naprej), je (i,j)- ti element, v delu bomo za matriko A označili (i,j)-ti element z
ai,j. Matriko A razsežnosti m x n lahko torej definiramo s predpisom
A := (ai,j)mxn [3].
Definicija REDKA MATRIKA je matrika, ki ima več ničelnih elementov kot pa
neničelnih.
Definicija GRAF G je neprazna množica elementov, ki jih imenujemo vozlǐsča
grafa, in množica (neurejenih) parov vozlǐsč, ki jih imenujemo povezave grafa.
Množico vozlǐsč označimo z V(G) ali pa kar z V, množico povezav pa E(G)
oziroma kraǰse kar E. Če sta v in w točki grafa G, potem za povezavi vw oziroma
wv rečemo, da povezujeta točki v in w [8].
UTEŽENI GRAF je definiran kot množica vozlǐsč V= v1, v2, ...vn, množico povezav
E= (vi, vj : wij); i,j =1,2,...n, pri čemer z (vi, vj : wij) označimo povezavo, ki
povezuje vozlǐsče vi z vozlǐsčem vj, z utežmi wij, ter preslikavo W iz E v R uteženigraf pa kot G(V,E,W). Uteženi graf je lahko usmerjen ali neusmerjen, cikličen ali
necikličen [12].
USMERJEN GRAF je tisti graf, ki ima vse povezave usmerjene. Iz enega vozlǐsča
se lahko premaknemo v drugega (tako da sledimo smeri povezave), nazaj pa po
isti poti ne moremo, razen če je le-ta dvosmerna [12] .
NEUSMERJEN GRAF je tisti graf, ki nima usmerjenih povezav, če med vo-
zlǐsčema obstaja povezava, lahko gremo iz prvega v drugo vozlǐsče in tudi obratno.
CIKLIČNI GRAF je graf, ki ga sestavlja samo en cikel oziroma so vozlǐsča med
seboj povezana v zaprto verigo. Pri takem grafu je število vozlǐsč enako številu
2.1. DEFINICIJE 7
povezav in vsako vozlǐsče ima stopnjo 2. Označujemo ga z Cn, kjer je n število
vozlǐsč [9].
NECIKLIČNI GRAF je graf, pri katerem povezave ne sestavljajo nobenega cikla
(na sprehodu iz katerikoli točke se nam ne more zgoditi, da bi se vrnili v isto točko,
če se ne vrnemo po isti poti nazaj) [9] .
POVEZAN GRAF je graf, katerega vozlǐsč ne moremo razporediti v 2 skupini
tako, da med eno in drugo skupino ne bi obstajala povezava, ki bi ju povezovala.
Definicija STOPNJA VOZLIŠČA je število povezav, ki so vezane na vozlǐsče.
Pri tem se zanke štejejo dvakrat. Stopnjo oglǐsča označujemo z deg(v).
Definicija ZANKA je cikel dolžine 0 oziroma pot iz vozlǐsča v vozlǐsče samo.
Definicija DREVO je v teoriji grafov graf, v katerem sta poljubni dve vozlǐsči
povezani z natanko eno enostavno potjo. Drevo je v bistvu vsak povezan graf brez
ciklov. Gozd je nepovezana unija dreves [9].
Definicija POVEZANOST VOZLIŠČ
V neusmerjenem grafu sta vozlǐsči u in v povezani, če obstaja med njima neka
pot, kar pomeni, da lahko nekako pridemo po grafu od ene do druge.
V usmerjenem grafu sta vozlǐsči u in v [14]
• močno povezani natanko takrat, ko obstaja neka pot od u do v, in tudineka pot od v do u upoštevajoč smeri povezav;
• šibko povezani natanko takrat, ko obstaja neka pot med u in v, če zane-marimo smeri povezav.
(Krepko, šibko) povezana komponenta je množica vozlǐsč, ki so vse paroma
(krepko, šibko) med seboj povezane in v katero ne moremo dati nobene nove
točke, ne da bi preǰsnji pogoj nehal veljati [14] .
Definicija NEODVISNA MNOŽICA je neusmerjen graf oziroma množica vozlǐsč
grafa, ki so paroma neodvisne. To pomeni, da noben par vozlǐsč iz te množice
ni soseden. Neodvisna množica je največja, če ni poddmnožica katerikoli druge
neodvisne množice.
8 POGLAVJE 2. DEFINICIJE IN ZAPISI
2.2 Zapisi
MNOŽENJE
Množenje med vektorjem in matriko ali pa med dvema matrikama bomo včasih
zapisali kar z Matlab zapisom
A op1.op2 v.
Namesto vektorja (v) bi seveda lahko bila matrika (B).
Za osnovno matrično množenje bi torej veljalo op1 = + in op2 = ∗Ta zapis nam bo močno olaǰsal zapis nekaterih algoritmov.
Če na primer namesto kolobarja z operacijama + (plus) in * (krat) uporabimo
produkt v tropski algebri, kjer namesto plusa uporabimo max, namesto krat pa
+, dobimo za produkt zapis A max. + v. Še bolj prav nam bo prǐsel produkt
A min.+ v, a o tem kasneje.
GRAF
Grafe bomo zapisovali kot G=(V,E), kjer bo V množica N vozlǐsč grafa in E
množica M povezav grafa. Drug možen zapis grafa bo z matriko A, kjer je A
matrika dimenzije N x N in ima M neničelnih elementov oziroma A(i,j) (element
matrike v i-ti vrstici in j-tem stolpcu) bo različen od 0, kadar bo med vozlǐsčema i
in j obstajala povezava. Vrednost tega elementa je odvisna od tega, kaj vse želimo
z matriko na grafu predstaviti (cene povezav, obstoj povezave), zato bo pri vsakem
primeru posebej označeno, kaj natanko predstavljajo elementi matrike.
MATRIKE
Matrike lahko vsebujejo logične vrednosti B celoštevilske Z ali realne R.Zapis na primer A : R5x6x7 pove, da je A 3-dimenzionalno polje z 210 realnimielementi dimenzije 5× 6× 7.Indeksiranje A(i,j) uporabimo tudi na vektorju, v(i) pomeni i-ti element vektorja.
Indeksiranje pa lahko uporabimo tudi na izrazih,f na primer [(I − A)−1](i, j) jezapis (i,j) v inverzu matrike I-A.
Deli matrik bodo zapisani z Matlab zapisom. Na primer A(1:5;[3 1 4 1]) je matrika
dimenzije 5 x 4, ki vsebuje elemente prvih petih vrstic iz stolpcev 3 1 4 1 v tem
vrstnem redu.
2.2. ZAPISI 9
Če je I indeks ali pa množica indeksov, je A(I; : ) podmatrika iz A z vrsticami, ki
so označene v I in vsemi stolpci (znak : pomeni vsi možni)
DIMENZIJA IME PRIMER
0 skalar s
1 vektor v
2 matrika A
Tabela 2.1: Tabela algebrskih struktur in zapisov
10 POGLAVJE 2. DEFINICIJE IN ZAPISI
Poglavje 3
Redke matrike
3.1 Definicija in opis
Definicija Redka matrika je matrika, ki ima več ničelnih elementov kot pa
neničelnih.
Redke matrike lahko razdelimo na 2 vrsti, in sicer na strukturirane in nestruktu-
rirane.
• STRUKTURIRANE so tiste, pri katerih neničelni zapisi ustvarjajo nekvzorec, največkrat v obliki nekega števila diagonal. Neničelni zapisi lahko
ležijo v blokih (podmatrike) istih velikosti.
• NESTRUKTURIRANE so tiste, pri katerih nimamo pravilne postavitveneničelnih elementov.
Večina tehnik je narejenih za nestrukturirane redke matrike, tako da razlike med
tema dvema tipoma vsaj v preteklosti niso kazale na to, da bi zaradi strukturi-
ranosti ali nestrukturiranosti ti algoritmi bolje oziroma hitreje delovali. Močno
vlogo pa lahko ima ta lastnost redkih matrik pri iterativnih rešitvah problemov,
kjer je ena pomembneǰsih operacij množenje matrike z vektorjem. Učinkovitost te
operacije je lahko močno odvisna od tega ali je matrika strukturirana ali ne. Na
vektorskih računalnikih je naprimer shranjevanje matrik po diagonalah idealno,
bolj splošne sheme pa lahko trpijo, ker zahtevajo indirektno naslavljanje [5] .
11
12 POGLAVJE 3. REDKE MATRIKE
3.2 Teorija grafov
Graf je odličen za prikaz relacij med nekimi točkami, na primer naše točke so lahko
mesta; povezava med točko A in B pa pomeni, da med njima obstaja prevozna
cesta. Če pa želimo pri računanju z grafi uporabiti še linearno algebro, moramo
graf znati predstaviti z matriko, kar lahko storimo na več možnih načinov.
Ta dualnost omogoči algoritmom na grafu, da jih prestavimo kot zaporedje li-
nearnih algebraičnih operacij. Z matriko lahko predstavimo več lastnosti grafa, v
večini primerov pa graf predstavimo s trojicami (u,v,w), kar predstavlja usmerjeno
povezavo s ceno w iz vozlǐsča u do v. Ta povezava se odraža v neničelni vrednosti
w na lokaciji (u,v) v naši matriki.
Prednosti zapisa grafa z matriko [1]
• Sintaktična kompleksnost
(Veliko algoritmov na grafih postane z linearno algebro in predstavitvijo z
matrikami bolj kompaktno in lažje za razumevanje.)
• Enostavna implementacija
(S pomočjo matrik lahko algoritmi na grafih izkorǐsčajo programsko infra-
strukturo za paralelno računanje.)
• Zmogljivost
(Ker ti algoritmi bolj poudarjajo učinkovit podatkovni dostop, jih je lažje
optimizirati.)
Slika 3.1 prikazuje splošen primer dualnosti med grafom in matriko; glede na to,
kaj so X-i na sliki, pa ločimo več različnih matrik.
3.2.1 Matrika sosednosti
Usmerjen graf G=(V,E) lahko predstavimo z matriko sosednosti (ang. adjacency
matrix) A, za katero velja, da ai,j = 1 natanko takrat, ko v originalnem grafu
obstaja povezava med vozlǐsčem i in vozlǐsčem j [1]. Glede na to, da matrika
predstavlja sosede vozlǐsča, moramo definirati, ali je vozlǐsče sosed samemu sebi.
3.2. TEORIJA GRAFOV 13
Slika 3.1: Primer dualnosti med grafom in matriko
Rekli bomo, da vozlǐsče ni samemu sebi sosed, saj iz vozlǐsča i do samega sebe ne
moremo v natanko 1 koraku, do sebe ”pridemo”v 0 korakih ali pa v najmanj 2.
Zato definiramo ai,i = 0.
i-ta vrstica v matriki A nam pove, v katera vozlǐsča lahko pridemo iz vozlǐsča i v 1
koraku. Če imamo v i-ti vrstici j-ti stolpec enak 0, to pomeni, da iz i ne moremo
do j v enem koraku.
V primeru, ko so povezave obojestranske (če lahko pridemo od A do B in tudi od
B do A), dobimo simetrično matriko.
x
x
x
x
x
x
x
x
1 2
4 3
Slika 3.2: Primer matrike sosednosti za 4 točke
Transponirana matrika sosednosti
Transponirati matriko pomeni, da i-ti stolpec matrike A postane i-ta vrstica ma-
trike AT (transponirana matrika matrike A).
14 POGLAVJE 3. REDKE MATRIKE
x x x x x x x xx x x x x x x x
1
23
4
5
67
8
9
Slika 3.3: Primer matrike sosednosti za več točk
Pri transponirani matriki sosednosti i-ta vrstica pove, iz katerih vozlǐsč pridemo v
vozlǐsče i v 1 koraku.
Uporaba matrike sosednosti
S potenciranjem matrike sosednosti dobimo matriko, katere elementi predstavljajo
število poti med dvema vozlǐsčema v toliko korakih, kakršna je potenca (npr. s
četrto potenco matrike A dobimo informacijo o številu poti med poljubnima 2
vozlǐsčema v 4 korakih).
Trditev 3.2.1 Arij je število poti med i in j doľzine r.
Dokaz (z indukcijo)
• za r=1 trditev drži po definiciji
• r − 1 7−→: r : arij =∑n
k=1 ar−1ik akj
i
k
j
Pomoč s sliko: Seštejemo vse ar−1ik pri katerih je akj različna od 0, dobimo skupno
število vseh poti med i in j dolžine r [4].
3.3. SHRANJEVANJE REDKIH MATRIK 15
3.2.2 Matrika dosegljivosti
A je matrika sosednosti, matriko G:= A + I imenujemo matrika dosegljivosti. Če
je element matrike G gij 6= 0, to pomeni, da lahko iz vozlǐsča i do vozlǐsča j pridemov NAJVEČ enem koraku.
Trditev 3.2.2 r-ta potenca matrike G v kolobarju z operacijama ALI in IN pred-
stavlja dosegljivost v r korakih.
G�r 6= 0⇔ iz vozlǐsča i lahko pridem v vozlǐsče j v največ r korakih
Dokaz (z indukcijo)
G�r(i, j) je produkt i-te vrsticeG�r−1(i, j) in j-tega stolpca G.G�r(i, j) = ORk(G�r−1(i, k)
AND G(k,j)). Torej G�r(i, j) = 1, če lahko pridem iz i v k v r korakih in iz k v j
v enem koraku za katerikoli k [4].
3.2.3 Matrika cen
Utežen graf G=(V,E,w) predstavimo z matriko cen C, kjer za element velja:
cij =
0; i = j
wij; če med i in j obstaja povezava
∞; sicer
Matrika C oziroma element cij nam pove, koliko nas stane, da pridemo iz vozlǐsča
i v j. S to matriko si lahko pomagamo predvsem pri problemih iskanja minimalnih
poti.
1 2
1
2
3
5 4
3
2
5
3
21
0 1 ∞ 1 3∞ 0 2 ∞ ∞∞ ∞ 0 3 ∞∞ 2 ∞ 0 ∞2 ∞ ∞ 5 0
3.3 Shranjevanje redkih matrik
Pri operacijah na grafih, ki so predstavljeni z matrikami, si v največji meri poma-
gamo z redkimi matrikami, zato sta seveda uspešnost in časovna zahtevnost takih
16 POGLAVJE 3. REDKE MATRIKE
algoritmov odvisna od implementacije in shranjevanja redkih matrik. Naš osnovni
cilj pri redkih matrikah je učinkovito shranjevanje, saj ima malo neničelnih ele-
mentov. Naša ideja temelji na tem, da shranjujemo le neničelne elemente in ne cele
matrike s pripadajočim velikim številom ničel. Želimo, da bi velikost porabljenega
prostora bila proporcionalna s številom neničelnih elementov in ne z velikostjo cele
matrike.
Primeri bodo prikazani na matriki:
A =
1 0 0 2 0
3 4 0 5 0
6 0 7 8 9
0 0 10 11 0
0 0 0 0 12
3.3.1 CSR ZAPIS (Compressed Storage by Rows)
CSR zapis (Compressed Storage by Rows) shranjuje neničelne elemente, ki so
urejeni v odvisnosti od svoje pozicije v matriki po vrsticah, torej elementi so
shranjeni po vrsti, po vrsticah in v vsaki vrstici po stolpcih od leve proti desni.
Shraniti moramo 3 polja data, ind in poin. Data je polje z realnimi elementi
matrike, ki so urejeni po vrsti po vrsticah kot ležijo v matriki. Ind vsebuje naravna
števila, ki predstavljajo indekse stolpcev elementov. Data in ind sta povezana tako,
da ima element i iz data shranjen svoj indeks stolpca v i-tem elementu polja ind.
(če data[k] = aij, potem je ind[k]=j) Poin pa shranjuje indeks elementa v data,
s katerim se začne posamezna vrstica, npr na prvem mestu polja poin bo indeks
elementa v data, s katerim se začne prva vrstica matrike. Poin je vedno dolžine
n+1, kjer je n dimenzija matrike, za n+1 polje določimo nnz + 1, kjer je nnz
število neničelnih elementov v matriki.
Prihranek prostora pri shranjevanju v tem zapisu je precej opazen, saj namesto n2
polj potrebujemo le 2nnz + n + 1 polj.
Pri simetričnih matrikah lahko še bolj prihranimo, saj lahko shranjujemo le zgornji
trikotnik matrike, težava je le v tem, da s takim zapisom matrike težko računamo
oziroma so algoritmi veliko bolj kompleksni.
3.3. SHRANJEVANJE REDKIH MATRIK 17
CSR zapis je precej splošen, ne potrebujemo nobenih predpostavk o redkosti ma-
trike, da ga lahko uporabimo, in ne shranjujejo nobenih nepotrebnih polj; njegova
pomanjkljivost je, da potrebujemo indirektno naslavljanje polj na skoraj vsakem
koraku uporabe [5] [1].
data 1 2 3 4 5 6 7 8 9 10 11 12
ind 1 4 1 2 4 1 3 4 5 3 4 5
poin 1 3 6 10 12 13
Slika 3.4: Primer CSR zapisa na matriki A
3.3.2 CSC ZAPIS (Compressed Storage by Columns)
CSC zapis je variacija CSR zapisa . V bistvu je CSC zapis CSR zapis, ki namesto
z vrsticami vrstni red elementov določa s stolpci. Lahko bi rekli, da je CSC CSR
zapis za AT . V data shranjujemo vrednosti matrike po stolpcih od levega proti
desnemu, v vsakem stolpcu pa od zgoraj navzdol. Ind shranjuje zaporedno številko
vrstice, v kateri se element nahaja. Povezava med data in ind ostaja enaka kot pri
CSR zapisu. Poin shranjuje indeks elementa v data, s katerim se začne posamezen
stolpec, namesto vrstice, kot pri CSR [5] [1] .
data 1 2 3 4 5 6 7 8 9 10 11 12
ind 1 1 2 2 2 3 3 3 3 4 4 5
poin 1 4 7 2 9 13
Slika 3.5: Primer CSC zapisa na matriki A
18 POGLAVJE 3. REDKE MATRIKE
3.3.3 ZAPIS KOORDINATNEGA SISTEMA (ZAPIS S
TERKAMI)
Manjkrat uporabljen je zapis s terkami, kjer preprosto shranjujemo terke oblike
(podatek, vrstica, stolpec).
V ta namen moramo shraniti 3 polja data, row in col, kjer je data polje z realnimi
elementi matrike, row vsebuje naravna števila, ki predstavljajo indekse vrstic ele-
mentov v matriki, col pa vsebuje naravna števila, ki predstavjajo indekse stolpcev
elementov v matriki.
Polja so povezana tako, da imamo za k-ti element v polju data na k-tem mestu v
row shranjen indeks vrstice tega elementa v matriki in na k-tem elementu v col
indeks stolpca elementa v matriki [5] [1].
Prednosti: enostavnost in fleksibilnost.
data 1 2 3 4 5 6 7 8 9 10 11 12
row
col 1 4 1 2 4 1 3 4 5 3 4 5
1 1 2 2 2 3 3 3 3 4 4 5
Slika 3.6: Primer zapisa s terkami na matriki A
3.3.4 MSR ZAPIS (Modified Sparse Row)
MSR zapis izkorǐsča dejstvo, da ima večina matrik običajno neničelno diagonalo
(veliko algoritmov to celo zahteva) in/ali do te diagonale dostopamo pogosteje kot
do drugih elementov v matriki. Zato je uporabno, da jo hranimo posebej oziroma
prej.
V ta namen pri tem zapisu shranjujemo le 2 polji, data in ind, data z realnimi
števili in ind z naravnimi. V polju data so na prvih n mestih vrednosti elementov
na diagonali urejene po vrsti, n+1 pozicija ponavadi ni zasedena, lahko pa to
polje nosi kakšno drugo informacijo o matriki; s pozicijo n+2 pa se začnejo ostali
3.3. SHRANJEVANJE REDKIH MATRIK 19
neničelni elementi matrike, ki jih shranjujemo po vrsti po vrsticah, podobno kot
pri CSR, le da spuščamo elemente na diagonali, saj so zapisani že na začetku. Za
prvih n elementov polja data torej velja, da na i-ti poziciji leži element v matriki,
ki je v i-tem stolpcu in i-ti vrstici.
Ind ima naslednjo strukturo:
• v prvih n poljih imamo shranjen indeks elementa matrike, s katerim se začnevrstica, pri čemer ignoriramo diagonalne elemente. Če je diagonalni element
edini element v neki vrstici matrike, tja vstavimo indeks, ki ne obstaja v
tabeli data.
• n+1 element je indeks, ki ne obstaja v tabeli data (lahko kar za ena povečanmaksimalen indeks v data).
• Od n+2 elementa v ind naprej velja, da za k-ti element v data (kjer je kvečji ali enak n+2) hranimo indeks stolpca, v katerem se ta element nahaja
v matriki.
Poraba prostora je malce manǰsa kot pri zgornjih zapisih, zapis pa je najbolj upo-
raben, kadar potrebujemo hitro identificiranje elementov na diagonali [10] .
data 1 4 7 11 12 * 2 3 5 6 8 9 10
ind 7 9 10 13 14 14 4 1 4 1 4 5 3
Slika 3.7: Primer MSR zapisa na matriki A
Zvezdica prikazuje neuporabljen element.
Opazimo, da ind(n)= ind(n+1)=14, kar pomeni, da je zadnja vrstica vrstica ničel,
če bi umaknili diagonalne elemente (edini element v tej vrstici je diagonalni ele-
ment).
20 POGLAVJE 3. REDKE MATRIKE
3.3.5 SHRANJEVANJE DIAGONALNIH MATRIK
Definicija Diagonalna matrika je matrika, ki ima neničelne matrike samo na
majhnem številu diagonal.
Te diagonale lahko shranimo v pravokotnem polju DIAG(1:n,1:Nd), kjer je Nd
število diagonal. Oddaljenost diagonale od glavne diagonale mora seveda biti
znana. Te oddaljenosti shranimo v polju IOFF(1:Nd). Torej je element ai,i+ioff(j)
originalne matrike na poziciji (i,j) polja DIAG
DIAG (i,j) ← ai,i+ioff(j)Vrsti red shranjevanja diagonal ni pomemben, razen če do katere od diagonal do-
stopamo večkrat, potem bomo v prednosti, če te diagonale shranimo na začetek.
Opazimo tudi, da so vse diagonale kraǰse od glavne diagonale, zato nekateri ele-
menti DIAG ne bodo uporabljeni [5] .
B =
1 0 2 0 0
3 4 0 5 0
0 6 7 0 8
0 0 9 10 0
0 0 0 11 12
DIAG=
* 1 23 4 56 7 89 10 *11 12 *
IOF= -1 0 2
Slika 3.8: Primer shranjevanja diagonalne matrike na matriki B
Splošneǰsa rešitev, uporabljena na vektorskih računalnikih, je Ellpack-Itpack za-
pis. Predpostavka, ki jo moramo privzeti, je, da imamo največ Nd neničelnih
elementov v vrstici, kjer je Nd majhen. Nato potrebujemo 2 polji velikosti n x Nd
3.4. OPERACIJE NA REDKIH MATRIKAH 21
COEF in JCOEF. Neničelne elemente vsake vrstice matrike shranimo v vrstico
COEF(1:n,1:Nd), pri čemer zapolnimo vrstice z ničlami, če je potrebno. V polje
JCOEF(1:n,1:Nd) shranimo pozicijo stolpca za vsak zapis v COEF [5].
COEF=
1 2 03 4 56 7 89 10 011 12 0
JCOEF=
1 3 11 2 42 3 53 4 44 5 5
Slika 3.9: Primer shranjevanja diagonalne matrike z Ellpach-Itpackovim zapisom
na matriki B
Določena številka stolpca mora biti izbrana za vsak ničelen element, ki je dodan,
da zapolni vrstico v A. V tem primeru je to za vrstice 1, 4 in 5. Tukaj smo določili,
da se v JCOEF zapǐse kar številka vrstice, v kateri je ničla. Katero številko tu
izberemo, ni pomembno, dobra bi bila vsaka med 1 in n, vseeno pa je dobro, da
ne vstavljamo iste številke prepogosto, npr. vedno neko konstanto, saj nam lahko
to poslabša učinkovitost nekaterih algoritmov.
3.4 Operacije na redkih matrikah
3.4.1 Množenje matrik
Za učinkovite algoritme potrebujemo tudi učinkovito matrično množenje redkih
matrik. Neodvisno od načina shranjevanja je časovna zahtevnost za množenje
matrike dimenzije NxN z vektorjem z M neničelnimi elementi približno 2M2/N . Z
uporabo tega modela je tudi enostavno izračunati kompleksnost večine linearnih
algebraičnih algoritmov na grafih.
22 POGLAVJE 3. REDKE MATRIKE
3.4.2 Množenje matrike z vektorjem
Produkt med matriko in vektorjem (y= Ax) je zelo pomembna operacija, ki jo po-
trebujemo za večino iterativnih algoritmov za reševanje redkih linearnih sistemov.
Implementacija je odvisna od načina shranjevanja matrike. Recimo, da imamo
matriko shranjeno v CSR zapisu.
Operacijo v tem zapisu lahko izrazimo na običajem način : yi =∑
j ai,jxj, saj
množenje prehaja čez vrstice matrike.
Algoritem 3.4.2: Množenje matrike v CSR zapisu z vektorjem [13]
for i :=1 to n step 1 {y ( i )=0;
}for j := poin ( i ) to poin ( i +1)−1 step 1{
y ( i )=y ( i )+data ( j )∗x ( ind ( j ) ) ;}
Rešitev dobimo v y.
Opazimo, da vsaka iteracija izračuna drugo komponento končnega rezultata (vek-
torja). To je prednost, saj lahko vsako komponento izračunamo neodvisno, torej
lahko uporabimo paralelizem. Prav tako opazimo, da metoda množi le neničelne
elemente, zato naredimo le 2nnz operacij, medtem ko jih pri običajnem množenju
matrik potrebujemo kar 2n2 (n predstavlja dimenzijo matrike, nnz pa število
neničelnih elementov v matriki).
Za produkt y = ATx ne moremo uporabiti direktne enačbe yi =∑
j(AT )i,jxj =∑
j aj,ixj, saj to pomeni, da bi morali prečkati stolpce matrike, kar pa je zelo
neučinkovito, če imamo matriko shranjeno v CSR zapisu. Zato moramo upoštevati
naslednje:
• namesto za vse j naredi za vse i;
• yi postane yi + aj,ixj.
3.4. OPERACIJE NA REDKIH MATRIKAH 23
Algoritem 3.4.4: Množenje transponirane matrike v CSR zapisu z vek-
torjem [6] [1]
for i :=1 to n step 1 {y ( i )=0;
}for i := poin ( j ) to poin ( j +1)−1 step 1 {
y ( ind ( i ))=y ( ind ( i ))+ data ( i )∗x ( j ) ;}
MSR ZAPIS
Recimo, da imamo matriko shranjeno v MSR zapisu. Ta zapis ni ravno idealen za
množenje matrike z vektorjem, saj pri tej operaciji potrebujemo podatek o stolpcu
in vrstici elementa, s katerim trenutno množimo vektor, kar pa iz tega zapisa ni
direktno razvidno.
Algoritem deluje tako, da gre po vseh elementih, od n+2 elementa naprej, ugotovi,
v kateri vrstici matrike se nahaja ta element (stolpec je viden neposredno iz tabele
ind) in nato zmnoži element z elementom v ustrezni vrstici vektorja in ga prǐsteje
rezultatu v ustrezno vrstico. Na koncu prǐsteje še vrednosti, ki jih dobimo, če
množimo diagonalo, tu ni večjih težav, saj imajo ti elementi isti indeks stolpca in
vrstice, element, s katerim množimo (iz vektorja x), pa je tudi v isti vrstici.
Algoritem 3.4.6: Množenje matrike v MSR zapisu z vektorjem [7]
for j :=n+1 to end o f data s tep 1 {for k:=1 to n step 1{
i f ( ( j < ind [ k ] AND j> ind [ k+1])
OR j=ind [ k ] ) {v r s t i c a=k ;
}}y ( v r s t i c a )=y ( v r s t i c a ) + data ( j )∗x ( ind ( j ) )
}
24 POGLAVJE 3. REDKE MATRIKE
for i :=1 to n step 1 {y ( i )=y ( i )+data ( i )∗x ( i ) ;
}
ZAPIS S TERKAMI
Recimo, da imamo matriko shranjeno v zapisu s terkami. Zapis je precej primeren
za množenje matrike z vektorjem, saj je algoritem zelo preprost, enostavno gremo
čez vse elemente v polju data in zmnožimo element z elementom v vektorju, ki
leži na pravem mestu. Enostavno je ugotoviti, kako med seboj množiti elemente,
saj imamo za vsak element v data neposredno dostopna tudi podatka o indeksu
vrstice in stolpca.
Algoritem 3.4.8: Množenje matrike v zapisu s terkami z vektorjem [1]
for i :=1 to end o f data s tep 1{y ( row ( i ))=y ( row ( i ))+ data ( i )∗x ( c o l ( i ) ) ;
}
3.5 Cilj uporabe redkih matrik
• Prostor pri shranjevanju redke matrike bi moral biti sorazmeren s številomvrstic, številom stolpcev in številom neničelnih elementov.
• Časovna zahtevnost operacije na redki matriki bi morala biti sorazmerna zvelikostjo podatkov, do katerih dostopamo, in s številom aritmetičnih ope-
racij, izvedenih na neničelnih elementih.
Poglavje 4
Linearna algebra matrik in
vektorjev
4.1 Vektorji v prostoru
Množici vseh n-terk realnih števil, ki jo označimo z Rn, rečemo n-prostor.Strukturi u=(a1, a2...an) rečemo vektor.
Števila ai so koordinate, komponente, vnosi oziroma kar elementi vektorja u. Ka-
dar govorimo o prostoru Rn, rečemo elementom (številom) iz R kar skalarji.Vektorja u in v sta enaka, če imata enako število elementov in imata istoležeče
elemente enake. Primer: (1,2,3) in (2,3,1) imata sicer enake elemente, a ne na istih
mestih, zato nista enaka. [2]
Vektor (0,0,...,0), ki ima vse elemente enake 0, se imenuje ničelni vektor in ga
ponavadi označimo kar z 0.
Včasih vektor v n-prostoru napǐsemo navpično, namesto horizontalno. Takšnemu
vektorju rečemo stolpični vektor, obratno vektorjem, zapisanim horizontalno,
rečemo vrstični vektorji.
Vse operacije, definirane na vrstičnih, so analogno definirane na stolpičnih vektor-
jih. [2]
OPERACIJE NA VEKTORJIH
Recimo, da imamo dva vektorja u in v ∈ Rn, recimo u=(a1, a2...an), v=(b1, b2...bn)
25
26 POGLAVJE 4. LINEARNA ALGEBRA MATRIK IN VEKTORJEV
VSOTA teh dveh vektorjev, ki jo zapǐsemo kot u + v, je vektor, ki ga dobimo
tako, da seštejemo elemente, ki ležijo na istih indeksih vektorjev.
u+ v = (a1 + b1, a2 + b2, ..., an + bn) [2]
MNOŽENJE S SKALARJEM oziroma produkt vektorja u in skalarja k, je
vektor, ki ima vse elemente iz u pomnožene s skalarjem k.
ku = k(a1, a2, ...an) = (ka1, ka2, ..., kan) [2]
Opazimo, da sta tudi u+v in ku vektorja v Rn. Vsota vektorjev različnih dimenzijni definirana.
NEGIRANJE IN RAZLIKA sta definirana tako:
−u = (−1)u
u− v = u+ (−v)
Vektor -u imenujemo nasprotni vektor u-ja in u-v imenujemo razlika u in v.
Lastnosti
Za poljubne vektorje u, v, w ∈ Rn in poljubne skalarje k,l ∈ R velja [2]:
• (u+ v) + w = u+ (v + w)
• u+ 0 = u
• u+ (−u) = 0
• u+ v = v + u
• k(u+ v) = ku+ kv
• (k + l)u = ku+ lu
• (kl)u = k(lu)
• 1u = u
4.2. MATRIKE 27
4.2 Matrike
Podpoglavje je povzeto po [3].
K naj bo dan kolobar. Matrika je kvadratna shema elementov iz K s tole obliko
A =
a11 a12 ... a1n
a21 a22 ... a2n
... ... ... ...
an1 an2 ... ann
. In sicer je A kvadratna matrika dimenzije n x n, ker je v njej n vodoravnih vrstic
in v vsaki vrstici stoji po n elementov kolobarja K. Vseh elementov aij v matriki
dimenzije n x n je n2. Indeksa i in j pri elementu aij povesta, kje leži ta element v
matriki. Prvi indeks nam pove, v kateri vrstici leži, drugi pa, v katerem stolpcu.
Na primer a23 je na križǐsču druge vrstice in tretjega stolpca.
Množico vseh kvadratnih matrik dimenzije n x n, sestavljenih z elementi kolo-
barja K, bomo zaznamovali s Kn. Zdaj bomo definirali računske operacije med
matrikami, tako da bo postala množica Kn kolobar.
Seštevanje matrik
Naj bosta A in B poljubni matriki dimenzije n x n z elementi iz kolobarja K. Vsota
A + B je matrika dimenzije n x n, katere elementi so vsote istoležnih elementov
matrike A in matrike B.
V vsoti A+B stoji na preseku i-te vrstice in j-tega stolpca vsota elementov aij in
bij, ki ležita na istem mestu v matrikah A in B.
Ker veljajo v kolobarju običajni zakoni za seštevanje, iz definicije vidimo, da veljata
za seštevanje matrik asociativnostni in komutativnostni zakona:
(A+B) + C = A+ (B + C)
in
A+B = B + A.
Matrike dimenzije n x n odštevamo tako, da odštevamo istoležne elemente. Od
tod sledi, da je množica Kn vseh matrik dimenzije n x n za seštevanje Abelova
28 POGLAVJE 4. LINEARNA ALGEBRA MATRIK IN VEKTORJEV
grupa. Element 0 te aditivne grupe je matrika0 0 ... 0
0 0 ... 0
... ... ... ...
0 0 ... 0
, ki ima vse elemente enake 0.
Nasprotna matrika -A matrike A je matrika iz nasprotnih elementov −aij. Resje A+ (−A) = 0.Množenje matrik
Naj bosta a=a1, a2...an in b=b1, b2...bn vektorja z n elementi poljubnega kolobarja
K.
Vsoto produktov s=a1b1 + a2b2 + ... + anbn imenujemo skalarni produkt a z
b. Skalarni produkt je seveda element kolobarja K.
Produkt matrike A dimenzije n x n in matrike B dimenzije n x n označimo z AB
in je matrika C dimenzije n x n, pri kateri je element cij, ki leži na križǐsču i-te
vrstice in j-tega stolpca produkta AB, enak skalarnemu produktu i-te vrstice in
j-tega stolpca.a11 a12 ... a1n
a21 a22 ... a2n
... ... ... ...
an1 an2 ... ann
∗b11 b12 ... b1n
b21 b22 ... b2n
... ... ... ...
bn1 bn2 ... bnn
=c11 c12 ... c1n
c21 c22 ... c2n
... ... ... ...
cn1 cn2 ... cnn
pri čemer je cij = ai1b1j + ai2b2j + ...+ ainbnj
Komutativnost v splošnem ne velja, čeprav je osnovni kolobar K komutativen.
Veljata pa asociativnostni in distributivnostni zakon. Torej velja
• (AB)C = A(BC)
• C(A ∗B) = CA+ CBin(A+B)C = AC +BC
Naj ima kolobar K element 1. V tem primeru je tudi v Kn identiteta I, to je
4.2. MATRIKE 29
matrika
I =
1 0 ... 0
0 1 ... 0
... ... ... ...
0 0 ... 1
, ki ima v glavni diagonali povsod element 1 kolobarja K, na vseh drugih pa je
element 0.
Velja:
AI = IA = A
za vsako matriko A dimenzije n x n.
Zamenjajmo v matriki A vodoravne vrstice s stolpci, torej zrcalimo A čez glavno
diagonalo. Tako dobimo transponirano matriko matrike A, ki jo označimo z AT
Torej:
AT =
a11 a21 ... an1
a12 a22 ... an2
... ... ... ...
a1n a2n ... ann
Transponiranost je vzajemna. K matriki AT transponirana matrika je prvotna
matrika A.
ATT = A
Vidimo tudi, da je transponirana matrika vsote enaka vsoti transponirank suman-
dov:
(A+B)T = AT +BT
Potence matrike
Naj bo A matrika dimenzije n x n z elementi iz kolobarja K. Potence matrike A
so definirane tako:
A2 = AA, A3 = A2A,...An+1 = AnA,... in A0 = I
Množenje matrike z vektorjem
Produkt matrike A dimenzije n x n in vektorja x z n elementi označimo z Ax.
Rezultat je vektor y, ki ima za i-ti element skalarni produkt i-te vrstice matrike z
vektorjem x.
30 POGLAVJE 4. LINEARNA ALGEBRA MATRIK IN VEKTORJEV
Torej:
a11 a12 ... a1n
a21 a22 ... a2n
... ... ... ...
an1 an2 ... ann
∗x1
x2
...
xn
=y1
y2
...
yn
,pri čemer je yi = ai1x1 + ai2x2 + ...+ ainxn.
Pri uporabi bi namesto + in * lahko uporabili kakšen drug kolobar, na primer
(min,+).
Takrat bi veljalo yi = min{ai1 + x1, ai2 + x2, ..., ain + xn}.
Poglavje 5
Algoritmi
Vsi algoritmi v poglavju so implementirani po [1], prav tako so vsi opisi algoritmov
in delovanja algoritmov povzeti po [1], če ni drugače zapisano.
5.1 BFS - iskanje v širino
Iskanje v širino je ena od strategij preiskovanja grafa, kjer je iskanje po grafu
omejeno na dve operaciji
• obisk in preiskovanje vozlǐsča grafa,
• narediti en korak od trenutnega preiskovanega vozlǐsča do vseh najbližjihsosedov vozlǐsča.
Lahko bi rekli, da algoritem deluje tako, da na vsakem koraku “razširi” že obiskano
območje en nivo vozlǐsč naprej, kjer nivo pomeni najbližje sosede [9] .
Na sliki 5.1 vidimo, kako po vrsti preiskujemo vozlǐsča po pravilu “najprej sosede”.
Pri preiskovanju grafa se lahko osredotočimo na iskanje marsičesa, v našem primeru
pa nas bo zanimalo, do katerih vozlǐsč lahko pridemo iz začetnega vozlǐsča v r
korakih. Če bi r bil 1, bi odgovor bil: najbližji sosedi (oddaljeni za 1 korak).
Pri reševanju tega problema je pomembna dualnost, ki obstaja med osnovno ope-
racijo v linearni algebri (množenje vektorja in matrike) z iskanjem v širino (BFS)
na grafu G, z začetkom v vozlǐsču s.
31
32 POGLAVJE 5. ALGORITMI
1
222
3 3 3 3
4 4 4
Slika 5.1: Slika nivojev pri preiskovanju v širino
Pomagamo si z zgoraj opisano matriko sosednosti in (ALI,IN) kolobarjem.
0 0 1 0 0 0 0 0 1 1 1 0 0 1 0 0 1 0 0 1 1 1 0 0 0
0 0 1 0 0 0 0 0 1 1 1 0 0 1 0 0 1 0 0 1 1 1 0 0 0
|.& =
1 0 0 1 0 1 1 0 0 1 0 1 1 0 1 1 1 0 1 1 0 0 1 1 1
(0&0) | (0&0) | (1&1) | (0&0) | (0&1) = 0 | 0 | 1 | 0 | 0 = 1
Slika 5.2: Primer računanja v kolobarju (ALI,IN)
Rešitev je i-ti stolpec G�r.
Za iskanje iz vozlǐsča i začnemo z x(i) = 1, x(j) = 0 za j 6= i. Potem y = G ∗ xpobere stolpec i iz G, ki vsebuje sosede vozlǐsča i. Množenje med y in G�2 da
vozlǐsča, ki so 2 koraka stran in tako naprej, to pa je natanko iskanje v širino.
Če namesto matrike sosednosti, vzamemo matriko dosegljivosti, lahko s tem algo-
ritmom dobimo vsa vozlǐsča v razdalji NAJVEČ k na k-tem koraku.
5.1. BFS - ISKANJE V ŠIRINO 33
x x x x x xx x x x x x
A
= x
x
-> x
xA
x
x
-> x
x(A)
x
x
2
x
x
->
12
3
4 5
6
7
Slika 5.3: Simulacija BFS algoritma
0 0 1 0 0 0 0 0 1 1 1 0 0 1 0 0 1 0 0 1 1 1 0 0 0
A =1
2
3
45
1 0 0 1 0 1 1 0 0 1 0 1 1 0 1 1 1 0 1 1 0 0 1 1 1
A =1
2
3
45
V 1 koraku lahko iz vozlišča 3 pridemo v 1 ali 4
2
V 2 korakih lahko iz vozlišča 3 pridemo v 2, 3 ali 5
0 1 1 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 0 1 1
A =1
2
3
45
3
V 3 korakih lahko iz vozlišča 3 pridemo v 1,2, 4 ali 5
Slika 5.4: Simulacija BFS algoritma na primeru
Kot smo videli, lahko izvajamo več neodvisnih iskanj naenkrat, tako da uporabimo
množenje med dvema redkima matrikama, saj se pri takem množenju izračunajo
34 POGLAVJE 5. ALGORITMI
stolpci neodvisno eden od drugega. Namesto vektorja x torej uporabimo matriko
X, s stolpcem za vsako začetno vozlǐsče. Po množenju Y = G ∗ X, stolpec j vY vsebuje rezultat BFS za vozlǐsče, specificirano s stolpcem j v X. Z uporabo
nepotratne podatkovne strukture za operiranje z redkimi matrikami je časovna
kompleksnost iskanja enaka, kot bi bila s tradicionalno podatkovno strukturo za
redek graf.
5.2 Algoritem minimalne poti
PROBLEM
Imamo usmerjen graf G z N vozlǐsči in M povezavami ter matriko cen C (na mestu
(i j) je cena poti od vozlǐsča i do vozlǐsča j v enem koraku). Zapisi na lokacijah
A(i,i) bodo 0 (cena, da pridemo do vozlǐsča, v katerem smo že, je 0). Želimo najti
drugo matriko, ki bi imela na poziciji (i, j) zapis, ki bi povedal najmanǰso možno
ceno pri sprehodu od i do j, pri tem pa ni pomembno, v koliko korakih bi to bilo.
V bistvu ǐsčemo najceneǰse poti od nekega vozlǐsča s do vseh drugih vozlǐsč.
Problem bi že znali rešiti z iskanjem v širino, če bi imeli vse cene enake 1.
Ideja
Če je π = (u0, ..., uk−1, uk) najceneǰsa pot od u0 do uk, potem je (u0, ..., uk−1)
najceneǰsa pot od u0 do uk−1.
Dokaz
Če bi obstajala od u0 do uk−1 neka ceneǰsa pot p, ki bi jo lahko podalǰsali s korakom
(uk−1, uk) in tako dobili neko pot med u0 in uk, ki bi bila ceneǰsa od π, ki pa je po
predpostavki najceneǰsa, bi zašli v protislovje [14].
Torej je vsaka najcenenǰsa pot podalǰsek neke druge najceneǰse poti. Vse, kar
moramo storiti, če ǐsčemo po grafu, je, da za vsak i najdemo njegovo predhodnico
na najceneǰsi poti od s do i.
Porodi se ideja, da bi namesto navadnega produkta C(i,j)=∑
k(A(i, k) ∗ B(k, j)želeli produkt v kolobarju z operacijama min in + (C=A min.+ B) C(i, j) =
mink{A(i, k) +B(k, j)}.Zakaj nam ta operacija pride prav?
5.2. ALGORITEM MINIMALNE POTI 35
Naj bo ui = cena najceneǰse poti od začetnega vozlǐsča do vozlǐsča i
• če je i = 1, potem je u1 = 0,
• če i 6= 1, potem pride najceneǰsa pot v i iz nekega k (k 6= i). Kot smopremislili zgoraj, je to del najceneǰse poti do k (z ceno uk). Ostane še
vprašanje, kateri je k. K je tisti, za katerega je uk + cki minimalno. Torej:
ui = mink 6=iuk + cki, natanko to pa nam da produkt v kolobarju (min,+).
Kadar graf G nima povezave med i in j, bi po definiciji v matriki A imeli zapis
A(i,j)=0. To pa bi pomenilo, da med tema vozlǐsčema ni cene (je pot zelo poceni),
mi pa bi morali nekako zagotoviti, da nam bo element v bistvu povedal, da je pot
med i in j nemogoča oziroma mora biti cena taka, da se nam zagotovo nikoli ne
bo splačalo iti po njej. Najlažje to storimo tako, da za take primere definiramo
A(i,j)= ∞.Poglejmo sedaj našo operacijo A min.+ A med enakima matrikama:
C(i, j) = mink{A(i, k) + A(k, j)}
A(i,k) je cena na poti od vozlǐsča i do vozlǐsča j in A(k,j) je cena na poti od vozlǐsča
k do vozlǐsča j. Torej je A(i, k) +A(k, j) vsota cen na poti v ”2 korakih”, in sicer
od vozlǐsča i do vozlǐsča j, ki gre skozi k, torej mink{A(i, k) +A(k, j)} pomeni odvseh možnih poti od i do j, ki grejo skozi različne k (gledamo po vseh možnih k)
vzamemo minimalno.
Iz tega sledi, da imamo v C na poziciji i, j res najmanǰso ceno poti od vozlǐsča
i do vozlǐsča j v natanko 2 korakih. Ker pa smo prej določili, da je A (i,i)=0,
minimizacija za C vključuje k = i in k = j, kar predstavlja pot od i do j v
natanko 1 koraku, zato bomo raje rekli, da imamo v C(i,j) najnižjo možno ceno v
NAJVEČ 2 korakih. Tudi v nadaljevanju bomo pri govoru o poti dane dolžine v
bistvu govorili o tej poti.
NOTACIJA
A�n
A�1 = A
A�2 = Amin.+ A
in v splošnem A�n = Amin.+ A�(n−1)
36 POGLAVJE 5. ALGORITMI
Algoritem 5.2.10: Množenje v kolobarju (min,+): A min.+A
for i :=1 to v i s i n a A step 1 {for j :=1 to s i r i n a A step 1 {
minimum= In t eg e r .MAX VALUE;
for k:=1 to s i r i n a A step 1{temp=A[ i ] [ k]+A[ k ] [ j ] ;
i f ( temp
5.2. ALGORITEM MINIMALNE POTI 37
največ 2 koraka in A�3 minimalno ceno za največ 3 korake, v nadaljevanju bomo
pokazali, da se ta vzorec nadaljuje tudi za vǐsje potence. Torej obrazložimo, da
vnos na mestu (i,j) v matriki A�n, ko uporabljamo kolobar (min,+), vsebuje ceno
najceneǰse poti od i do j z uporabo največ n korakov.
Dokaz Trditev bomo dokazali z matematično indukcijo.
Recimo, da to velja za n, pokazati pa moramo, da to velja tudi za n+1. Prav tako
že vemo, da to velja za n=1, saj je A definiran tako, da je v ai,j cena poti med i
in j (kar je pot dolžine 1)
Najceneǰsa pot v (največ) 1 koraku iz vozlǐsča i v vozlǐsče k je dana v A in naj-
ceneǰsa pot v največ n korakih iz kateregakoli vozlǐsča k v vozlǐsče j je dano v
B = A�n, ampak na poti od i do j mora obstajati neko vozlǐsče k na najceneǰsi
poti od i do j v največ n+1 korakih. Bellmanov princip nam pove, da mora vsaka
podpot na optimalni poti tudi biti optimalna podpot. Če je torej k na optimalni
poti od i do j, mora biti podpot od i do k (trivialno) optimalna in je njena cena
A(i,k). Podpot v največ n korakih od k do j mora biti tudi optimalna in njena
cena je B(j,k).
Izračun A min.+ B eksplicitno določa, katero vozlǐsče k minimizira A(i, k)+B(k, j),
to pa je ravno cena poti največ n+1 koraki.
MATRIČNO POTENCIRANJE
B=A�K bi lahko izračunali z naslednjo zanko
Algoritem 5.2.12: potenciranje v kolobarju (min,+)
B=A;
for i :=2 to K step 1{B=A min.+ B;
}
Kjer je A matrika cen.
Kot smo prej pokazali, bi B(i,j) vseboval najceneǰso pot od i do j v največ K
korakih. Kaj pa, če nas zanima absolutna najceneǰsa pot (ne glede na število
38 POGLAVJE 5. ALGORITMI
A =1
2
3
45
23
1
58
7
V 1 koraku pot iz vozlišča 3 v 1 stane 1 v 4 pa 5, v ostala vozlišča ne moremo
0 1 0 2 3 1 0 5 2 0 8 3 0
A =1
2
3
45
12
7
5
2
V NAJVEČ 2 korakih lahko iz vozlišča 3 pridemo v 1 in 4 po isti ceni, 2 po 7 v 5 pa po 12
0 1 6 11 0 2 3 1 7 0 5 12 2 0 5 8 3 9 5 0
A =3
V vse ostale najkrajše poti iz vozlišča 3 ostanejo iste, razen v 5, ki sedaj stane 10
0 8 1 6 13 11 0 11 2 3 1 7 0 5 10
12 2 16 0 5 8 3 9 5 0
1
2
3
45
1
5
23
Slika 5.6: Primer iskanja minimalnih poti
korakov)? Za to ceno očitno ne bomo nikoli potrebovali več kot N-1 korakov, kjer
je N število vozlǐsč, torej se A�n ne spreminja več, ko n postane večji od N-1, saj
pot gotovo ne bo ceneǰsa, če bomo po istih povezavah hodili večkrat (opomba:
vsa ta spoznanja veljajo samo za povezan graf, ki ima same pozitivne cene).
B=A�K vsebuje samo informacijo o najmanǰsi ceni poti, ne pa tudi o poti sami,
ta informacija se je izgubila, ko smo si v enačbi A(i, k) + B(k, j) zapomnili samo
minimum takih poti, nismo pa si zapomnili vozlǐsča k, s katerim smo dobili naj-
ceneǰso pot. Če želimo ohraniti še informacijo o poti sami, moramo pri kalkulaciji
B = A min. + B imeti še vzporedno matriko D, v kateri je element (i,j) vozlǐsče
k, za katerega je bil ta minimum dosežen.
Za bolj učinkovito računanje A�Kmoramo najprej povedati, da za vsaka pozitivna
5.2. ALGORITEM MINIMALNE POTI 39
p in q velja
A�(p+q) = A�pmin.+ A�q.
To pa je v bistvu še ena trditev Bellmanovega principa .
Za katerokoli vozlǐsče k R�p vsebuje minimalne cene poti med vozlǐsčema i in k
s p koraki (R(i,k) je cena minimalne poti med vozlǐsčema i in k) in S�q vsebuje
minimalno ceno poti med vozlǐsčema i in k s q koraki. (S(k,j) je cena minimalne
poti med vozlǐsčema k in j.)
Če gre minimalna pot s p+q koraki skozi neko vozlǐsče k, morajo biti
podpoti iz vozlǐsča i do vozlǐsča k ter od vozlǐsča k do vozlǐsča j mini-
malne podpoti.
Torej R min.+ S najde vozlǐsče k, ki minimizira R(i, k)+S(k, j). Po Bellmanovem
principu mora to biti najceneǰsa od cen poti s p+q koraki. Račun, ki smo ga opisali,
je v bistvu kar A�(p+q).
S pomočjo te trditve lahko bolj učinkovito izračunamo A�K , in sicer, če za K iz-
beremo najmanǰso moč dveh večjih ali enakih števil od N-1, lahko ekonomično
računamo matriko, ki ima za element (i,j) absolutno minimalno ceno poti od vo-
zlǐsča i do vozlǐsča j:
B�(0) = A
B�(1) = B�(0)min.+B�(0) = A�2
B�(2) = B�(1)min.+B�(1) = A�4
...
B�(r) = B�(r−1)min.+B�(r−1) = A�2r
Algoritem 5.2.14: Algoritem iskanja minimalnih poti brez shranjevanja
poti
B=A;
mnozenje=c e i l ( l og ( do l z i na A)/ log ( 2 ) ) ;
for i :=1 to mnozenje s tep 1 {temp=B min.+B;
B=temp ;
40 POGLAVJE 5. ALGORITMI
}r e z u l t a t=B;
Kjer je:
• temp=matrika s samimi ničlami istih dimenzij kot A;
• A je matrika cen;
• min.+ je množenje v kolobarju (min,+).
Ne smemo pozabiti, da nam A�2r
daje cene minimalnih poti in ne poti samih, če pa
želimo še poti, moramo shranjevati še serijo matrik D(m); m=1,2,...r z vrednostmi
k, ki so bila vozlǐsča, preko katerih smo prǐsli do minimalne cene poti v vsakem
izračunu min.+.
Lahko redefiniramo min.+ operacijo v [C,D] = A min. + B tako, da hkrati
računamo
C(i, j) = mink{A(i, k) + A(k, j)}D(i, j) = argmin{A(i, k) + A(k, j)}ALGORITEM
B�(0) = A
[B�(1), D�(1)] = B�(0)min.+B�(0)
[B�(2), D�(2)] = B�(1)min.+B�(1)
.....
Če od tod želimo dobimi celotno optimalno pot iz i do j, pogledamo najprej v
D�(r)(i, j), tu najdemo k, ki je na “polovici” poti med vozlǐsčema i in j. Potem
v D�(r−1) pogledamo vD�(r−1)(i, k), tu najdemo vozlǐsče, ki je na polovici med
vozlǐsčema i in k, in v D�(r−1)(k, j), da najdemo vozlǐsče na polovici med vozlǐsčema
k in j in tako dalje rekurzivno, dokler ne najdemo celotne poti (odkrivamo sosedna
vozlǐsča po poti).
5.3. BELLMAN-FORDOV ALGORITEM 41
5.3 Bellman-Fordov algoritem
Bellman-Fordov algoritem rešuje problem iskanja minimalnih poti iz enega vo-
zlǐsča. Recimo, da imamo dan graf G=(V,E), s cenami povezav w in začetnim
vozlǐsčem s ∈ V . Z Bellman-Fordovim algoritmom določimo, če imamo v grafu potz negativnimi cenami povezav na poti, ki vsebuje s,saj v tem primeru ne moremo
najti prave minimalne poti. Če v grafu nimamo negativnih povezav, algoritem
vrne minimalno razdaljo poti med vozlǐsčem s in vozlǐsčem v za vse v ∈ V inpripadajoče poti. Isti problem rešuje tudi na primer Dijkstrov algoritem, ki ni
učinkovit za grafe, ki vsebujejo negativne povezave, saj Dijkstra požrešno izbira
povezave z najnižjimi cenami in jih dodaja v drevo minimalnih poti. Bellman-
Fordov algoritem vsakič pregleda vse povezave, zato je počasneǰsi, a uporabneǰsi
v primeru grafov z negativnimi povezavami.
Algoritem lahko implementiramo na več različnih načinov.
5.3.1 Standardna implementacija
Za vsako vozlǐsče shranimo oceno minimalne razdalje d(v), kjer vzdržujemo pravilo,
da d(v) >= ∆(s, v), kjer je ∆(s, v) cena poti med vozlǐsčema s in v. Algoritem
ponavlja zaporedje sprostitev vozlǐsč, po katerih velja d(v) = ∆(s, v). Sprostiti
vozlǐsče pomeni, da d(v)= min{d(v),d(u)+W(u,v)}. V glavnem algoritem sestavljaN iteracij, pri katerih sprostimo vsa vozlǐsča v vsaki iteraciji (v poljubnem vrstnem
redu). V π(x) shranimo starša (predhodnika) tega vozlǐsča v drevesu minimalnih
poti. π na koncu lahko uporabimo tudi za restavriranje celotne minimalne poti za
neko vozlǐsče, ne samo za pridobitev razdalj (cene) posameznih poti.
Algoritem 5.3.16: Standardna implementacija Bellman-Fordovega al-
goritma
f o r each v i z V {d( v)= I n t eg e r .MAX VALUE;
p i ( v)=NIL ;
}
42 POGLAVJE 5. ALGORITMI
d( s )=0;
for k:=1 to N−1 step 1 {f o r each edge (u , v ) i z E{
Relax (u , v ) ;
i f (d( v)>d(u) + W(u , v ) ){d( v)=d(u) + W(u , v ) ;
p i ( v ) =u ;
}}
}f o r each edge (u , v ) i z E{
i f (d( v)>d(u) + W(u , v ) ){vrn i ” o b s t a j a j o negat ivne povezave ”
}}
Kjer je:
• V množica vozlǐsč;
• E množica povezav;
• W(u,v) cena povezave med u in v;
• edge(u,v) je povezava med u in v;
• Relax(u,v) funkcija, ki sprosti vozlǐsče v;
• Integer.MAX VALUE predstavlja ∞.
Na koncu preverjamo, ali negativne povezave obstajajo, in sicer, če je cena poti do
v strogo večja od cene poti do u + cena povezave med u do v, potem mora vmes
obstajati negativna povezava, saj v primeru, da ni negativnege povezave d(v), to
ni cena minimalne poti, kot jo je označil algoritem, saj je pot skozi d(u) ceneǰsa.
Razlog za to je torej lahko samo negativna povezava na grafu.
5.3. BELLMAN-FORDOV ALGORITEM 43
W(u
,v)
d(v)
W(u
,v)
d(u)
s
v
u
5.3.2 Implementacija z linearno algebro
Ta implementacija nas bo bolj zanimala.
Algebrska formulacija algoritma temelji na interpretaciji z dinamičnim programi-
ranjem.
Definicija
∆k(u,v) =
{min{w(p) : u→p v}; če obstaja pot dolga a(≤ k) med u in v∞; sicer
je minimalna cena poti med u in v z uporabo največ k vozlǐsč.
Če je ∆k(s, v) < ∆N−1(s, v) za katerikoli v, potem obstaja negativni cikel, drugače
velja ∆k(s, v) = ∆N−1(s, v).
Računanje ∆k(s, v) je logično enako sprostitvi vseh vozlǐsč, povezanih z v.
Natančneje: ∆k(s, v) = minu{∆k−1(s, u) + W (u, v)}. Opazimo, da lahko ∆kizračunamo samo iz ∆k−1, zato lahko vse ostale ∆i zanemarimo.
Za predstavitev algoritma z matrično vektorskimi operacijami uporabimo (redko)
sosedno matriko dimenzije NxN za shranjevanje tež povezav (matrika cen) in 1xN
vektor za shranjevanje minimalnih razdalj poti v a (≤ k) korakih ∆k(s, ∗). Nadiagonali matrike cen imamo ničle (če smo že v točki i, nas ne stane nič, da
pridemo v točko i).
Formulo za ∆k(s, v) lahko prevedemo v matrični produkt precej direktno.
Imamo dk(v) = minu∈N(dk−1(u) + A(u, v)), kar je ravno produkt v polkolobarju
(min,+).
dk(v) = dk−1min.+ A(:, v)→ dk(v) = dk−1(v)min.+ A.
44 POGLAVJE 5. ALGORITMI
Ceno minimalne poti lahko predstavimo tudi d = d0AN , kjer je d0 vektor, ki ima
na mestu s 0, drugje pa je ∞. Ta izraz nam prinese dva algoritma za izračundolžine minimalne poti iz enega vozlǐsča.
PRVI je algebrska predstavitev Bellman-Fordovega algoritma spodaj.
Algoritem uporabi vektor velikosti reda N in množenje redkih matrik, tako da
opravi O(NM) primerjav.
Algoritem 5.3.18: Bellman-Ford (A,s)
d=I n t eg e r .MAX VALUE;
d( s )=0
for k:=1 to N−1 step 1 {d=d min.+A;
}i f (d n i d min.+A){
vrn i ” o b s t a j a j o negat ivne povezave ”
}
Kjer je:
• d vektor, ki pove, za katero vozlǐsče s nas zanimajo minimalne poti;
• d na koncu rešitev, če ne obstaja negativni cikel;
• A matrika cen.
DRUGI deluje tako, da najprej naračunamo A�N z zaporednim kvadriranjem.
Opazimo, da ta algoritem v bistvu izračuna najprej vse možne kombinacije mi-
nimalnih poti med vozlǐsči, potem pa produkt d min.+ A samo izbere vrstico iz
matrike A�N . Algoritem zahteva O(N3 logN) dela. Algebrski (prvi) algoritem
Bellman-Forda ima asimptotično bolǰso zmogljivost od zaporednega kvadriranja
v najslabšem primeru, a je pri zaporednem kvadriranju več možnosti paralelizma
kot pri prvem algoritmu.
5.3. BELLMAN-FORDOV ALGORITEM 45
d’=d min.+A =1
2
3
45
23
1
58
7
V 1 koraku pot iz vozlišča 3 v 1 stane 1 v 4 pa 5, v ostala vozlišča ne moremo
1
0 5
1
2
3
45
1
7
5
2
V NAJVEČ 2 korakih lahko iz vozlišča 3 pridemo v 1 in 4 po isti ceni, 2 po 7 v 5 pa po 12
V vse ostale najkrajše poti iz vozlišča 3 ostanejo iste, razen v 5, ki sedaj stane 10
1
2
3
45
15
23
T
d’‘=d’ min.+A =
1
0 5
T
7
12
d’‘’=d’’ min.+A =
1
0 5
T
7
10
Slika 5.7: Primer izračuna po Bellman-Fordovem algoritmu
Algoritem 5.3.20: Bellman-Ford (A,s)
d=I n t eg e r .MAX VALUE;
d( s )=0;
B=A;
mnozenje=c e i l ( l og ( do l z i na A)/ log ( 2 ) ) ;
for i :=1 to mnozenje s tep 1{temp=B min.+B;
B=temp ;
}
46 POGLAVJE 5. ALGORITMI
d=d min.+B;
i f (d n i d min.+B){vrn i ” obs ta ja negat ivna povezava”
}
Opazimo, da je iskanje minimalne poti po Bellman-Fordu podobno iskanju te poti
po algoritmu minimalne poti, le da tu ǐsčemo minimalno pot in ceno te poti samo za
vozlǐsče, določeno z vektorjem d. Pri prvem načinu res računamo samo en vektor,
pri drugem načinu je izračun matrike isti kot pri algoritmu minimalne poti, zadnji
korak pa je v bistvu prvi korak prvega načina (izberemo vrstico, ki prikazuje cene
poti za želeno vozlǐsče).
5.3.3 Računanje drevesa minimalnih poti
Kot dodatek k računanju cen minimalnih poti Bellman- Fordov algoritem najde
tudi minimalno pot. Te poti tipično shranjujemo s pomočjo π, preko katerega po-
tem lahko izračunamo drevo minimalnih poti. Algoritem lahko torej tudi razširimo,
tako da nam že sam vrne drevo minimalnih poti.
Opis in logika iskanja drevesa minimalnih poti, ki bo opisana v nadaljevanju, se
lahko trivialno aplicira tudi na algoritem Floyd-Warshall.
Če v grafu nimamo ciklov dolžine 0, je računanje drevesa minimalnih poti precej
enostavno.
Nastavimo π(v) = u, tako da d(u) +W (u, v) = d(v) za vsak v 6= s in ∆(s, v) 6=∞.Ker d(v) = d(u) + W (u, v) za nekatere u 6= v ∈ V in d(v) ≥ (d(u) + W (u, v)) zavse u ∈ V , je π(v) = argminu6=v{d(u) +W (u, v)}.Ta izraz lahko algebrsko predstavimo kot:
π = d argmin.+ (A+ diag(∞)),
kjer diag(∞) pomeni, da ima matrika po diagonali vrednosti ∞, s tem izključimozanke v grafu.
Opazimo, da π(s) nima vrednosti, zato nastavimo π(s) = NIL.
5.3. BELLMAN-FORDOV ALGORITEM 47
Podobno za vsak v z ∆(s, v) = ∞, vrednost π(s) ni pravilna, kar moramo tudiodpraviti. Če privzamemo, da je vsako vozlǐsče na grafu dosegljivo iz s, potem ne
obstaja vozlǐsče, da bi veljalo ∆(s, v) =∞.
V grafu z zankami uporaba enačbe π = d argmin.+ (A+ diag(∞)) najbrž ne bopripomogla k iskanju drevesa minimalnih poti, ker lahko argmin izbere vozlǐsča,
ki formirajo zanko. Zato želimo delati na grafu brez zank.
Za izračun kazalcev na starše na grafih brez zank imamo 2 pristopa.
PRVI pristop prilagodi naše operatorje za računanje na terkah s tremi elementi,
namesto na utežeh realnih vrednosti. Ta pristop sledi standardnemu Bellman-
Fordovemu algoritmu, tako da posodablja kazalce na starše z večanjem razdalje
med vozlǐsči.
Prednosti: ves čas se uporablja samo en polkolobar, v katerem računamo za vse
operacije, tako da je v izračune treba vpeljati le terke in na podlagi tega spremeniti
operacije iz algebrskega Bellman-Fordovega algoritma.
DRUGI pristop uporablja idejo iz enačbe π = d argmin. + (A + diag(∞)), insicer tako, da sledi izračunu drevesa minimalnih poti do konca.
Prednosti: uporablja enostavneǰse terke z dvema elementoma, ampak je treba
računati v različnih polkolobarjih. Pristop vključuje dodatne popravke za odpravo
nepravilnih elementov v π.
5.3.4 Računanje kazalcev na starše vozlǐsč
Računanje kazalcev na starše vozlǐsč je glavna razlika med osnovnim Bellman-
Fordovim algoritmom in računanjem drevesa minimalnih poti.
V originalnem Bellman-Fordovem algoritmu so kazalci na starše vozlǐsč posodo-
bljeni le, ko sprostimo povezavo in je nova razdalja strogo kraǰsa, kot že prej
znana.
Naj bo Πk ena od možnih vrednosti, ki jo lahko dodelimo kazalcu na starša vozlǐsča
v k-ti iteraciji Bellman-Fordovega algoritma.
48 POGLAVJE 5. ALGORITMI
Potem je
Πk(s, v) =
NIL; k = 0 & v = s
0; k=0 & v 6= sΠk−1(s, v); k ≥ 1 & ∆k(s, v) = ∆k−1(s, v){u : ∆k(s, v) = ∆k−1(s, v) +W (u, v)}; sicer
Po premisleku nam to pravilo da naslednjo lemo, ki pove, da je starš, ki ga algo-
ritem izbere, res starš na minimalni poti, v največ k korakih, ki je najceneǰsa.
Lema 5.3.1 Recimo, da imamo graf z določenim vozlǐsčem, ki je začetek poti in
brez zank.
Potem u 6= NIL ∈ Πk(s, v), če in samo če obstaja a in pot p =(s,...u,v) taka, daw(p) = ∆k(s, v) in ne obstaja s→p
′v, da bi veljalo w(p′) = ∆k(s, v) in | p′ |
5.3. BELLMAN-FORDOV ALGORITEM 49
Cilj je, da povežemo razdaljo in kazalce na starše vozǐsč s spreminjanjem naših
operacij tako, da delujejo na 3-terkah. Te 3-terke so sestavljene iz naslednjih
komponent: celotna cena poti, dolžina poti in predzadnje vozlǐsče. S pametno
posodobitvijo operatorjev lahko še vedno uporabimo iste algoritme, ki temeljijo
na že prej obrazloženi algebri.
Definirajmo naše skalarje kot 3-terke v obliki (w, h, π) ∈ S = (R∞ × N × V ) ∪{(∞,∞,∞), (0, 0, NIL)}, kjer R∞ = R∪{∞} in N =1,2,3,.... Vrednost (∞,∞,∞)pomeni, da pot ne obstaja, in vrednost (0,0,NIL) pomeni pot od vozlǐsča do samega
sebe. Prva vrednost w ∈ R∞ je cena poti, h ∈ N je dolžina poti oziroma številoiteracij, π ∈ V je predzadnje vozlǐsče na poti.Glede na definicijo teh 3 vrednosti je polnjenje sosedne matrike naslednje:
A(u, v) =
(0, 0, NIL); u = v
(W (u, v), 1, u); u 6= v & (u, v) ∈ E(∞,∞,∞); (u, v) /∈ E
Opazimo, da je polje v matriki v bistvu določeno s ceno povezave. Tudi osnovni
algoritem že shranjuje u v neki strukturi, torej pri implementiranju te različice
algoritma ni nujno, da se nam poveča količina prostora, ki ga potrebujemo za
sosedno matriko.
Za nastavljanje osnovnega vektorja razdalje d0, ki nam pove, za katero vozlǐsče nas
zanimajo minimalne poti, velja:
d0(v) =
{(0, 0, NIL); v = s
(∞,∞,∞); sicerZa dodatno operacijo, o kateri smo že govorili, uporabimo operator lmin, ki je
definiran kot leksikografski minimum in primerja prvo vrednost 3-terke takole:
lmin(w1, h1, π1), (w2, h2, π2)) =
(w1, h1, π1); w1 < w2 ∨ (w1 = w2 ∧ h1 < h2)∨
(w1 = w2 ∧ h1 = h2 ∧ u1 < u2)(w2, h2, π2); sicer
Brez izgube za splošnost lahko predpostavimo, da so vozlǐsča števila 1,2,...N in
NIL manǰse od ∞ za vse v ∈ V .Za vse operacije z množenjem definiramo novo binarno funkcijo +rhs. Ta funkcija
doda prvi dve vrednosti terke in ohrani tretjo vrednost terke argumenta, ki je na
desni strani operanda.
50 POGLAVJE 5. ALGORITMI
(w1, h1, π1) +rhs (w2, h2, π2) =
{(w1 + w2, h1 + h2, π2); π1 6=∞ & π2 6= NIL(w1 + w2, h1 + h2, π1); sicer
Izjemo za π1 = ∞ potrebujemo, da imamo identiteto za množenje, kadar je taoperator uporabljen pri množenju v konjunkciji v lmin za seštevanje. Izjema za
π2 = NIL je popravek.
Opazimo, da v nasprotju z običajnim +, +rhs ni komutativna.
Lema 5.3.2 S=(R∞×N×V )∧{(∞,∞,∞), (0, 0, NIL)} nad operatorjem lmin.+rhsje polkolobar.
Pravilnost algoritma, ki bazira na terkah, dokazuje naslednja lema. Spomnimo
se, da je bil cilj transformacije na 3-terke ohraniti zvezo dn = dA�N , kjer sta
seštevanje in množenje definirana z lmin in +rhs.
Lema 5.3.3 Recimo, da imamo graf z določenim vozlǐsčem s. Naj bosta matrika
sosednosti A in začetni vektor d0 določena po zgornjih enačbah za A in d0 in naj
bo dk = dk−1lmin. +rhs A; k ≥ 1. Če je h ≤ k ∈ N minimalno število iteracij(doľzina poti) minimalne poti (v največ k korakih) iz vozlǐsča s v vozlǐsče v, potem
∃u ∈ V tako da dk(v) = (∆k(s, v), h, u)∧ u = min{v : v ∈ Πk(s, v)} in obstaja potdoľzine h; p=(s,...u,v) z w(p) = ∆k(s, v).
Če ne obstaja pot z največ k koraki, potem dk(v) = (∞,∞,∞). Za začetno vozlǐsčevelja dk(s) = (0, 0, NIL).
RAČUNANJE KAZALCEV NA STARŠE NA KONCU
Pri tem pristopu sledimo enaki ideji; spremenimo le skalarje, tako da delujejo na
zankah. Ta pristop še vedno uporablja terke, ampak enostavneǰse.
Uporabimo 2-terke (w, h) ∈ N∞ × (N ∪ {0,∞}). Vrednosti imajo isti pomen kotpri 3-terkah, samo da tu v terki nimamo kazalca na starša. Nastavljanje A in d0
je očitno.
Bellman-Fordov algoritem za 2-terke ostaja enak kot za 3-terke, le da zdaj upo-
rabimo funkcijo lmin namesto navadnega seštevanja in enostavneǰso + namesto
množenja. Z drugimi besedami: dk = dk−1 lmin. + A. Pravilnost sledi iz leme
5.3.3 kot pri prvem načinu, ker so operatorji povsem enaki kot pri 3-terkah, le da
tu ignoriramo tretji element.
5.4. FLOYD-WARSHALLOW ALGORITEM 51
Za izračun kazalcev na starše vozlǐsč nastavimo: π = dn argmin.+ (A+diag((∞,∞))).Naslednja lema trdi, da so vse vrednosti v π(v) pravilne za vsa vozlǐsča v 6= s, kiso dosegljiva iz vozlǐsča s.
Lema 5.3.4 Recimo, da imamo graf z določenim začetnim vozlǐsčem s in brez
zank. Naj bo dn(v) = (∆k(s, v), hv), kjer je hv najmanǰsa cena najceneǰse poti iz
vozlǐsča s v vozlǐsče v. Naj bo π = dn argmin. + (A + diag((∞,∞))). Potem zavse v ∈ V –s, za katere velja ∆k(s, v)
52 POGLAVJE 5. ALGORITMI
Čas za izvajanje je O(N3) zaradi trojne for zanke. V algoritmu, katerega psevdo-
koda je zapisana spodaj, shranjujemo vse Dk, čeprav bi lahko shranjevali samo Dk
in Dk−1 v vsakem koraku, torej je poraba prostora O(N2)
5.4.1 Standardna implementacija Floyd-Warshallovega al-
goritma
Algoritem 5.4.22: Standardni Floyd-Warshallov algoritem
for u:=1 to N step 1{for v:=1 to N step 1{
D 0 (u , v)=W(u , v ) ;
i f (u==v){Pi 0 (u , v)=NIL ;
}i f (u != v AND W(u , v)< I n t e g e r .MAX VALUE){
Pi 0 (u , v)=u ;
} else {Pi 0 (u , v)= n e d e f i n i r a n ;
}}
}for k:=1 to N step 1{
for u:=1 to N step 1{for v:=1 to N step 1{
i f (D (k−1)(u , k)+D (k−1)(k , v )
5.4. FLOYD-WARSHALLOW ALGORITEM 53
}}
}
Kjer je
• Pi k je predzadnje vozlǐsče na najceneǰsi poti, kjer lahko uporabimo le vo-zlǐsča od 1 do k.
Element Pi k ni enak tistemu pri Bellman-Fordovem algoritmu, kjer je element
množica predzadnjih vozlǐsč na vsaki minimalni poti, ki ima dolžino največ k od
vozlǐsča u do vozlǐsča v.
Če definiramo πk(v) = Πk(s, v), potem πk vključuje drevo minimalnih poti iz
vozlǐsča s. Celotna množica, zajeta v πk, pa ne formira nujno drevesa.
5.4.2 Algebrska implementacija Floyd-Warshallovega algo-
ritma
Pri implementaciji algoritma z matričnimi in vektorskimi operacijami uporabimo
matriko Dn dimenzije N×N za shranjevanje cen poti (matriko cen). InicializiramoD0 = A oziroma D0(u, v) = W (u, v); D0(u, u) = 0
Rekurzivna definicijaD0 upošteva 2 možnosti, in sicer, ali minimalna pot iz vozlǐsča
u do vozlǐsča v, ki lahko vsebuje vozlǐsča od 1 do k, vsebuje vozlǐsče k ali ne.
Algoritem deluje tako, da izračuna teže minimalnih poti, ki vsebujejo vozlǐsče k
za vse pare vozlǐsč (u,v) naenkrat. Natančneje: k-ti stolpec Dk oziroma Dk(k, :)
vsebuje cene minimalnih poti, ki gredo skozi vozlǐsče k. Podobno k-ta vrstica
Dk(k, :) vsebuje cene minimalnih poti iz vozlǐsča k v katerokoli vozlǐsče u. Torej
je vse, kar moramo narediti, da dodamo vsak par teh vrednosti, tako dobimo cene
minimalnih poti, ki gredo skozi vozlǐsče k, in to storimo tako, da računamo:
Dk = Dk−1min.+ (Dk−1(:, k)min.+Dk−1(k, :))
Algoritem izvede N množenj vektorjev, zato je njegova kompleksnost O(N3).
54 POGLAVJE 5. ALGORITMI
Algoritem 5.4.24: Algebrski Floyd-Warshallov algoritem
D=A;
for k:=1 to N step 1{D=D min.+ (D( : , k ) min.+D(k , : ) ) ;
}
Kjer je :
• A matrika cen;
• min.+ je množenje v polkolobarju (min,+), opisan pri Bellman-Fordovemalgoritmu;
• D(:,k) matrika, ki vsebuje vse vrstice in k-ti stolpec;
• D(k,:) matrika, ki vsebuje vse stolpce in k-to vrstico.
5.4.3 Rekonstrukcija minimalne poti
Poenostavljeno minimalno pot rekonstruiramo tako, da si vzporedno z matriko cen
D shranjujemo matriko PATH, ki je z D povezana tako:
• D(i,j)=cena poti med i in j;
• PATH(i,j)=predhodno vozlǐsče k vozlǐsča j, preko katerega smo prǐsli iz vo-zlǐsča i do vozlǐsča j po minimalni poti;
• če PATH(i,j)=0 in D(i,j)= ∞ to pomeni, da od vozlǐsča i do vozlǐsča j neobstaja nobena pot;
• če PATH(i,j)=0 in D(i,j) 6= ∞ to pomeni, da na minimalni poti med vo-zlǐsčema i in j ni vmesnega vozlǐsča, minimalna pot je kar povezava med
vozlǐsčema.
5.4. FLOYD-WARSHALLOW ALGORITEM 55
Vzporedno vodenje matrike PATH implementiramo tako, da se vsakič, ko se spre-
meni minimalna pot v polju D(i,j) spremeni tudi polje PATH(i,j), in sicer vstavimo
vozlǐsče, skozi katerega ravnokar ugotavljamo minimalno pot.
Algoritem 5.4.26: Vzdrževanje vozlǐsč na minimalni poti
for m:=1 to N−1 step 1{for k:=1 to N step 1 {
for i :=1 to N step 1 {for j :=1 to N step 1{
i f (A[ i ] [ k]+A[ k ] [ j ]
56 POGLAVJE 5. ALGORITMI
} else {vrni− DobiPot ( i , vmesnoVozl isce)+vmesnoVozl isce+DobiPot ( vmesnoVozl isce , j ) ;
}
A =1
2
3
45
23
1
58
7
0 8 1 6 1111 0 12 2 3 1 7 0 5 10
13 2 14 0 5 8 3 9 5 0
PATH =
0 4 0 3 4 5 0 5 0 0 0 4 0 0 4 5 0 5 0 2 0 0 1 2 0
- DobiPot(1,2)=4- DobiPot(1,4)=3- DobiPot(1,3)=’ ‘- DobiPot(3,4)=’ ‘
Pot=1 3 4 2
Slika 5.8: Primer rekonstrukcije poti po Floyd-Warshallovem algoritmu
5.5 Primov algoritem
5.5.1 Minimalno vpeto drevo
Definicija DREVO je v teoriji grafov graf, v katerem sta poljubni dve točki po-
vezani z natanko eno enostavno potjo. Drevo je v bistvu vsak povezan graf brez
ciklov. Gozd je nepovezana unija dreves [9].
Definicija VPETO DREVO T povezanega neusmerjenega grafa G je drevo, ki
ga sestavljajo vse točke in nekatere (ali pa morda vse) povezave grafa G. Vpeto
5.5. PRIMOV ALGORITEM 57
drevo je izbira povezav, ki tvorijo drevo preko vseh točk. Zato velja, da je število
povezav vpetega drevesa enako V-1, kjer je V število oglǐsč grafa G. To pomeni,
da vsaka točka leži na drevesu, pri tem pa ne nastane noben cikel. Vpeto drevo
povezanega grafa G lahko definiramo tudi kot maksimalno množico povezav G,
ki ne vsebuje ciklov, ali pa kot minimalno množico vseh povezav, ki povezuje vse
točke. [9]
Teža vpetega drevesa je vsota tež (cen) povezav, ki jih drevo vsebuje. Defini-
ramo jo takole:
w(T ) =∑e∈T
w(e)
Minimalno vpeto drevo je vpeto drevo, ki ima med vsemi vpetimi drevesi grafa
najmanǰso težo (ceno). Veljati mora w(T ) ≤ w(T ′) za vsako vpeto drevo T’.
Pri problemu minimalnega vpetega drevesa imamo dan neusmerjen graf G(E,V)
s cenam povezav w: E → R∞, kjer W (u, v) = ∞, če med vozlǐsčema u in v nipovezave. Zaradi poenostavitve je W(v,v)=0 za vse v ∈ V .Podoben problem kot je iskanje minimalnega vpetega drevesa, je iskanje minimal-
nega vpetega gozda v nepovezanem grafu, ki ga lahko rešimo direktno s pomočjo
problema iskanja minimalnega vpetega drevesa v vsaki nepovezani komponenti
grafa. Za poenostavitev problema bomo predpostavljali, da je graf povezan.
Primov algoritem je eden od algoritmov, ki rešujejo problem minimalnega vpe-
tega drevesa. Algebrska različica v splošnem nima tako dobrih zmogljivosti kot
standardna različica.
5.5.2 Standardna implementacija algoritma
Primov algoritem rešuje problem minimalnega vpetega drevesa z ustvarjanjem
množice S, ki vsebuje povezave, vsebovane v vpetem drevesu. V vsaki iteraciji
v S dodamo “najbližjo” povezavo, ki še ni v S. Rečemo, da je povezava (u,v)
“najceneǰsa” povezava, ki ni v S, če u ∈ S ∧ v /∈ S ∧W (u, v) = min{(u′, v′) : u′ ∈S ∧ v′ /∈ S}. Recimo, da je povezava (u,v) najceneǰsa povezava, ki je še nimamov S in u ∈ S. Potem Primov algoritem posodobi S = S U {v} in T=T U {(u,v)}.
58 POGLAVJE 5. ALGORITMI
To ponovimo N-1 krat, na koncu je T naše vpeto drevo, S pa množica vozlǐsč, ki
so vsebovana v vpetem drevesu.
1
34
6
trenutno minimalnovpeto drevo
ostali graf
T G
2
34
6
trenutno minimalnovpeto drevo
ostali graf
T G
8
V vsaki iteraciji dodamo v minimalno vpeto drevo najcenejšo povezavo z grafom
Slika 5.9: Skica delovanja Primovega algoritma
Primov algoritem je v osnovi implementiran z uporabo prioritetne vrste. Prio-
ritetna vrsta je podatkovna struktura, ki dinamično vzdržuje zaporedje množice
objektov s ključi in podpira naslednje operacije:
• INSERT(Q,x) : vstavi objekt s ključem x v vrsto (Q=Q U {x})
• Q=BUILD-QUEUE(x1, x2, ..., xn): naredi vstavljanje objektov x1, x2, ..., xnv prazno vrsto Q (Q={x1, x2, ..., xn}).
• EXTRACT-MIN(Q): izbrǐse in vrne element v Q z najmanǰsim ključem. Čepredpostavimo, da imamo enolične ključe: če ključ(x) = miny∈Q, potem
Q=Q-{x}.
5.5. PRIMOV ALGORITEM 59
• DECREASE-KEY(Q,x,k): zmanǰsa vrednost ključa elementa x na vrednostk, pri predpostavki, da k ≤ key(x). Tukaj je x kazalec na objekt, kateremumanǰsamo ključ.
Naivna implementacija prioritetne vrste je neurejen seznam. Tukaj sta INSERT
in DECREASE-KEY trivialna in potrebujeta čas O(1). EXTRACT-MIN je O(V)
(kjer je V število vozlǐsč v grafu), saj moramo v najslabšem primeru preiskati ce-
loten seznam vozlǐsč. Pri uporabi Fibonaccijeve kopice ima časovno kompleksnost
O(M + NlogN) (kjer je M število povezav in N število vozlǐsč na grafu).
Algoritem 5.5.30: Standardna implementacija Primovega algoritma
f o r each v i z V {key ( v)= I n t e g e r .MAX VALUE;
p i ( v)=NIL ;
}
cena =0;
s=Random( s i z V) ;
key ( s )=0;
Q=BUILD−QUEUE(V) ;while (Q ni 0){
u=EXTRACT−MIN(Q) ;cena=cena + W( pi (u ) , u ) ;
f o r each u ; (u , v ) i z E {i f ( v i z Q & W(u , v ) < key ( v ) ){
DECREASE−KEY(Q, v ,W(u , v ) ) ;p i ( v)=u ;
}}
}
Kjer je:
60 POGLAVJE 5. ALGORITMI
• random funkcija, ki naključno izbere vozlǐsče s iz V;
• pi shranjuje starše vozlǐsča.
5.5.3 Algebrska implementacija Primovega algoritma
Uporabimo redko matriko dimenzije N ×N A za shranjevanje cen povezav, vektors dimenzije 1×N za navajanje vsebnosti v množici S in vektor d dimenzije 1×Nza shranjevanje cen povezav, ki niso v S.
s in d vzdržujemo takole:
s(v) =
{∞; v ∈ S0; sicer
d(v)=minu∈SW (u, v).
Če v /∈ S, potem d(v) poda najceneǰso povezavo, ki povezuje vozlǐsče v z S. Čev ∈ S, potem d(v) = 0. Algoritem najprej najde vozlǐsče, ki je najbližje S (karpomeni, da je povezava vmes najceneǰsa). Ta korak izvede argmin čez celoten
vektor, zato potrebuje O(N) časa za vsako iteracijo. Seštevanje vektorja zmanǰsa
ključe vseh sosedov vozlǐsča u. Ta korak lahko traja O(N) časa za vsako iteracijo,
ampak v skupnem vsako povezavo posodobimo le enkrat, zato je iteracij v bistvu
O(M). Skupno ima torej algoritem kompleksnost O(N2).
Algoritem 5.5.32: Algebrska implementacija Primovega algoritma
s =0;
cena =0;
s=Random( s i z V) ;
s (1)= In t eg e r .MAX VALUE;
d=A( 1 , : ) ;
while s n i I n t eg e r .MAX VALUE{u=argmin{ s+v } ;s (u)= I n t e g e r .MAX VALUE;
cena=cena+d(u ) ;
d=min{d ,A(u , : ) } ;}
5.5. PRIMOV ALGORITEM 61
Kjer je:
• A matrika cen;
• d in s vektorja, opisana zgoraj;
• argmin funkcija, ki vrne indeks elementa, ki ima minimalno ceno seštevkavektorjev s in v;
• min funkcija, ki sestavi vektorja v1 in v2 v v tako, da velja v[i] = min{v1
Top Related