23
Algoritmy na ohodnoceném grafu Dvě základní optimalizační úlohy: Jak najít nejkratší cestu mezi dvěma vrcholy? Dijkstrův algoritmus Jak najít minimální kostru grafu? Jarníkův a Kruskalův algoritmus 1 s t

Algoritmy na ohodnoceném grafu - cvut.cz · 2013. 3. 1. · Algoritmy na ohodnoceném grafu . Dvě základní optimalizační úlohy: Jak najít nejkratší cestu mezi dvěma vrcholy?

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Algoritmy na ohodnoceném grafu - cvut.cz · 2013. 3. 1. · Algoritmy na ohodnoceném grafu . Dvě základní optimalizační úlohy: Jak najít nejkratší cestu mezi dvěma vrcholy?

Algoritmy na ohodnoceném grafu

Dvě základní optimalizační úlohy:

Jak najít nejkratší cestu mezi dvěma vrcholy?

• Dijkstrův algoritmus

Jak najít minimální kostru grafu?

• Jarníkův a Kruskalův algoritmus

1

st

Page 2: Algoritmy na ohodnoceném grafu - cvut.cz · 2013. 3. 1. · Algoritmy na ohodnoceném grafu . Dvě základní optimalizační úlohy: Jak najít nejkratší cestu mezi dvěma vrcholy?

Plánování trasy robotu

2

Page 3: Algoritmy na ohodnoceném grafu - cvut.cz · 2013. 3. 1. · Algoritmy na ohodnoceném grafu . Dvě základní optimalizační úlohy: Jak najít nejkratší cestu mezi dvěma vrcholy?

Ohodnocený graf

Orientovaný nebo neorientovaný graf , ke

kterému přidáme funkci

• funkce každé hraně přiřazuje hodnotu

