diff --git a/slides/cours_26.md b/slides/cours_26.md index 490d6f323f5bc94b8b0fd4020839ad5177ffadab..58886e19b59e0a6c809c2615b52c798ee5ef6b5d 100644 --- a/slides/cours_26.md +++ b/slides/cours_26.md @@ -550,4 +550,292 @@ $$ ## Appliquer l'algorithme de Floyd--Warshall au graphe suivant - +{width=50%} + +* Bien indiquer l'état de $D$ et $P$ à chaque étape! +* Ne pas oublier de faire la matrice d'adjacence évidemment... + +# La suite + +* Sans transition.... la suite! + +# Trouver un réseau électrique pour + + + +# Solution: pas optimale + + + +* La longueur totale des câbles est super longue! + +# Solution: optimale + + + +# Formalisation: Les arbres couvrants + +## Application: minimisation des coûrs + +* Équipement d'un lotissement avec des lignes électriques/téléphoniques, des canalisations, ... + +. . . + +* Pour réduire les coûts, on cherche à minimiser la longueur totale des câbles/tuyaux. + +. . . + +* Les lignes/tuyaux forment un *arbre couvrant*. + +. . . + +* La meilleure option est un *arbre couvrant minimal*. + + +# Formalisation: Les arbres couvrants + +* Qu'est-ce qu'un arbre couvrant? Des idées? De quel objet on part? Où va-t-on? + +. . . + +* Un arbre couvrant d'un graphe non-orienté et connexe est: + * un arbre inclu dans le graphe qui connecte tous les sommets du graphe. + +. . . + + + +# Arbres couvrants + +* Quels algorithmes que nous avons déjà vus permettent de construire des arbres couvrants? + +. . . + +* Les parcours en largeur et en profondeur! + +. . . + + + +# Arbres couvrants minimaux + +* Un *arbre couvrant minimal* est un sous-graphe d'un graphe non-orienté pondéré $G(V,E)$, tel quel: + * C'est un arbre (graphe acyclique); + * Il couvre tous les sommets de $G$ et contient $|V|-1$ arêtes de $G$; + * Le coût total associé aux arêtes de l'arbre est minimum parmi tous les arbres couvrants possibles. + +. . . + +* Est-il unique? + +. . . + +* Pas dorcément. + +# Arbres couvrants minimaux + +* Comment générer un arbre couvrant minimal? + + + +# Algorithme de Prim + +::: columns + +:::: column + +## Un exemple + + + +:::: + +:::: column + +## On part de `e` (au hasard) + + + +:::: + +::: + +# Algorithme de Prim + +::: columns + +:::: column + +## On choisit comment? + + + +. . . + +* L'arête la plus courte sortant d'un sommet déjà visité, et entrant dans un sommet non-visité. + +:::: + +:::: column + +. . . + +## L'arête `e->d` + + + +:::: + +::: + +# Algorithme de Prim + +::: columns + +:::: column + +## On choisit comment? + + + +. . . + +* L'arête la plus courte sortant d'un sommet déjà visité, et entrant dans un sommet non-visité. + +:::: + +:::: column + +. . . + +## L'arête `d->a` + + + +:::: + +::: + +# Algorithme de Prim + +::: columns + +:::: column + +## On choisit comment? + + + +. . . + +* L'arête la plus courte sortant d'un sommet déjà visité, et entrant dans un sommet non-visité. + +:::: + +:::: column + +. . . + +## L'arête `d->c` + + + +:::: + +::: + +# Algorithme de Prim + +::: columns + +:::: column + +## On choisit comment? + + + +. . . + +* L'arête la plus courte sortant d'un sommet déjà visité, et entrant dans un sommet non-visité. + +:::: + +:::: column + +. . . + +## L'arête `e->b` + + + +:::: + +::: + +* Game over! + +# Algorithme de Prim + +## Structures de données + +* Dans quoi allons nous stocker les sommets? + +. . . + +* File de priorité min. +* Autre chose? + +. . . + +* Tableau des distances (comme pour Dijkstra). +* Autre chose? + +. . . + +* Tableau des parents (presque comme pour Dijkstra). +* Autre chose? + +. . . + +* Non. + +# Algorithme de Prim + +## Initialisation: Pseudo-code (2min) + +. . . + +```C +file_priorité, distance, parent initalisation(graphe) + r = aléatoire(graphe) + distance[r] = 0 + parent[r] = indéfini + fp = file_p_vide() + pour v dans sommets(graphe) + si v != r + distance[v] = infini + parent[v] = indéfini + fp = enfiler(fp, v, distance[v]) + retourne fp, distance, parent +``` + +# Algorithme de Prim + +## Algorithme: Pseudo-code (5min) + +. . . + +```C +sommets, parent initalisation(file_priorité, distance, parent) + sommets = vide + tant que !est_vide(file_priorité) + u, fp = défiler(file_priorité) + sommets = insérer(sommets, u) + pour v dans voisinage de u et pas dans sommets // ou dans file_priorité + si w(u, v) < distance[v] + parent[w] = u + distance[w] = w(u, v) + fp = changer_priorité(fp, w, w(u, v)) + retourne sommets, parent +``` + diff --git a/slides/figs/arbre_couvrant_bien.png b/slides/figs/arbre_couvrant_bien.png new file mode 100644 index 0000000000000000000000000000000000000000..ddd64ea22b85bfaa2a47797204347439db083d71 Binary files /dev/null and b/slides/figs/arbre_couvrant_bien.png differ diff --git a/slides/figs/arbre_couvrant_exemples.png b/slides/figs/arbre_couvrant_exemples.png new file mode 100644 index 0000000000000000000000000000000000000000..511b08aa671d07a0ffa25a4fe3d602aa4fc06f4c Binary files /dev/null and b/slides/figs/arbre_couvrant_exemples.png differ diff --git a/slides/figs/arbre_couvrant_mal.png b/slides/figs/arbre_couvrant_mal.png new file mode 100644 index 0000000000000000000000000000000000000000..7c4cd6f375d73ab335ff4509836508bbf9c91360 Binary files /dev/null and b/slides/figs/arbre_couvrant_mal.png differ diff --git a/slides/figs/arbre_couvrant_minimal_exemple.png b/slides/figs/arbre_couvrant_minimal_exemple.png new file mode 100644 index 0000000000000000000000000000000000000000..0705ed97e9cc959bcd4abff6216ee02c588b78d7 Binary files /dev/null and b/slides/figs/arbre_couvrant_minimal_exemple.png differ diff --git a/slides/figs/arbre_couvrant_vide.png b/slides/figs/arbre_couvrant_vide.png new file mode 100644 index 0000000000000000000000000000000000000000..ecc8eb81bcddea0ad9e7c2e7eae8f8e2b12f7fc6 Binary files /dev/null and b/slides/figs/arbre_couvrant_vide.png differ diff --git a/slides/figs/arbres_couvrants_parcours.png b/slides/figs/arbres_couvrants_parcours.png new file mode 100644 index 0000000000000000000000000000000000000000..7324b3f570db6feaa590f229a0b9ac3b63c2e935 Binary files /dev/null and b/slides/figs/arbres_couvrants_parcours.png differ diff --git a/slides/figs/prim_0.png b/slides/figs/prim_0.png new file mode 100644 index 0000000000000000000000000000000000000000..dbc6df146f83883c9aefee870fd1a4bba4164468 Binary files /dev/null and b/slides/figs/prim_0.png differ diff --git a/slides/figs/prim_1.png b/slides/figs/prim_1.png new file mode 100644 index 0000000000000000000000000000000000000000..a85adb5e4f338e67f97d89c184fe8ff4e8ab2b19 Binary files /dev/null and b/slides/figs/prim_1.png differ diff --git a/slides/figs/prim_2.png b/slides/figs/prim_2.png new file mode 100644 index 0000000000000000000000000000000000000000..81afadd299dd18af4f3ca722ccfa5e054e5380e6 Binary files /dev/null and b/slides/figs/prim_2.png differ diff --git a/slides/figs/prim_3.png b/slides/figs/prim_3.png new file mode 100644 index 0000000000000000000000000000000000000000..d0ad120e879c247aff68a15c8bbb546d8c6fe631 Binary files /dev/null and b/slides/figs/prim_3.png differ diff --git a/slides/figs/prim_4.png b/slides/figs/prim_4.png new file mode 100644 index 0000000000000000000000000000000000000000..11aff386e69ee36435ef30c68040c8b80080cc55 Binary files /dev/null and b/slides/figs/prim_4.png differ diff --git a/slides/figs/prim_5.png b/slides/figs/prim_5.png new file mode 100644 index 0000000000000000000000000000000000000000..babfe24819fb5b7d0a82ed5f8e3b49cddc5a93eb Binary files /dev/null and b/slides/figs/prim_5.png differ