diff --git a/slides/cours_25.md b/slides/cours_25.md index 874d476f2fd17a7f64a5d3f4ceef5e49455ba4dd..0d3c191ce62ae375b8dbd63bb2211017c263aef2 100644 --- a/slides/cours_25.md +++ b/slides/cours_25.md @@ -577,515 +577,3 @@ O(V) fp = changer_priorité(fp, v, n_distance) * L'algorithme n'essaiera jamais le chemin `s->x->y->v` et prendra direct `s->v`. * Ce problème n'apparaît que s'il y a des poids négatifs. -# Plus cours chemin pour toute paire de sommets - -## Comment faire pour avoir toutes les paires? - -. . . - -* Appliquer Dijkstra sur tous les sommets d'origine. -* Complexité: - * Graphe dense: $\mathcal{O}(|V|)\mathcal{O}(|V|^2\log|V|)=\mathcal{O}(|V|^3\log|V|)$. - * Graphe peu dense: $\mathcal{O}(|V|)\mathcal{O}(|V|\log|V|)=\mathcal{O}(|V|^2\log|V|)$. - -. . . - -## Solution alternative: Floyd--Warshall - -* Pour toutes paires de sommets $u,v\in V$, trouver le chemin de poids minimal reliant $u$ à $v$. -* Complexité $\mathcal{O}(|V|^3)$, indiqué pour graphes denses. -* Fonctionne avec la matrice d'adjacence. - -# Algorithme de Floyd--Warshall - -## Idée générale - -* Soit l'ensemble de sommets $V=\{1, 2, 3, 4, ..., n\}$. -* Pour toute paire de sommets, $i,j$, on considère tous les chemins passant par les sommets intermédiaires $\in\{1, 2, ..., k\}$ avec $k\leq n$. -* On garde pour chaque $k$ la plus petite valeur. - -## Principe - -* A chaque étape, $k$, on vérifie s'il est plus court d'aller de $i$ à $j$ en passant par le sommet $k$. -* Si à l'étape $k-1$, le coût du parcours est $p$, on vérifie si $p$ est plus petit que $p_1+p_2$, le chemin de $i$ à $k$, et $k$ à $j$ respectivement. - -# Algorithme de Floyd--Warshall - -## The algorithme - -Soit $d_{ij}(k)$ le plus court chemin de $i$ à $j$ passant par les sommets $\in\{1,2,...,k\}$ - -$$ -d_{ij}(k)=\left\{ -\begin{array}{ll} - w(i,j), & \mbox{si } k=0,\\ - \min(d_{ij}(k-1),d_{ik}(k-1)+d_{kj}(k-1)), & \mbox{sinon}. -\end{array} -\right. -$$ - -# Algorithme de Floyd--Warshall (exemple) - - -::: columns - -:::: column - - - - -:::: - -:::: column - -## Que vaut $D^{(0)}$ (3min)? - -. . . - -$$ -D^{(0)}=\begin{bmatrix} -0 & 2 & 4 & \infty & 3 \\ -2 & 0 & 8 & \infty & 1 \\ -6 & 2 & 0 & 4 & 3 \\ -1 & \infty & \infty & 0 & 5 \\ -\infty & \infty & \infty & 1 & 0 \\ -\end{bmatrix} -$$ - -:::: - -::: - -# Algorithme de Floyd--Warshall (exemple) - - -::: columns - -:::: column - -## On part de $D^{(0)}$? - -$$ -D^{(0)}=\begin{bmatrix} -0 & 2 & 4 & \infty & 3 \\ -2 & 0 & 8 & \infty & 1 \\ -6 & 2 & 0 & 4 & 3 \\ -1 & \infty & \infty & 0 & 5 \\ -\infty & \infty & \infty & 1 & 0 \\ -\end{bmatrix} -$$ - - -:::: - -:::: column - -## Que vaut $D^{(1)}$ (3min)? - -. . . - -$$ -D^{(0)}=\begin{bmatrix} -0 & 2 & 4 & \infty & 3 \\ -2 & 0 & \mathbf{6} & \infty & 1 \\ -6 & 2 & 0 & 4 & 3 \\ -1 & \mathbf{3} & \mathbf{5} & 0 & \mathbf{4} \\ -\infty & \infty & \infty & 1 & 0 \\ -\end{bmatrix} -$$ - -:::: - -::: - -# Algorithme de Floyd--Warshall (exemple) - - -::: columns - -:::: column - -## On part de $D^{(0)}$ - -$$ -D^{(0)}=\begin{bmatrix} -0 & 2 & 4 & \infty & 3 \\ -2 & 0 & 8 & \infty & 1 \\ -6 & 2 & 0 & 4 & 3 \\ -1 & \infty & \infty & 0 & 5 \\ -\infty & \infty & \infty & 1 & 0 \\ -\end{bmatrix} -$$ - - -:::: - -:::: column - -## Que vaut $D^{(1)}$ (3min)? - -. . . - -$$ -D^{(1)}=\begin{bmatrix} -0 & 2 & 4 & \infty & 3 \\ -2 & 0 & \mathbf{6} & \infty & 1 \\ -6 & 2 & 0 & 4 & 3 \\ -1 & \mathbf{3} & \mathbf{5} & 0 & \mathbf{4} \\ -\infty & \infty & \infty & 1 & 0 \\ -\end{bmatrix} -$$ - -## Exemple - -$$ -D_{42}^{(1)}=D_{41}^{(0)}+D_{12}^{(0)}=1+2<\infty. -$$ - -:::: - -::: - -# Algorithme de Floyd--Warshall (exemple) - -::: columns - -:::: column - -## On part de $D^{(1)}$ - -$$ -D^{(1)}=\begin{bmatrix} -0 & 2 & 4 & \infty & 3 \\ -2 & 0 & 6 & \infty & 1 \\ -6 & 2 & 0 & 4 & 3 \\ -1 & 3 & 5 & 0 & 4 \\ -\infty & \infty & \infty & 1 & 0 \\ -\end{bmatrix} -$$ - - -:::: - -:::: column - -## Que vaut $D^{(2)}$ (3min)? - -. . . - -$$ -D^{(2)}=\begin{bmatrix} -0 & 2 & 4 & \infty & 3 \\ -2 & 0 & 6 & \infty & 1 \\ -\mathbf{4} & 2 & 0 & 4 & 3 \\ -1 & 3 & 5 & 0 & 4 \\ -\infty & \infty & \infty & 1 & 0 \\ -\end{bmatrix} -$$ - -:::: - -::: - -# Algorithme de Floyd--Warshall (exemple) - -::: columns - -:::: column - -## On part de $D^{(2)}$ - -$$ -D^{(2)}=\begin{bmatrix} -0 & 2 & 4 & \infty & 3 \\ -2 & 0 & 6 & \infty & 1 \\ -4 & 2 & 0 & 4 & 3 \\ -1 & 3 & 5 & 0 & 4 \\ -\infty & \infty & \infty & 1 & 0 \\ -\end{bmatrix} -$$ - - -:::: - -:::: column - -## Que vaut $D^{(3)}$ (3min)? - -. . . - -$$ -D^{(3)}=\begin{bmatrix} -0 & 2 & 4 & \mathbf{8} & 3 \\ -2 & 0 & 6 & \mathbf{10} & 1 \\ -4 & 2 & 0 & 4 & 3 \\ -1 & 3 & 5 & 0 & 4 \\ -\infty & \infty & \infty & 1 & 0 \\ -\end{bmatrix} -$$ - -:::: - -::: - -# Algorithme de Floyd--Warshall (exemple) - -::: columns - -:::: column - -## On part de $D^{(3)}$ - -$$ -D^{(3)}=\begin{bmatrix} -0 & 2 & 4 & 8 & 3 \\ -2 & 0 & 6 & 10 & 1 \\ -4 & 2 & 0 & 4 & 3 \\ -1 & 3 & 5 & 0 & 4 \\ -\infty & \infty & \infty & 1 & 0 \\ -\end{bmatrix} -$$ - -:::: - -:::: column - -## Que vaut $D^{(4)}$ (3min)? - -. . . - -$$ -D^{(4)}=\begin{bmatrix} -0 & 2 & 4 & 8 & 3 \\ -2 & 0 & 6 & 10 & 1 \\ -4 & 2 & 0 & 4 & 3 \\ -1 & 3 & 5 & 0 & 4 \\ -\mathbf{2} & \mathbf{4} & \mathbf{6} & 1 & 0 \\ -\end{bmatrix} -$$ - -:::: - -::: - -# Algorithme de Floyd--Warshall (exemple) - -::: columns - -:::: column - -## On part de $D^{(4)}$ - -$$ -D^{(4)}=\begin{bmatrix} -0 & 2 & 4 & 8 & 3 \\ -2 & 0 & 6 & 10 & 1 \\ -4 & 2 & 0 & 4 & 3 \\ -1 & 3 & 5 & 0 & 4 \\ -2 & 4 & 6 & 1 & 0 \\ -\end{bmatrix} -$$ - -:::: - -:::: column - -## Que vaut $D^{(5)}$ (3min)? - -. . . - -$$ -D^{(5)}=\begin{bmatrix} -0 & 2 & 4 & \mathbf{4} & 3 \\ -2 & 0 & 6 & \mathbf{2} & 1 \\ -4 & 2 & 0 & 4 & 3 \\ -1 & 3 & 5 & 0 & 4 \\ -2 & 4 & 6 & 1 & 0 \\ -\end{bmatrix} -$$ - -:::: - -::: - -# Algorithme de Floyd--Warshall - -## The pseudo-code (10min) - -* Quelle structure de données? -* Quelle initialisation? -* Quel est le code pour le calcul de la matrice $D$? - -# Algorithme de Floyd--Warshall - -## The pseudo-code - -* Quelle structure de données? - -```C -int distance[n][n]; -``` - -. . . - -* Quelle initialisation? - -```C -matrice ini_floyd_warshall(distance, n, w) - pour i de 1 à n - pour j de 1 à n - distance[i][j] = w(i,j) - retourne distance -``` - -# Algorithme de Floyd--Warshall - -## The pseudo-code - -* Quel est le code pour le calcul de la matrice $D$? - -```C -matrice floyd_warshall(distance, n, w) - pour k de 1 à n - pour i de 1 à n - pour j de 1 à n - distance[i][j] = min(distance[i][j], - distance[i][k] + distance[k][j]) - retourne distance -``` - -# Algorithme de Floyd--Warshall - -## La matrice de précédence - -* On a pas encore vu comment reconstruire le plusc court chemin! -* On définit, $P_{ij}^{(k)}$, qui est le prédécesseur du sommet $j$ depuis $i$ avec les sommets intermédiaires $\in\{1, 2, ..., k\}$. -$$ -P^{(0)}_{ij}=\left\{ -\begin{array}{ll} - \mbox{vide}, & \mbox{si } i=j\mbox{, ou }w(i,j)=\infty\\ - i, & \mbox{sinon}. -\end{array} -\right. -$$ - -* Mise à jour -$$ -P^{(k)}_{ij}=\left\{ -\begin{array}{ll} - P^{(k-1)}_{\mathbf{i}j}, & \mbox{si } d_{ij}^{(k)}\leq d_{ik}^{(k-1)}+d_{kj}^{(k-1)}\\ - P^{(k-1)}_{\mathbf{k}j}, & \mbox{sinon}. -\end{array} -\right. -$$ - -. . . - -* Moralité: si le chemin est plus court en passant par $k$, alors il faut qu'il soit le prédécesseur! - -# Algorithme de Floyd--Warshall - -## La matrice de précédence (pseudo-code, 3min) - -. . . - -```C -matrice, matrice floyd_warshall(distance, n, w) - pour k de 1 à n - pour i de 1 à n - pour j de 1 à n - n_distance = distance[i][k] + distance[k][j] - if n_distance < distance[i][j] - distance[i][j] = n_distance - précédence[i][j] = précédence[k][j] - retourne distance, précédence -``` - -# Algorithme de Floyd--Warshall (exercice) - - -::: columns - -:::: column - - - - -:::: - -:::: column - -## Que vaut $P^{(0)}$ (3min)? - -. . . - -$$ -P^{(0)}=\begin{bmatrix} -- & 1 & 1 & - & 1 \\ -2 & - & 2 & - & 2 \\ -3 & 3 & - & 3 & 3 \\ -4 & - & - & - & 4 \\ -- & - & - & 5 & - \\ -\end{bmatrix} -$$ - -:::: - -::: - -# Algorithme de Floyd--Warshall (exercice) - - -::: columns - -:::: column - - - - -:::: - -:::: column - -## Que vaut $P^{(5)}$ (10min)? - -. . . - -$$ -P^{(5)}=\begin{bmatrix} -- & 1 & 1 & 5 & 1 \\ -2 & - & 1 & 5 & 2 \\ -2 & 3 & - & 3 & 3 \\ -4 & 1 & 1 & - & 1 \\ -4 & 1 & 1 & 5 & - \\ -\end{bmatrix} -$$ - -:::: - -::: - -# Exercice: retrouver le chemin entre 1 et 4 (5min) - -$$ -P=\begin{bmatrix} -- & 1 & 1 & 5 & 1 \\ -2 & - & 1 & 5 & 2 \\ -2 & 3 & - & 3 & 3 \\ -4 & 1 & 1 & - & 4 \\ -4 & 1 & 1 & 5 & - \\ -\end{bmatrix} -$$ - -. . . - -## Solution - -* Le sommet $5=P_{14}$, on a donc, $5\rightarrow 4$, on veut connaître le prédécesseur de 5. -* Le sommet $1=P_{15}$, on a donc, $1\rightarrow 5\rightarrow 4$. The end. - -# Exercice complet - -## Appliquer l'algorithme de Floyd--Warshall au graphe suivant - -