diff --git a/slides/cours_24.md b/slides/cours_24.md new file mode 100644 index 0000000000000000000000000000000000000000..492cc2bdfecd56d7e9de8aeb8a4a6a2b34854de4 --- /dev/null +++ b/slides/cours_24.md @@ -0,0 +1,1190 @@ +--- +title: "Théorie des graphes et plus courts chemins" +date: "2025-05-26" +--- + +# Les graphes + +\Huge + +Les graphes + +# Exercice + +* Établir la liste d'adjacence et appliquer l'algorithme de parcours en largeur au graphe + +```{.mermaid format=pdf width=400 loc=figs/} +graph LR; + 1---2; + 1---3; + 1---4; + 2---3; + 2---6; + 3---6; + 3---4; + 3---5; + 4---5; +``` + + +# Illustration: parcours en profondeur + +{width=80%} + +# Parcours en profondeur + +## Idée générale + +* Initialiser les sommets comme non-lus +* Visiter un sommet +* Pour chaque sommet visité, on visite un sommet adjacent s'il est pas encore visité récursivement. + +## Remarque + +* La récursivité est équivalent à l'utilisation d'une **pile**. + +# Parcours en profondeur + +## Pseudo-code (5min) + +. . . + +```C +initialiser(graphe) // tous sommets sont non-visités +pile = visiter(sommet, vide) // sommet est un sommet du graphe au hasard +tant que !est_vide(pile) + v = dépiler(pile) + pile = visiter(v, pile) +``` + +## Que fait visiter? + +. . . + +```C +pile visiter(sommet, pile) + sommet = visité + pour w = chaque arête de sommet + si w != visité + pile = empiler(pile, w) + retourne pile +``` + + +# Exercice + +* Établir la liste d'adjacence et appliquer l'algorithme de parcours en profondeur au graphe + +```{.mermaid format=pdf width=400 loc=figs/} +graph LR; + 1---2; + 1---3; + 1---4; + 2---3; + 2---6; + 3---6; + 3---4; + 3---5; + 4---5; +``` + +# Interprétation des parcours + +* Un graphe vu comme espace d'états (sommet: état, arête: action); + * Labyrinthe; + * Arbre des coups d'un jeu. + +. . . + +* BFS (Breadth-First) ou DFS (Depth-First) parcourent l'espace des états à la recherche du meilleur mouvement. + * Les deux parcourent *tout* l'espace; + * Mais si l'arbre est grand, l'espace est gigantesque! + +. . . + +* Quand on a un temps limité + * BFS explore beaucoup de coups dans un futur proche; + * DFS explore peu de coups dans un futur lointain. + +# Contexte: les réseaux (informatique, transport, etc.) + +* Graphe orienté; +* Source: sommet `s`; +* Destination: sommet `t`; +* Les arêtes ont des poids (coût d'utilisation, distance, etc.); +* Le coût d'un chemin est la somme des poids des arêtes d'un chemin. + +## Problème à résoudre + +* Quel est le plus court chemin entre `s` et `t`. + +# Exemples d'application de plus court chemin + +## Devenir riches! + +* On part d'un tableau de taux de change entre devises. +* Quelle est la meilleure façon de convertir l'or en dollar? + +{width=80%} + +. . . + +* 1kg d'or => 327.25 dollars +* 1kg d'or => 208.1 livres => 327 dollars +* 1kg d'or => 455.2 francs => 304.39 euros => 327.28 dollars + +# Exemples d'application de plus court chemin + +## Formulation sous forme d'un graphe: Comment (3min)? + +{width=80%} + + +# Exemples d'application de plus court chemin + +## Formulation sous forme d'un graphe: Comment (3min)? + +{width=60%} + +* Un sommet par devise; +* Une arête orientée par transaction possible avec le poids égal au taux de change; +* Trouver le chemin qui maximise le produit des poids. + +. . . + +## Problème + +* On aimerait plutôt avoir une somme... + + +# Exemples d'application de plus court chemin + +## Conversion du problème en plus court chemin + +* Soit `taux(u, v)` le taux de change entre la devise `u` et `v`. +* On pose `w(u,w)=-log(taux(u,v))` +* Trouver le chemin poids minimal pour les poids `w`. + +{width=60%} + +* Cette conversion se base sur l'idée que + +$$ +\log(u\cdot v)=\log(u)+\log(v). +$$ + +# Applications de plus courts chemins + +## Quelles applications voyez-vous? + +. . . + +* Déplacement d'un robot; +* Planificaiton de trajet / trafic urbain; +* Routage de télécommunications; +* Réseau électrique optimal; +* ... + +# Algorithmes de plus courts chemins + +\Huge + +Algorithmes de plus courts chemins + +# Contexte: les réseaux (informatique, transport, etc.) + +* Graphe orienté; +* Source: sommet `s`; +* Destination: sommet `t`; +* Les arêtes ont des poids (coût d'utilisation, distance, etc.); +* Le coût d'un chemin est la somme des poids des arêtes d'un chemin. + +## Problème à résoudre + +* Quel est le plus court chemin entre `s` et `t`. + +# Plus courts chemins à source unique + +* Soit un graphe, $G=(V, E)$, une fonction de pondération $w:E\rightarrow\mathbb{R}$, et un sommet $s\in V$ + * Trouver pour tout sommet $v\in V$, le chemin de poids minimal reliant $s$ à $v$. +* Algorithmes standards: + * Dijkstra (arêtes de poids positif seulement); + * Bellman-Ford (arêtes de poids positifs ou négatifs, mais sans cycles). +* Comment résoudre le problèmes si tous les poids sont les mêmes? + +. . . + +* Un parcours en largeur! + +# Algorithme de Dijkstra + +## Comment chercher pour un plus court chemin? + +. . . + +``` +si distance(u,v) > distance(u,w) + distance(w,v) + on passe par w plutôt qu'aller directement +``` + +# Algorithme de Dijkstra (1 à 5) + +* $D$ est le tableau des distances au sommet $1$: $D[7]$ est la distance de 1 à 7. +* Le chemin est pas forcément direct. +* $S$ est le tableau des sommets visités. + +::: columns + +:::: column + + + +:::: + +:::: column + +. . . + +![1 visité, `D[2]=1`, `D[4]=3`.](figs/dijkstra_1.png) + +:::: + +::: + +# Algorithme de Dijkstra (1 à 5) + +::: columns + +:::: column + + + + +:::: + +:::: column + +. . . + +![2 visité, `D[3]=2`, `D[7]=3`.](figs/dijkstra_2.png) + +:::: + +::: + +# Algorithme de Dijkstra (1 à 5) + +::: columns + +:::: column + + + + +:::: + +:::: column + +. . . + +![3 visité, `D[7]=3` inchangé, `D[6]=6`.](figs/dijkstra_3.png) + +:::: + +::: + +# Algorithme de Dijkstra (1 à 5) + + +::: columns + +:::: column + + + + +:::: + +:::: column + +. . . + +![4 visité, `D[7]=3` inchangé, `D[5]=9`.](figs/dijkstra_4.png) + +:::: + +::: + +# Algorithme de Dijkstra (1 à 5) + +::: columns + +:::: column + + + + +:::: + +:::: column + +. . . + +![7 visité, `D[5]=7`, `D[6]=6` inchangé.](figs/dijkstra_5.png) + +:::: + +::: + +# Algorithme de Dijkstra (1 à 5) + +::: columns + +:::: column + + + + +:::: + +:::: column + +. . . + +![`6` visité, `D[5]=7` inchangé.](figs/dijkstra_6.png) + +:::: + +::: + +# Algorithme de Dijkstra (1 à 5) + +::: columns + +:::: column + + + +:::: + +:::: column + +. . . + + + +:::: + +::: + +# Algorithme de Dijkstra + +## Idée générale + +* On assigne à chaque noeud une distance $0$ pour $s$, $\infty$ pour les autres. +* Tous les noeuds sont marqués non-visités. +* Depuis du noeud courant, on suit chaque arête du noeud vers un sommet non visité et on calcule le poids du chemin à chaque voisin et on met à jour sa distance si elle est plus petite que la distance du noeud. +* Quand tous les voisins du noeud courant ont été visités, le noeud est mis à visité (il ne sera plus jamais visité). +* Continuer avec le noeud à la distance la plus faible. +* L'algorithme est terminé losrque le noeud de destination est marqué comme visité, ou qu'on a plus de noeuds qu'on peut visiter et que leur distance est infinie. + +# Algorithme de Dijkstra + +## Pseudo-code (5min, matrix) + +\footnotesize + +. . . + +```C +tab dijkstra(graph, s, t) + pour chaque v dans graphe + distance[v] = infini + q = ajouter(q, v) + distance[s] = 0 + tant que non_vide(q) + // sélection de u t.q. la distance dans q est min + u = min(q, distance) + si u == t // on a atteint la cible + retourne distance + q = remove(q, u) + // voisin de u encore dans q + pour chaque v dans voisinage(u, q) + // on met à jour la distance du voisin en passant par u + n_distance = distance[u] + w(u, v) + si n_distance < distance[v] + distance[v] = n_distance + retourne distance +``` + +# Algorithme de Dijkstra + +* Cet algorithme, nous donne le plus court chemin mais... +* ne nous donne pas le chemin! + +## Comment modifier l'algorithme pour avoir le chemin? + +. . . + +* Pour chaque nouveau noeud à visiter, il suffit d'enregistrer d'où on est venu! +* On a besoin d'un tableau `precedent`. + +## Modifier le pseudo-code ci-dessus pour ce faire (3min matrix) + +# Algorithme de Dijkstra + +\footnotesize + +```C +tab, tab dijkstra(graph, s, t) + pour chaque v dans graphe + distance[v] = infini + precedent[v] = indéfini + q = ajouter(q, v) + distance[s] = 0 + tant que non_vide(q) + // sélection de u t.q. la distance dans q est min + u = min(q, distance) + si u == t + retourne distance + q = remove(q, u) + // voisin de u encore dans q + pour chaque v dans voisinage(u, q) + n_distance = distance[u] + w(u, v) + si n_distance < distance[v] + distance[v] = n_distance + precedent[v] = u + retourne distance, precedent +``` + +# Algorithme de Dijkstra + +## Comment reconstruire un chemin ? + +. . . + +```C +pile parcours(precedent, s, t) + sommets = vide + u = t + // on a atteint t ou on ne connait pas de chemin + si u != s && precedent[u] != indéfini + tant que vrai + sommets = empiler(sommets, u) + u = precedent[u] + si u == s // la source est atteinte + retourne sommets + retourne sommets +``` + +# Algorithme de Dijkstra amélioré + +## On peut améliorer l'algorithme + +* Avec une file de priorité! + +## Une file de priorité est + +* Une file dont chaque élément possède une priorité, +* Elle existe en deux saveurs: `min` ou `max`: + * File `min`: les éléments les plus petits sont retirés en premier. + * File `max`: les éléments les plus grands sont retirés en premier. +* On regarde l'implémentation de la `max`. + +## Comment on fait ça? + +. . . + +* On insère les éléments à haute priorité tout devant dans la file! + +# Les files de priorité + +## Trois fonction principales + +```C +booléen est_vide(element) // triviale +element enfiler(element, data, priorite) +data defiler(element) +rien changer_priorite(element, data, priorite) +nombre priorite(element) // utilitaire +``` + +## Pseudo-implémentation: structure (1min) + +. . . + +```C +struct element + data + priorite + element suivant +``` + +# Les files de priorité + +## Pseudo-implémentation: enfiler (2min) + +. . . + +```C +element enfiler(element, data, priorite) + n_element = creer_element(data, priorite) + si est_vide(element) + retourne n_element + si priorite(n_element) > priorite(element) + n_element.suivant = element + retourne n_element + sinon + tmp = element + prec = element + tant que !est_vide(tmp) && priorite < priorite(tmp) + prec = tmp + tmp = tmp.suivant + prev.suivant = n_element + n_element.suivant = tmp + retourne element +``` + +# Les files de priorité + +## Pseudo-implémentation: defiler (2min) + +. . . + +```C +data, element defiler(element) + si est_vide(element) + retourne AARGL! + sinon + tmp = element.data + n_element = element.suivant + liberer(element) + retourne tmp, n_element +``` + +# Algorithme de Dijkstra avec file de priorité min + +```C +distance, precedent dijkstra(graphe, s, t): + distance[source] = 0 + fp = file_p_vide() + pour v dans sommets(graphe) + si v != s + distance[v] = infini + precedent[v] = indéfini + fp = enfiler(fp, v, distance[v]) + tant que !est_vide(fp) + u, fp = defiler(fp) + pour v dans voisinage de u + n_distance = distance[u] + w(u, v) + si n_distance < distance[v] + distance[v] = n_distance + precedent[v] = u + fp = changer_priorite(fp, v, n_distance) + retourne distance, precedent +``` + +# Algorithme de Dijkstra avec file + +\footnotesize + +```C +distance dijkstra(graphe, s, t) +--------------------------------------------------------- + pour v dans sommets(graphe) +O(V) si v != s + distance[v] = infini +O(V) fp = enfiler(fp, v, distance[v]) // notre impl est nulle +------------------O(V * V)------------------------------- + tant que !est_vide(fp) +O(1) u, fp = defiler(fp) +--------------------------------------------------------- +O(E) pour v dans voisinage de u + n_distance = distance[u] + w(u, v) + si n_distance < distance[v] + distance[v] = n_distance +O(V) fp = changer_priorite(fp, v, n_distance) +--------------------------------------------------------- + retourne distance +``` + +* Total: $\mathcal{O}(|V|^2+|E|\cdot |V|)$: + * Graphe dense: $\mathcal{O}(|V|^3)$ + * Graphe peu dense: $\mathcal{O}(|V|^2)$ + +# Algorithme de Dijkstra avec file + +## On peut faire mieux + +* Avec une meilleure implémentation de la file de priorité: + * Tas binaire: $\mathcal{O}(|V|\log|V|+|E|\log|V|)$. + * Tas de Fibonnacci: $\mathcal{O}(|V|+|E|\log|V|)$ +* Graphe dense: $\mathcal{O}(|V|^2\log|V|)$. +* Graphe peu dense: $\mathcal{O}(|V|\log|V|)$. + +# Algorithme de Dijkstra (exercice, 5min) + +{width=60%} + +* Donner la liste de priorité, puis... + +## A chaque étape donner: + +* Le tableau des distances à `a`; +* Le tableau des prédécesseurs; +* L'état de la file de priorité. + +# Algorithme de Dijkstra (corrigé) + + + +# Algorithme de Dijkstra (corrigé) + + + +# Algorithme de Dijkstra (corrigé) + + + +# Algorithme de Dijkstra (corrigé) + + + +# Algorithme de Dijkstra (corrigé) + + + +# Algorithme de Dijkstra (corrigé) + + + +# Limitation de l'algorithme de Dijkstra + +## Que se passe-t-il pour? + +{width=50%} + +## Quel est le problème? + +. . . + +* 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 plus 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 utiliser son 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 + +{width=50%} + +* Bien indiquer l'état de $D$ et $P$ à chaque étape! +* Ne pas oublier de faire la matrice d'adjacence évidemment... + diff --git a/slides/figs/dijkstra_0.png b/slides/figs/dijkstra_0.png new file mode 100644 index 0000000000000000000000000000000000000000..1febf9947095679582659dee7bbf4e689302d8f9 Binary files /dev/null and b/slides/figs/dijkstra_0.png differ diff --git a/slides/figs/dijkstra_1.png b/slides/figs/dijkstra_1.png new file mode 100644 index 0000000000000000000000000000000000000000..2f855cfe367646f1bf50efffddb085e273aed9b2 Binary files /dev/null and b/slides/figs/dijkstra_1.png differ diff --git a/slides/figs/dijkstra_2.png b/slides/figs/dijkstra_2.png new file mode 100644 index 0000000000000000000000000000000000000000..cbb7a2b5a0024d84a9122a7e1283e7eb0d918f34 Binary files /dev/null and b/slides/figs/dijkstra_2.png differ diff --git a/slides/figs/dijkstra_3.png b/slides/figs/dijkstra_3.png new file mode 100644 index 0000000000000000000000000000000000000000..4027bfa27dfb1d63d6aaaebf03eb609fe9102985 Binary files /dev/null and b/slides/figs/dijkstra_3.png differ diff --git a/slides/figs/dijkstra_4.png b/slides/figs/dijkstra_4.png new file mode 100644 index 0000000000000000000000000000000000000000..f3375e8e6b71c095a8bbb19fa14c6b6a05cbdd14 Binary files /dev/null and b/slides/figs/dijkstra_4.png differ diff --git a/slides/figs/dijkstra_5.png b/slides/figs/dijkstra_5.png new file mode 100644 index 0000000000000000000000000000000000000000..d3471865579113425840eb0bad9b472a61f674c9 Binary files /dev/null and b/slides/figs/dijkstra_5.png differ diff --git a/slides/figs/dijkstra_6.png b/slides/figs/dijkstra_6.png new file mode 100644 index 0000000000000000000000000000000000000000..531a6342f83e35d0b99343542075715e0dbec18a Binary files /dev/null and b/slides/figs/dijkstra_6.png differ diff --git a/slides/figs/dijkstra_7.png b/slides/figs/dijkstra_7.png new file mode 100644 index 0000000000000000000000000000000000000000..5ec0cf7df3d0357b19602b9af892cd96d44bd859 Binary files /dev/null and b/slides/figs/dijkstra_7.png differ diff --git a/slides/figs/dijkstra_ex_0.png b/slides/figs/dijkstra_ex_0.png new file mode 100644 index 0000000000000000000000000000000000000000..2419bf8cf77ec49ac2719621e2280323bf595f7c Binary files /dev/null and b/slides/figs/dijkstra_ex_0.png differ diff --git a/slides/figs/dijkstra_ex_1.png b/slides/figs/dijkstra_ex_1.png new file mode 100644 index 0000000000000000000000000000000000000000..d5775128a1c16691afa847486da9d7e767de1e37 Binary files /dev/null and b/slides/figs/dijkstra_ex_1.png differ diff --git a/slides/figs/dijkstra_ex_2.png b/slides/figs/dijkstra_ex_2.png new file mode 100644 index 0000000000000000000000000000000000000000..6b5857a170e77303c6ae95d5bfcc902df598344d Binary files /dev/null and b/slides/figs/dijkstra_ex_2.png differ diff --git a/slides/figs/dijkstra_ex_3.png b/slides/figs/dijkstra_ex_3.png new file mode 100644 index 0000000000000000000000000000000000000000..f5e39113cfb75cb06b1d418e1e044986433a9836 Binary files /dev/null and b/slides/figs/dijkstra_ex_3.png differ diff --git a/slides/figs/dijkstra_ex_4.png b/slides/figs/dijkstra_ex_4.png new file mode 100644 index 0000000000000000000000000000000000000000..1cde97d16dcbb54de1b68c16e6144efc77a932ef Binary files /dev/null and b/slides/figs/dijkstra_ex_4.png differ diff --git a/slides/figs/dijkstra_ex_5.png b/slides/figs/dijkstra_ex_5.png new file mode 100644 index 0000000000000000000000000000000000000000..7f3b1d73b3561fa964198133691b8b2cf59ba022 Binary files /dev/null and b/slides/figs/dijkstra_ex_5.png differ diff --git a/slides/figs/dijkstra_exo.png b/slides/figs/dijkstra_exo.png new file mode 100644 index 0000000000000000000000000000000000000000..2478a3febe25b5b5be58488edbd3bd7faf58acd3 Binary files /dev/null and b/slides/figs/dijkstra_exo.png differ diff --git a/slides/figs/exemple_neg.png b/slides/figs/exemple_neg.png new file mode 100644 index 0000000000000000000000000000000000000000..56fe75a23580b955eb62487b9aa3c7a97874bdb2 Binary files /dev/null and b/slides/figs/exemple_neg.png differ diff --git a/slides/figs/floyd_exemple.png b/slides/figs/floyd_exemple.png new file mode 100644 index 0000000000000000000000000000000000000000..57ad2a4aed82784c51c329e7b0ab16627e02a70a Binary files /dev/null and b/slides/figs/floyd_exemple.png differ diff --git a/slides/figs/floyd_exercice.png b/slides/figs/floyd_exercice.png new file mode 100644 index 0000000000000000000000000000000000000000..309cdec2c4bff89714619d859bc945fead406d4f Binary files /dev/null and b/slides/figs/floyd_exercice.png differ diff --git a/slides/figs/stack_data_structure.svg b/slides/figs/stack_data_structure.svg new file mode 100644 index 0000000000000000000000000000000000000000..f23be4e9eda9938aa3086a999ad23229934c4a98 --- /dev/null +++ b/slides/figs/stack_data_structure.svg @@ -0,0 +1,112 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="900" height="300" id="svg2" sodipodi:version="0.32" inkscape:version="0.46" sodipodi:docname="Stack (data structure) - Kopia.svg" inkscape:output_extension="org.inkscape.output.svg.inkscape" version="1.0"> + <defs id="defs4"> + <marker inkscape:stockid="Arrow1Lstart" orient="auto" refY="0" refX="0" id="Arrow1Lstart" style="overflow:visible"> + <path id="path3595" d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z" style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" transform="matrix(0.8,0,0,0.8,10,0)"/> + </marker> + <inkscape:perspective sodipodi:type="inkscape:persp3d" inkscape:vp_x="0 : 526.18109 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_z="744.09448 : 526.18109 : 1" inkscape:persp3d-origin="372.04724 : 350.78739 : 1" id="perspective10"/> + <inkscape:perspective id="perspective2390" inkscape:persp3d-origin="372.04724 : 350.78739 : 1" inkscape:vp_z="744.09448 : 526.18109 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 526.18109 : 1" sodipodi:type="inkscape:persp3d"/> + <inkscape:perspective id="perspective2397" inkscape:persp3d-origin="372.04724 : 350.78739 : 1" inkscape:vp_z="744.09448 : 526.18109 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 526.18109 : 1" sodipodi:type="inkscape:persp3d"/> + </defs> + <sodipodi:namedview id="base" pagecolor="#ffffff" bordercolor="#666666" borderopacity="1.0" gridtolerance="10000" guidetolerance="10" objecttolerance="10" inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:zoom="1.979899" inkscape:cx="312.8503" inkscape:cy="205.85154" inkscape:document-units="px" inkscape:current-layer="layer1" showgrid="true" inkscape:window-width="1196" inkscape:window-height="702" inkscape:window-x="-8" inkscape:window-y="-8" inkscape:snap-bbox="true" inkscape:object-paths="true"> + <inkscape:grid type="xygrid" id="grid2396" visible="true" enabled="false"/> + </sodipodi:namedview> + <metadata id="metadata7"> + <rdf:RDF> + <cc:Work rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/> + </cc:Work> + </rdf:RDF> + </metadata> + <g inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1" transform="translate(-11.994905,-782.85675)"> + <g id="g5578" transform="translate(-23.246306,-18.180276)"> + <path id="rect2392" d="M 61.055945,1044.6512 L 196.05595,1044.6512 L 196.05595,1069.3179 L 61.055945,1069.3179 L 61.055945,1044.6512 z" style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"/> + <path style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" d="M 61.055945,1019.9845 L 196.05595,1019.9845 L 196.05595,1044.6512 L 61.055945,1044.6512 L 61.055945,1019.9845 z" id="path3165"/> + <path id="path3167" d="M 61.055945,994.98453 L 196.05595,994.98453 L 196.05595,1019.6512 L 61.055945,1019.6512 L 61.055945,994.98453 z" style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"/> + <text sodipodi:linespacing="125%" id="text3169" y="1039.6512" x="46.568642" style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial;-inkscape-font-specification:Arial" xml:space="preserve"><tspan y="1039.6512" x="46.568642" id="tspan3171" sodipodi:role="line">1</tspan></text> + <text sodipodi:linespacing="125%" id="text3173" y="1014.6512" x="46.055946" style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial;-inkscape-font-specification:Arial" xml:space="preserve"><tspan y="1014.6512" x="46.055946" id="tspan3175" sodipodi:role="line">2</tspan></text> + <text sodipodi:linespacing="125%" id="text3177" y="989.52429" x="45.855751" style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial;-inkscape-font-specification:Arial" xml:space="preserve"><tspan y="989.52429" x="45.855751" id="tspan3179" sodipodi:role="line">3</tspan></text> + <path style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" d="M 61.055945,969.98453 L 196.05595,969.98453 L 196.05595,994.65125 L 61.055945,994.65125 L 61.055945,969.98453 z" id="path2403"/> + <path id="path2405" d="M 61.055945,944.98453 L 196.05595,944.98453 L 196.05595,969.65125 L 61.055945,969.65125 L 61.055945,944.98453 z" style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"/> + <text xml:space="preserve" style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial;-inkscape-font-specification:Arial" x="46.178017" y="964.62195" id="text2407" sodipodi:linespacing="125%"><tspan sodipodi:role="line" id="tspan2409" x="46.178017" y="964.62195">4</tspan><tspan id="tspan2415" sodipodi:role="line" x="46.178017" y="989.62195"/></text> + <text sodipodi:linespacing="125%" id="text2411" y="1064.1959" x="45.885048" style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial;-inkscape-font-specification:Arial" xml:space="preserve"><tspan y="1064.1959" x="45.885048" id="tspan2413" sodipodi:role="line">0</tspan></text> + <path id="path2544" d="M 242.8671,1044.6512 L 377.8671,1044.6512 L 377.8671,1069.3179 L 242.8671,1069.3179 L 242.8671,1044.6512 z" style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"/> + <path style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" d="M 242.8671,1019.9845 L 377.8671,1019.9845 L 377.8671,1044.6512 L 242.8671,1044.6512 L 242.8671,1019.9845 z" id="path2546"/> + <path id="path2548" d="M 242.8671,994.98453 L 377.8671,994.98453 L 377.8671,1019.6512 L 242.8671,1019.6512 L 242.8671,994.98453 z" style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"/> + <text sodipodi:linespacing="125%" id="text2550" y="1039.6512" x="228.37979" style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial;-inkscape-font-specification:Arial" xml:space="preserve"><tspan y="1039.6512" x="228.37979" id="tspan2552" sodipodi:role="line">1</tspan></text> + <text sodipodi:linespacing="125%" id="text2554" y="1014.6512" x="227.8671" style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial;-inkscape-font-specification:Arial" xml:space="preserve"><tspan y="1014.6512" x="227.8671" id="tspan2556" sodipodi:role="line">2</tspan></text> + <text sodipodi:linespacing="125%" id="text2558" y="989.52429" x="227.6669" style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial;-inkscape-font-specification:Arial" xml:space="preserve"><tspan y="989.52429" x="227.6669" id="tspan2560" sodipodi:role="line">3</tspan></text> + <path style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" d="M 242.8671,969.98453 L 377.8671,969.98453 L 377.8671,994.65125 L 242.8671,994.65125 L 242.8671,969.98453 z" id="path2562"/> + <path id="path2564" d="M 242.86711,944.98453 L 377.86711,944.98453 L 377.86711,969.65125 L 242.86711,969.65125 L 242.86711,944.98453 z" style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"/> + <text xml:space="preserve" style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial;-inkscape-font-specification:Arial" x="227.98917" y="964.62195" id="text2566" sodipodi:linespacing="125%"><tspan sodipodi:role="line" id="tspan2568" x="227.98917" y="964.62195">4</tspan><tspan id="tspan2570" sodipodi:role="line" x="227.98917" y="989.62195"/></text> + <text sodipodi:linespacing="125%" id="text2572" y="1064.1959" x="227.6962" style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial;-inkscape-font-specification:Arial" xml:space="preserve"><tspan y="1064.1959" x="227.6962" id="tspan2574" sodipodi:role="line">0</tspan></text> + <path id="path2580" d="M 424.67822,1044.6512 L 559.67822,1044.6512 L 559.67822,1069.3179 L 424.67822,1069.3179 L 424.67822,1044.6512 z" style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"/> + <path style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" d="M 424.67822,1019.9845 L 559.67822,1019.9845 L 559.67822,1044.6512 L 424.67822,1044.6512 L 424.67822,1019.9845 z" id="path2582"/> + <path id="path2584" d="M 424.67822,994.98453 L 559.67822,994.98453 L 559.67822,1019.6512 L 424.67822,1019.6512 L 424.67822,994.98453 z" style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"/> + <text sodipodi:linespacing="125%" id="text2586" y="1039.6512" x="410.19092" style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial;-inkscape-font-specification:Arial" xml:space="preserve"><tspan y="1039.6512" x="410.19092" id="tspan2588" sodipodi:role="line">1</tspan></text> + <text sodipodi:linespacing="125%" id="text2590" y="1014.6512" x="409.67822" style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial;-inkscape-font-specification:Arial" xml:space="preserve"><tspan y="1014.6512" x="409.67822" id="tspan2592" sodipodi:role="line">2</tspan></text> + <text sodipodi:linespacing="125%" id="text2594" y="989.52429" x="409.47803" style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial;-inkscape-font-specification:Arial" xml:space="preserve"><tspan y="989.52429" x="409.47803" id="tspan2596" sodipodi:role="line">3</tspan></text> + <path style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" d="M 424.67822,969.98453 L 559.67822,969.98453 L 559.67822,994.65125 L 424.67822,994.65125 L 424.67822,969.98453 z" id="path2598"/> + <path id="path2600" d="M 424.67822,944.98453 L 559.67822,944.98453 L 559.67822,969.65125 L 424.67822,969.65125 L 424.67822,944.98453 z" style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"/> + <text xml:space="preserve" style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial;-inkscape-font-specification:Arial" x="409.80029" y="964.62195" id="text2602" sodipodi:linespacing="125%"><tspan sodipodi:role="line" id="tspan2604" x="409.80029" y="964.62195">4</tspan><tspan id="tspan2606" sodipodi:role="line" x="409.80029" y="989.62195"/></text> + <text sodipodi:linespacing="125%" id="text2608" y="1064.1959" x="409.50732" style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial;-inkscape-font-specification:Arial" xml:space="preserve"><tspan y="1064.1959" x="409.50732" id="tspan2610" sodipodi:role="line">0</tspan></text> + <path id="path2616" d="M 606.48937,1044.6512 L 741.48937,1044.6512 L 741.48937,1069.3179 L 606.48937,1069.3179 L 606.48937,1044.6512 z" style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"/> + <path style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" d="M 606.48937,1019.9845 L 741.48937,1019.9845 L 741.48937,1044.6512 L 606.48937,1044.6512 L 606.48937,1019.9845 z" id="path2618"/> + <path id="path2620" d="M 606.48937,994.98453 L 741.48937,994.98453 L 741.48937,1019.6512 L 606.48937,1019.6512 L 606.48937,994.98453 z" style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"/> + <text sodipodi:linespacing="125%" id="text2622" y="1039.6512" x="592.00208" style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial;-inkscape-font-specification:Arial" xml:space="preserve"><tspan y="1039.6512" x="592.00208" id="tspan2624" sodipodi:role="line">1</tspan></text> + <text sodipodi:linespacing="125%" id="text2626" y="1014.6512" x="591.48938" style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial;-inkscape-font-specification:Arial" xml:space="preserve"><tspan y="1014.6512" x="591.48938" id="tspan2628" sodipodi:role="line">2</tspan></text> + <text sodipodi:linespacing="125%" id="text2630" y="989.52429" x="591.28918" style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial;-inkscape-font-specification:Arial" xml:space="preserve"><tspan y="989.52429" x="591.28918" id="tspan2632" sodipodi:role="line">3</tspan></text> + <path style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" d="M 606.48937,969.98453 L 741.48937,969.98453 L 741.48937,994.65125 L 606.48937,994.65125 L 606.48937,969.98453 z" id="path2634"/> + <path id="path2636" d="M 606.48937,944.98453 L 741.48937,944.98453 L 741.48937,969.65125 L 606.48937,969.65125 L 606.48937,944.98453 z" style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"/> + <text xml:space="preserve" style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial;-inkscape-font-specification:Arial" x="591.61145" y="964.62195" id="text2638" sodipodi:linespacing="125%"><tspan sodipodi:role="line" id="tspan2640" x="591.61145" y="964.62195">4</tspan><tspan id="tspan2642" sodipodi:role="line" x="591.61145" y="989.62195"/></text> + <text sodipodi:linespacing="125%" id="text2644" y="1064.1959" x="591.31848" style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial;-inkscape-font-specification:Arial" xml:space="preserve"><tspan y="1064.1959" x="591.31848" id="tspan2646" sodipodi:role="line">0</tspan></text> + <g transform="translate(769.3005,38.058349)" id="g2650"> + <path style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" d="M 19,1006.5929 L 154,1006.5929 L 154,1031.2596 L 19,1031.2596 L 19,1006.5929 z" id="path2652"/> + <path id="path2654" d="M 19,981.92618 L 154,981.92618 L 154,1006.5929 L 19,1006.5929 L 19,981.92618 z" style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"/> + <path style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" d="M 19,956.92618 L 154,956.92618 L 154,981.5929 L 19,981.5929 L 19,956.92618 z" id="path2656"/> + <text xml:space="preserve" style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial;-inkscape-font-specification:Arial" x="4.5126953" y="1001.5929" id="text2658" sodipodi:linespacing="125%"><tspan sodipodi:role="line" id="tspan2660" x="4.5126953" y="1001.5929">1</tspan></text> + <text xml:space="preserve" style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial;-inkscape-font-specification:Arial" x="4" y="976.5929" id="text2662" sodipodi:linespacing="125%"><tspan sodipodi:role="line" id="tspan2664" x="4" y="976.5929">2</tspan></text> + <text xml:space="preserve" style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial;-inkscape-font-specification:Arial" x="3.7998047" y="951.46594" id="text2666" sodipodi:linespacing="125%"><tspan sodipodi:role="line" id="tspan2668" x="3.7998047" y="951.46594">3</tspan></text> + <path id="path2670" d="M 19,931.92618 L 154,931.92618 L 154,956.5929 L 19,956.5929 L 19,931.92618 z" style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"/> + <path style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" d="M 19,906.92618 L 154,906.92618 L 154,931.5929 L 19,931.5929 L 19,906.92618 z" id="path2672"/> + <text sodipodi:linespacing="125%" id="text2674" y="926.5636" x="4.1220703" style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial;-inkscape-font-specification:Arial" xml:space="preserve"><tspan y="926.5636" x="4.1220703" id="tspan2676" sodipodi:role="line">4</tspan><tspan y="951.5636" x="4.1220703" sodipodi:role="line" id="tspan2678"/></text> + <text xml:space="preserve" style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial;-inkscape-font-specification:Arial" x="3.8291016" y="1026.1376" id="text2680" sodipodi:linespacing="125%"><tspan sodipodi:role="line" id="tspan2682" x="3.8291016" y="1026.1376">0</tspan></text> + </g> + <text sodipodi:linespacing="125%" id="text2684" y="1064.1427" x="303.69717" style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial;-inkscape-font-specification:Arial" xml:space="preserve"><tspan y="1064.1427" x="303.69717" id="tspan2686" sodipodi:role="line">A</tspan></text> + <text sodipodi:linespacing="125%" id="text2688" y="1039.4761" x="485.30811" style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial;-inkscape-font-specification:Arial" xml:space="preserve"><tspan y="1039.4761" x="485.30811" id="tspan2690" sodipodi:role="line">B</tspan></text> + <text xml:space="preserve" style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial;-inkscape-font-specification:Arial" x="485.5083" y="1064.1427" id="text2763" sodipodi:linespacing="125%"><tspan sodipodi:role="line" id="tspan2765" x="485.5083" y="1064.1427">A</tspan></text> + <text xml:space="preserve" style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial;-inkscape-font-specification:Arial" x="121.88602" y="846.32251" id="text2816" sodipodi:linespacing="125%"><tspan sodipodi:role="line" id="tspan2818" x="121.88602" y="846.32251">A</tspan></text> + <g transform="translate(-110.82003,-12.8571)" id="g5458"> + <g id="g5454"> + <path style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-start:none;stroke-opacity:1" d="M 239.37598,930.5929 L 239.37598,885.5929" id="path4887" sodipodi:nodetypes="cs"/> + <path sodipodi:nodetypes="ccc" transform="translate(4.3759766,771.5929)" id="path5452" d="M 230,149 L 235,159 L 240,149" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"/> + </g> + </g> + <text xml:space="preserve" style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial;-inkscape-font-specification:Arial" x="303.49698" y="846.32251" id="text5496" sodipodi:linespacing="125%"><tspan sodipodi:role="line" id="tspan5498" x="303.49698" y="846.32251">B</tspan></text> + <g id="g5500" transform="translate(70.991133,-12.8571)"> + <g id="g5502"> + <path sodipodi:nodetypes="cs" id="path5504" d="M 239.37598,930.5929 L 239.37598,885.5929" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-start:none;stroke-opacity:1"/> + <path style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" d="M 230,149 L 235,159 L 240,149" id="path5506" transform="translate(4.3759766,771.5929)" sodipodi:nodetypes="ccc"/> + </g> + </g> + <text sodipodi:linespacing="125%" id="text5508" y="846.32251" x="485.30811" style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial;-inkscape-font-specification:Arial" xml:space="preserve"><tspan y="846.32251" x="485.30811" id="tspan5510" sodipodi:role="line">B</tspan></text> + <g transform="matrix(1,0,0,-1,252.80224,1803.3287)" id="g5512"> + <g id="g5514"> + <path style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-start:none;stroke-opacity:1" d="M 239.37598,930.5929 L 239.37598,885.5929" id="path5516" sodipodi:nodetypes="cs"/> + <path sodipodi:nodetypes="ccc" transform="translate(4.3759766,771.5929)" id="path5518" d="M 230,149 L 235,159 L 240,149" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"/> + </g> + </g> + <text sodipodi:linespacing="125%" id="text5520" y="1064.1427" x="485.5083" style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial;-inkscape-font-specification:Arial" xml:space="preserve"><tspan y="1064.1427" x="485.5083" id="tspan5522" sodipodi:role="line">A</tspan></text> + <text xml:space="preserve" style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial;-inkscape-font-specification:Arial" x="667.31946" y="1064.1427" id="text5558" sodipodi:linespacing="125%"><tspan sodipodi:role="line" id="tspan5560" x="667.31946" y="1064.1427">A</tspan></text> + <g id="g5566" transform="matrix(1,0,0,-1,434.61339,1803.3287)"> + <g id="g5568"> + <path sodipodi:nodetypes="cs" id="path5570" d="M 239.37598,930.5929 L 239.37598,885.5929" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-start:none;stroke-opacity:1"/> + <path style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" d="M 230,149 L 235,159 L 240,149" id="path5572" transform="translate(4.3759766,771.5929)" sodipodi:nodetypes="ccc"/> + </g> + </g> + <text xml:space="preserve" style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial;-inkscape-font-specification:Arial" x="667.31946" y="846.32251" id="text5574" sodipodi:linespacing="125%"><tspan sodipodi:role="line" id="tspan5576" x="667.31946" y="846.32251">A</tspan></text> + </g> + </g> +<script xmlns="" public-path="moz-extension://ff8cca0e-5336-417a-b78e-a0d94c485783/"/></svg> \ No newline at end of file diff --git a/slides/figs/taux_change.pdf b/slides/figs/taux_change.pdf new file mode 100644 index 0000000000000000000000000000000000000000..19d6d68a51bc6b1717dd454c4d75540ddff54bca Binary files /dev/null and b/slides/figs/taux_change.pdf differ diff --git a/slides/figs/taux_change_graphe.pdf b/slides/figs/taux_change_graphe.pdf new file mode 100644 index 0000000000000000000000000000000000000000..80a2744c7c35b763cce84ee958db62e2adc6cd9e Binary files /dev/null and b/slides/figs/taux_change_graphe.pdf differ diff --git a/slides/figs/taux_change_graphe_log.pdf b/slides/figs/taux_change_graphe_log.pdf new file mode 100644 index 0000000000000000000000000000000000000000..86800b31414bdfd58a0122eb5f7dccb95fc96540 Binary files /dev/null and b/slides/figs/taux_change_graphe_log.pdf differ