3

),( EVG =R: →Ec

Ee∈ ( )ec

11

8 2.57

13−

Page 4: Algoritmy na ohodnoceném grafu - cvut.cz · 2013. 3. 1. · Algoritmy na ohodnoceném grafu . Dvě základní optimalizační úlohy: Jak najít nejkratší cestu mezi dvěma vrcholy?

Nejkratší cesta v ohodnoceném grafu

4

.. ohodnocený orientovaný graf

.. cesta v

délka cesty :

Budeme předpokládat, že ohodnocení je nezáporné.

Jsou-li dány vrcholy , jak nalezneme cestu nejkratší

délky z do ?

0)(: ≥∈∀ ecEe

),( EVG =

P GP ∑

=Pe

ecPd )()(

Vts ∈,s t

Page 5: Algoritmy na ohodnoceném grafu - cvut.cz · 2013. 3. 1. · Algoritmy na ohodnoceném grafu . Dvě základní optimalizační úlohy: Jak najít nejkratší cestu mezi dvěma vrcholy?

Řešení za pomoci mravenců • v každém čeká mravenců, každý na jiné výstupní hraně • mravenci se pohybují stejnou rychlostí, délka hrany odpovídá jejímu

ohodnocení

• v čase vystartují mravenci z vrcholu

• jakmile mravenec M doběhne po své hraně do koncového vrcholu ,

startují všichni mravenci čekající v a M ze závodu odstupuje • čekáme na prvního mravence, který se v čase objeví ve vrcholu

5

Vv∈ )(deg voutG

0T s

1T t

uu

s

t

Page 6: Algoritmy na ohodnoceném grafu - cvut.cz · 2013. 3. 1. · Algoritmy na ohodnoceném grafu . Dvě základní optimalizační úlohy: Jak najít nejkratší cestu mezi dvěma vrcholy?

Řešení za pomoci mravenců

Jak zjistíme, kudy vedla nejkratší cesta z do ?

• V každém vrcholu sledujeme, který mravenec sem dorazí jako první a

poznamenáme si zde, odkud přišel (pokud dorazí jako první více

mravenců současně, vybereme si jednoho z nich).

• Nejkratší cestu vystopujeme zpětně z do .

Cílem algoritmu bude projít vrcholy grafu v pořadí, které odpovídá času prvního dosažení mravencem (tj. min.

vzdálenostem vrcholů od ). 6

s t

t s

s

Page 7: Algoritmy na ohodnoceném grafu - cvut.cz · 2013. 3. 1. · Algoritmy na ohodnoceném grafu . Dvě základní optimalizační úlohy: Jak najít nejkratší cestu mezi dvěma vrcholy?

Dijkstrův algoritmus

7

T .. množina vrcholů, pro které již známe výslednou cestu

minimální délky z vrcholu s

F .. prioritní fronta

D[v] .. délka doposud zjištěné nejkratší cesty do v

P[v] .. předek vrcholu v doposud zjištěné cestě

Page 8: Algoritmy na ohodnoceném grafu - cvut.cz · 2013. 3. 1. · Algoritmy na ohodnoceném grafu . Dvě základní optimalizační úlohy: Jak najít nejkratší cestu mezi dvěma vrcholy?

Dijkstrův algoritmus Dijkstra(G,s):

for each v in V do

P[v]:= NULL; D[v]:= ;

done

D[s]:= 0; T:= Ø; // inicializace prázdnou množinou

vytvoř prioritní frontu F z vrcholů ve V s klíči D[v];

while not F->empty() do

v := F->deleteMin(); T->add(v);

for each w in Sousede[v] do

if D[w] > D[v]+c((v,w)) then

D[w]:= D[v]+c((v,w));

P[w]:= v; F->changeKey(w,D[w]);

endif

done

done

8

Page 9: Algoritmy na ohodnoceném grafu - cvut.cz · 2013. 3. 1. · Algoritmy na ohodnoceném grafu . Dvě základní optimalizační úlohy: Jak najít nejkratší cestu mezi dvěma vrcholy?

Prioritní fronta

• Datová struktura podobná frontě

• Každý prvek má navíc definovaný klíč (prioritu)

• Pokud vložíme na konec nový prvek, předběhne ve frontě

všechny prvky s vyšším klíčem

• Operace:

Insert(v), DeleteMin, ChangeKey(v, newValue)

9

R∈p

)1,(a )2,(b )3,(c )3,(d )4,(e )2,( fInsert

Page 10: Algoritmy na ohodnoceném grafu - cvut.cz · 2013. 3. 1. · Algoritmy na ohodnoceném grafu . Dvě základní optimalizační úlohy: Jak najít nejkratší cestu mezi dvěma vrcholy?

Prioritní fronta – s využitím seznamu

• Jednotlivé prvky ukládáme (neuspořádaně) do spojového

seznamu

• Realizace operací:

DeleteMin – seznam sekvenčně prohledáme Insert(v) – vkládáme na konec seznamu

ChangeKey(v,p) – změníme pouze prioritu prvku ,

pořadí v seznamu neměníme

10

)(nO

)1(O

)1(Ov

)1,(a)2,(b )3,(c )3,(d )4,(e

Page 11: Algoritmy na ohodnoceném grafu - cvut.cz · 2013. 3. 1. · Algoritmy na ohodnoceném grafu . Dvě základní optimalizační úlohy: Jak najít nejkratší cestu mezi dvěma vrcholy?

Prioritní fronta – s využitím haldy

• Prvky ukládáme do binární haldy

11

3

7 6

1123 15 9

31 39

• úplný binární strom • každý vrchol má hodnotu klíče

hodnotě klíče potomka ≤

(vizualizujeme pouze klíče)

DeleteMin, Insert(v), ChangeKey(v, p) … vše

(každá z operací mění strukturu stromu v čase )

)(log nO

)(log nO

Page 12: Algoritmy na ohodnoceném grafu - cvut.cz · 2013. 3. 1. · Algoritmy na ohodnoceném grafu . Dvě základní optimalizační úlohy: Jak najít nejkratší cestu mezi dvěma vrcholy?

Dijkstrův algoritmus – časová složitost

12

Označme

Čas je úměrný počtu operací provedených na F,

těch je max.: x DeleteMin + x ChangeKey +

x Insert

Podle implementace F

• varianta seznam:

• varianta halda:

Je-li , vyplatí se použít haldu, jinak je lepší seznam.

mEnV == ||,||

n m

( ) ( )22 nOmnO =+

( )nmnO log)( +

( )nnOm log/2=

n

Page 13: Algoritmy na ohodnoceném grafu - cvut.cz · 2013. 3. 1. · Algoritmy na ohodnoceném grafu . Dvě základní optimalizační úlohy: Jak najít nejkratší cestu mezi dvěma vrcholy?

Další algoritmy na nejkratší cestu

13

• Bellman-Fordův

• funguje pro libovolné ohodnocení hran

• Floyd-Warshallův

• nalezne nejkratší cestu pro všechny dvojice vrcholů

• hrany mohou být ohodnoceny i záporně, graf ale

nesmí obsahovat cyklus záporné délky •

( ) )(|||| mnOEVO ⋅=⋅

( ) )(|| 33 nOVO =

Page 14: Algoritmy na ohodnoceném grafu - cvut.cz · 2013. 3. 1. · Algoritmy na ohodnoceném grafu . Dvě základní optimalizační úlohy: Jak najít nejkratší cestu mezi dvěma vrcholy?

Úloha s počítačovou sítí

14

Page 15: Algoritmy na ohodnoceném grafu - cvut.cz · 2013. 3. 1. · Algoritmy na ohodnoceném grafu . Dvě základní optimalizační úlohy: Jak najít nejkratší cestu mezi dvěma vrcholy?

Kostra grafu

15

• Kostra neorientovaného souvislého grafu je souvislý

faktor s minimálním počtem hran, tj. strom na všech

vrcholech.

• Jednu z koster v daném grafu můžeme nalézt pomocí DFS nebo BFS.

Jak nalezneme minimální kostru T

v ohodnoceném grafu?

∑∈

=Te

ecTc )()(

Page 16: Algoritmy na ohodnoceném grafu - cvut.cz · 2013. 3. 1. · Algoritmy na ohodnoceném grafu . Dvě základní optimalizační úlohy: Jak najít nejkratší cestu mezi dvěma vrcholy?

Obecný postup hledání kostry

16

Kostra-Generic(G,c):

M:= Ø;

while M není kostra do

najdi vhodnou hranu a přidej ji do M;

return M;

Předpokládejme: • M je rozšiřitelná do minimální kostry

• P je komponenta M

• e je nejlevnější hrana vedoucí z P “ven”

Potom:

je též rozšiřitelná do minimální kostry

e

P

}{eM ∪

Page 17: Algoritmy na ohodnoceném grafu - cvut.cz · 2013. 3. 1. · Algoritmy na ohodnoceném grafu . Dvě základní optimalizační úlohy: Jak najít nejkratší cestu mezi dvěma vrcholy?

Union-Find problém

17

• Cíl: datová struktura pro evidenci komponent grafu. • Pro každou komponentu vybereme jeden vrchol – její reprezentant.

• Jako označíme reprezentanta komponenty, ve které leží vrchol .

Požadujeme tyto operace:

Find(v) – nalezne Union(u,v) – sjednotí komponenty obsahující vrcholy a .

vr v

vru v

1r

v

2r

u

1)( rvFind = :),( vuUnion

1r

v u

2)( ruFind =1)( rvFind =

1)( ruFind =

Page 18: Algoritmy na ohodnoceném grafu - cvut.cz · 2013. 3. 1. · Algoritmy na ohodnoceném grafu . Dvě základní optimalizační úlohy: Jak najít nejkratší cestu mezi dvěma vrcholy?

Union-Find problém – implementace

18

• Reprezentace komponent pomocí orientovaných stromů.

.. předchůdce vrcholu ve stromu

.. délka nejdelší orientované

cesty vedoucí do

Find(v):

projdeme z do kořene

v

1 4

2 6

3

8

7

5

][vP][vrank

Union(u,v): 1. Nalezneme a 2. Pokud , jsme hotovi 3. Sloučíme stromy, pro a , kořenem je

vrchol s větším rank

vrurvu rr =

1

4

2 6

3

ur vrv

Page 19: Algoritmy na ohodnoceném grafu - cvut.cz · 2013. 3. 1. · Algoritmy na ohodnoceném grafu . Dvě základní optimalizační úlohy: Jak najít nejkratší cestu mezi dvěma vrcholy?

Union-Find problém – časová složitost

19

Předpokládejme, že začínáme s komponentami, tj.

máme graf s izolovanými vrcholy.

Pozorování: 1. Union(u,v) zvětší rank kořene maximálně o 1

2. Je-li rank stromu , má strom alespoň prvků

nejvyšší možný rank je

Důsledek:

Časová složitost Find i Union je

||V

k k2||log V

( )||log VO

Page 20: Algoritmy na ohodnoceném grafu - cvut.cz · 2013. 3. 1. · Algoritmy na ohodnoceném grafu . Dvě základní optimalizační úlohy: Jak najít nejkratší cestu mezi dvěma vrcholy?

Kruskalův algoritmus

20

• Hladový algoritmus

1. Setřiď hrany podle jejich ohodnocení

2. Inicializuj . Procházej hrany v získaném pořadí.

Pokud hrana spojuje různé komponenty v , přidej

do .

3. Na konci obsahuje hledanou minimální kostru.

)()()( 21 mececec ≤≤≤

ie M ieM

0:=M

M

Page 21: Algoritmy na ohodnoceném grafu - cvut.cz · 2013. 3. 1. · Algoritmy na ohodnoceném grafu . Dvě základní optimalizační úlohy: Jak najít nejkratší cestu mezi dvěma vrcholy?

Kruskalův algoritmus

21

Časová složitost:

1. Setřídění hran v čase

2. Při průchodu -krát Find a -krát Union

Výsledná složitost:

m ( ) ( )nmOmmO loglog =m )1( −n

( ) ( )nmOnnmO loglog)1( =−+

( )nmO log

Page 22: Algoritmy na ohodnoceném grafu - cvut.cz · 2013. 3. 1. · Algoritmy na ohodnoceném grafu . Dvě základní optimalizační úlohy: Jak najít nejkratší cestu mezi dvěma vrcholy?

Jarníkův-Primův algoritmus

22

• Kostru vytváříme souvisle, začínáme s jedním vrcholem a

postupně přidáváme nejlevnější hrany.

• Algoritmus je velmi podobný Dijkstrovu algoritmu a má i

stejnou časovou složitost.

Page 23: Algoritmy na ohodnoceném grafu - cvut.cz · 2013. 3. 1. · Algoritmy na ohodnoceném grafu . Dvě základní optimalizační úlohy: Jak najít nejkratší cestu mezi dvěma vrcholy?

Jarníkův-Primův algoritmus

23

Jarnik(G,s):

for each v in V do

P[v]:= NULL; D[v]:= ;

done

D[s]:= 0; M:= Ø; // inicializace prázdnou množinou

vytvoř prioritní frontu F z vrcholů ve V s klíči D[v];

while not F->empty() do

v := F->deleteMin(); M->add({v,P[v]});

for each w in Sousede[v] do

if D[w] > c({v,w}) then

D[w]:= c({v,w});

P[w]:= v; F->changeKey(w,D[w]);

endif

done

done