Algoritmus pro hledání nejkratší cesty orientovaným grafem

Transkript

Algoritmus pro hledání nejkratší cesty orientovaným grafem
Druhá zápočtová práce z předmětu Programování v Matlabu
Martin Dlask
Algoritmus pro hledání nejkratší cesty orientovaným grafem
1.1 Úvod
Naprogramoval jsem v Matlabu funkci, která dokáže určit nejkratší cestu v orientovaném
grafu mezi libovolnými dvěma vrcholy. Nastudoval jsem si postupně Dijkstrův a
Floydův-Warshallův algoritmus pro hledání cesty v grafu s ohodnocenými hranami a
uvážil, že v Matlabu se bude lépe implementovat ten druhý, protože více využívá operace
s maticemi, které jsou pro Matlab „přirozené“.
1.2 Teorie
Pro maticovou reprezentaci orientovaného grafu se často používá tzv. matice vzdáleností.
Tato matice má rozměry
, kde n je celkový počet vrcholů v grafu. Pro jednoduchost
budeme předpokládat, že máme jednotlivé vrcholy v grafu očíslované pomocí prvků
z množiny *
+. V této matici víme, že na pozici (i, j) bude pro
buď kladné reálné
číslo, nebo nekonečno. Kladné reálné číslo v matici říká, že v grafu existuje hrana z vrcholu i
do vrcholu j a jeho hodnota udává přímou vzdálenost z vrcholu i do vrcholu j. Na pozici
bude vždy 0, protože předpokládáme, že vzdálenost vrcholu od něj samého je rovna 0.
Na základě slovního popisu bychom mohli zkonstruovat následující definici:
Nechť je dán orientovaný graf G s vrcholy V =*
+ a nechť
. Potom matici A
nazvu matici vzdáleností, pokud
*
+
*
+ platí, že
● A(i,j) = 0, pokud i = j
● A(i,j) = r, pokud vede hrana z i do j a její ohodnocení je rovno r
● A(i,j) = ∞, jinak
S takovou maticí bude muset umět funkce pracovat. Floydův-Warshallův algoritmus funguje
takzvaně iteračně, což znamená, že pracuje po jednotlivých krocích, kde se při každém
opakování stejného kroku více přiblíží finálnímu řešení. Ukažme si to na následujícím
příkladu, kde budeme mít zadaný následující graf a jeho matici vzdáleností A:
1
Druhá zápočtová práce z předmětu Programování v Matlabu
Martin Dlask
Pro takový graf bude vypadat matice vzdáleností:
1
2
3
4
5
0
3
∞
∞
∞
∞
0
2
∞
∞
∞
∞
∞
∞
3
1
∞
1
4
∞
∞
∞
∞
6
∞
V každém kroku algoritmu budeme hledat, jestli neexistuje cesta mezi dvěma vrcholy ještě
přes nějaký další vrchol. To by obecně znamenalo, že pokud budeme hledat cestu mezi i a j
v k-té iteraci, hledáme alternativní cestu přes dalších k vrcholů.
1
2
3
4
5
Matice se v jedné iteraci s iteračním indexem k přepočítá dle následujícího schématu:
A(i,j) =inf{A(i,j), inf * (
)
(
)
(
)
(
*
To se dá také zapsat, že budeme procházet všechna
A(i,j) = inf{A(i,j) ; inf * (
)
)
(
(
)
(
)+}
+ a budeme hledat min
)|
*
+++
Toto je nutné udělat pro všechny prvky (i,j) z matice A. Otázkou ještě je, kolikrát musíme
tento přepočet provést, tj. kolik iterací program projde tak, aby úloha dospěla ke svému
řešení. Je dokázáno, že výpočet je nutné provádět, dokud počet iterací k splňuje následující
podmínku:
kde n je celkový počet vrcholů
Například prvek na pozici (3,4) přepočítáme v první iteraci (k=1) následovně:
1
2
3
4
5
1
2
3
4
5
0
∞
∞
1
∞
3
0
∞
∞
∞
∞
2
0
1
∞
∞
∞
∞
0
6
∞
∞
3
∞
0
A(3,4) = inf{∞;inf{∞,∞,∞,∞,9}}=inf{∞;9}=9
Pokud bychom tento postup aplikovali na všechna (i,j) dostaneme tabulku:
1
2
3
4
5
1
2
3
4
5
0
∞
∞
1
7
3
0
∞
4
∞
5
2
0
1
7
∞
∞
9
0
6
∞
5
3
4
0
2
Druhá zápočtová práce z předmětu Programování v Matlabu
Martin Dlask
Vidíme například, že již po prvním kroku se dá dostat z vrcholu 4 do všech ostatních vrcholů.
Nelze však tvrdit, že tyto cesty jsou nejkratší, protože by mohl existovat vrchol, přes který by
se cesta mohla ještě dále zkrátit.
Matice v konečné fázi výpočtu (tj. pro k=3, protože n=6 a 24-1>6) vypadá následovně:
1
2
3
4
5
1
2
3
4
5
0
12
10
1
7
3
0
13
4
10
5
2
0
1
7
14
11
9
0
6
8
5
3
4
0
Výstupem funkce je nejen tato matice R, ale také druhá matice M, která udává, jakým
způsobem se lze dostat z vrcholu i do vrcholu j. Na pozici M(i,j) je 0, pokud je i=j nebo vede
orientovaná hrana z vrcholu i do vrcholu j, na pozici M(i,j) je r *
+, pokud cesta mezi
i a j vede přes vrchol r. Pro náš příklad vypadá matice M následovně:
1
2
3
4
5
1
2
3
4
5
0
5
4
0
4
3
0
4
1
1
2
0
4
0
4
3
3
5
0
0
2
3
0
3
3
Můžeme z ní vyčíst, přes jaké vrcholy vede nejkratší cesta z vrcholu i do vrcholu j.
Př. Jaká je nejkratší cesta z vrcholu 3 do vrcholu 4?
Protože M(3,4) = 5, vede přes vrchol 5, zároveň M(3,5) = M(5,4) = 0, což znamená, že
posloupnost orientovaných hran 3→5→4 je hledanou nejkratší cestou.
Tímto způsobem je možné jednoduše odečíst délku cesty mezi vrcholem i a j z matice R, a
posloupnost vrcholů, kterými se prochází, z matice M.
1.3 Program
Funkce na vstupu dostane matici vzdáleností a pomocí Floydova-Warshallova algoritmu
vypočítá matici R nejkratších vzdáleností mezi zadanými vrcholy, a určí také zmíněnou matici
M. Počet iterací k nikdy nepřekročí hodnotu
. To je také podmínka v cyklu while,
který určuje, jestli je již výpočet ukončen, nebo ne.
3
Druhá zápočtová práce z předmětu Programování v Matlabu
Martin Dlask
function [R,M] = FloydW(A)
%spočítá na základě matice vzdáleností nejkratší cestu mezi všemi uzly
grafu
% na začátku zjistíme počet vrcholů, dozvíme se ho z rozměru tabulky
n = size(A,1);
% iterační index nastavíme na hodnotu 1
k=1;
%pro výstupní matice M a R vytvoříme místo v paměti ze znalosti počtu
vrcholů
R = zeros(n,n);
M = zeros(n,n);
while (exp((k-1)*log(2)) < n)
% dokud není splněna podmínka o maximálním počtu iterací
for i=1:n
for j=1:n
% pro každý řádek
% pro každý sloupec
s = A(i,j);
index = 0;
% hodnota, která se bude zlepšovat
% uchová index, ve kterém se našlo minimum
for l = 1:n
% pro každou dvojici ve dvou sloupcích
if (A(i,l)~=inf)&&(A(l,j)~=inf)
if s > (A(i,l)+A(l,j))
% pokud jsme našli lepší hodnotu cesty z i do j přes
% k+1 vrcholů
s = A(i,l)+A(l,j);
index = l;
end
end
end
R(i,j) = s;
% konstruujeme matici R po prvcích
if index~=0
%pokud bylo nalezeno reálné minimum, existuje cesta o délce k+1
M(i,j) = index;
end
end
end
k = k+1;
A = R;
% zvýšíme iterační index
% v dalším kroku budeme počítat již s novou maticí
end
R = A;
for i=1:n
R(i,i)=0;
end
end
4
Druhá zápočtová práce z předmětu Programování v Matlabu
1.4 Výstupy na obrazovku pro různé vstupy
Pro naše zadání, které sloužilo jako příklad v teorii, vypadá graf následovně:
Jeho matice vzdáleností:
Výstup do konzole vypadá následovně:
5
Martin Dlask
Druhá zápočtová práce z předmětu Programování v Matlabu
Jiný příklad, náš graf bude vypadat následovně:
Jeho matice vzdáleností:
Výstup do konzole vypadá následovně:
6
Martin Dlask
Druhá zápočtová práce z předmětu Programování v Matlabu
Martin Dlask
1.5 Závěr
Podařilo se mi naprogramovat funkci, která by měla najít nejkratší cestu mezi všemi vrcholy
v orientovaném grafu. Jak jsem již zmiňoval v úvodu, bylo vhodné použít právě
Floyd-Warshallův algoritmus, i kvůli tomu, že často prohledáváme všechny prvky matice a ve
vstupu i výstupu se nachází také matice. Výhodou oproti ostatním algoritmům může být, že
známe přesný počet kroků již ze zadání, tudíž můžeme hned odhadnout, jak složitý výpočet
bude. Složitost takového algoritmu při zadání n prvků s předpokládaným počtem
iterací je úměrná (
)
)
(
). Tato o trochu vyšší
složitost než u Dijkstrova algoritmu (která je (
) je však vyvážena faktem, že
Floyd-Warshall je univerzálnější - v případě potřeby spočítá nejkratší cestu i v grafu se
záporným ohodnocením hran.
1.6 Reference
[1] http://kam.mff.cuni.cz/~kuba/ka/min_cesta.pdf
[2] http://www.pms.ifi.lmu.de/lehre/compgeometry/Gosper/shortest_path/shortest_path.html
[3] http://stackoverflow.com/questions/4212431/dijkstra-vs-floyd-warshall-finding-optimalroute-on-all-node-pairs
[4] http://www.algoritmy.net/article/36597/Nejkratsi-cesta
7

Podobné dokumenty

tisk

tisk O(nw ·p(n)) (Galil,Margalit, 1997, Seidel, 1995) – O(nw) je časová složitost násobení dvou čtvercových matic řádu n – p(n) je jistá funkce shora omezená polylogaritmickou funkcí v n

Více

Zde

Zde dálkového vypnutí pohonu(ů) nebo stažení otáček motoru(ů) na minimum. Ze soutěže jsou vyloučeny vrtulníky. Soutěží se na přesnost přistání v úlohách A, B a v dovednostní úloze C. Každá úloha se lét...

Více

Grafové algoritmy

Grafové algoritmy • Algoritmus hledající minimální cestu mezi všemi páry vrcholů (all-pair shortest path algorithm) • Vhodný pro husté grafy – v tom případě rychlejší než Dijkstra opakovaný pro všechny vrcholy • Pra...

Více

Grafové algoritmy

Grafové algoritmy Floyd-Warshallův algoritmus • Algoritmus hledající minimální cestu mezi všemi páry vrcholů (all-pair shortest path algorithm) • Vhodný pro husté grafy – v tom případě rychlejší než Dijkstra opak...

Více