diff --git a/slides/cours_26.md b/slides/cours_26.md new file mode 100644 index 0000000000000000000000000000000000000000..4fcb4de1293f930db7a1df254c82949e01369c51 --- /dev/null +++ b/slides/cours_26.md @@ -0,0 +1,548 @@ +--- +title: "Graphes - Plus court chemin (2)" +date: "2022-05-03" +patat: + eval: + tai: + command: fish + fragment: false + replace: true + ccc: + command: fish + fragment: false + replace: true + images: + backend: auto +--- + +# Questions + +* Qu'est-ce qu'un graphe? Un graphe orienté? Un graphe pondéré? + +. . . + +* Ensemble de sommets et arêtes, avec une direction, possédant une pondération. +* Comment représenter un graphe informatiquement? + +. . . + +* Liste ou matrice d'adjacence. +* Quels sont les deux parcours que nous avons vus? + +. . . + +* Parcours en largeur et profondeur. +* Donner l'idée générale des deux parcours. + +# 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 + +