Algoritmo de Dijkstra - Departamento de Computación

Anuncio
Algoritmo de Dijkstra
Alejandro Strejilevich de Loma
Departamento de Computación
Facultad de Ciencias Exactas y Naturales
Universidad de Buenos Aires
Septiembre de 2015
Introducción
Problemas de camino mínimo:
uno a uno;
uno a todos;
todos a todos;
todos a uno;
...
Representación de grafos:
listas de adyacentes/sucesores;
matriz de adyacencia;
...
ASdeL
Algoritmo de Dijkstra
Dijkstra - Características
¾Qué problema de camino mínimo resuelve?
Desde un vértice dado a todos los vértices (uno a todos).
√
¾Sirve desde un vértice dado a otro especíco (uno a uno)? SÍ.
Se puede interrumpir el algoritmo cuando se calcula el vértice deseado.
√
¾Sirve entre todo par de vértices (todos a todos)? SÍ.
Se corre el algoritmo empezando desde cada vértice.
√
¾Sirve para grafos no dirigidos? SÍ.
√
¾Sirve para grafos dirigidos? SÍ.
¾Sirve para grafos con circuitos negativos? NO. ×
No existe camino mínimo para los vértices del circuito.
¾Sirve para grafos con ejes negativos? NO. ×
El algoritmo puede dar resultados incorrectos.
ASdeL
Algoritmo de Dijkstra
Dijkstra - Funcionamiento (ejercicio) y complejidad
Bases: Alien (A), Barbarella (B), Challenger (C), Duran-Duran (D) y Enterprise (E).
Dispositivos robóticos: R1 y R2.
R1 debe ir a reparar a R2.
Distancias:
A
B
B
C
D
E
R1
R2
1
1
2
4
1
7
1
2
5
4
6
2
3
5
5
2
3
6
C
D
E
5
R1
3
14
R1 consume:
2 unidades de energía por unidad de distancia recorrida;
1 unidad de energía cada vez que ingresa o egresa de una base;
0 unidades de energía mientras está dentro de alguna base.
Determinar el recorrido que debe seguir R1 para minimizar su consumo de energía.
ASdeL
Algoritmo de Dijkstra
G = (V , E ); n = |V |; m = |E |
` : E → R≥0 (longitud ejes)
Dijkstra(G , v )
π () ← +∞; π (v ) ← 0
S ← ∅; ant () ← nil
para i ← 1, 2, . . . n
w ∗ ← argminw ∈V −S π (w )
S ← S ∪ {w ∗ }
para w ∈ Γ(w ∗ ) ∩ (V − S )
x ← π (w ∗ ) + `(w ∗ , w )
si π (w ) > x
π (w ) ← x ; ant (w ) = w ∗
n si
n para
n para
devolver π (), ant ()
G : listas de adyacentes/sucesores
S : vector de bool; ant : vector
π () vector
π () heap
O (n )
O (n )
O (n ) −→ O (n2 )
n
O (1) −→ O (n )
n
m
O (1) −→ O (m )
m
O (1) −→ O (m )
m
O (1) −→ O (m )
O (n 2 )
TOTAL
ASdeL
Algoritmo de Dijkstra
G = (V , E ); n = |V |; m = |E |
` : E → R≥0 (longitud ejes)
Dijkstra(G , v )
π () ← +∞; π (v ) ← 0
S ← ∅; ant () ← nil
para i ← 1, 2, . . . n
w ∗ ← argminw ∈V −S π (w )
S ← S ∪ {w ∗ }
para w ∈ Γ(w ∗ ) ∩ (V − S )
x ← π (w ∗ ) + `(w ∗ , w )
si π (w ) > x
π (w ) ← x ; ant (w ) = w ∗
n si
n para
n para
devolver π (), ant ()
G : listas de adyacentes/sucesores
S : vector de bool; ant : vector
π () vector
π () heap
O (n )
O (n )
O (n )
O (n )
O (n ) −→ O (n2 )
n
O (1) −→ O (n )
n
O (lg n ) −→ O (n lg n )
n
O (1) −→ O (n )
O (1) −→ O (m )
m
O (1) −→ O (m )
m
O (1) −→ O (m )
m
O (1) −→ O (m )
m
(½!) O (1) −→ O (m)
m
O (lg n ) −→ O (m lg n )
O (n 2 )
O ((m + n ) lg n )
TOTAL
ASdeL
Algoritmo de Dijkstra
n
m
G = (V , E ); n = |V |; m = |E |
` : E → R≥0 (longitud ejes)
Prim(G , v )
π () ← +∞; π (v ) ← 0
S ← ∅; ant () ← nil
para i ← 1, 2, . . . n
w ∗ ← argminw ∈V −S π (w )
S ← S ∪ {w ∗ }
para w ∈ Γ(w ∗ ) ∩ (V − S )
x ← π (w ∗ ) + `(w ∗ , w )
si π (w ) > x
π (w ) ← x ; ant (w ) = w ∗
n si
n para
n para
devolver π (), ant ()
G : listas de adyacentes/sucesores
S : vector de bool; ant : vector
π () vector
π () heap
O (n )
O (n )
O (n )
O (n )
O (n ) −→ O (n2 )
n
O (1) −→ O (n )
n
O (lg n ) −→ O (n lg n )
n
O (1) −→ O (n )
O (1) −→ O (m )
m
O (1) −→ O (m )
m
O (1) −→ O (m )
m
O (1) −→ O (m )
m
(½!) O (1) −→ O (m)
m
O (lg n ) −→ O (m lg n )
O (n 2 )
O ((m + n ) lg n )
TOTAL
ASdeL
Algoritmo de Dijkstra
n
m
Descargar