0% ont trouvé ce document utile (0 vote)
367 vues55 pages

Modèles et Algorithmes des Graphes

Ce document décrit le contenu d'un cours sur les modèles et algorithmes pour les graphes. Il contient des informations sur les représentations des graphes, les algorithmes de parcours, de plus court chemin, d'arbres couvrants minimum et de flot maximum.

Transféré par

Sombry Virtuoz
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
367 vues55 pages

Modèles et Algorithmes des Graphes

Ce document décrit le contenu d'un cours sur les modèles et algorithmes pour les graphes. Il contient des informations sur les représentations des graphes, les algorithmes de parcours, de plus court chemin, d'arbres couvrants minimum et de flot maximum.

Transféré par

Sombry Virtuoz
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

Contenu du cours

Modèles et Algorithmes pour les Graphes 1. Généralités sur les graphes : exemples de graphes comme modèles de
situations concrètes, et questions associées pour découverte des notions
(chemins, PCC, fermeture transitive, descendance, clique, CFC, arbres, etc.).

Équipe pédagogique : 2. Représentation des graphes, structures de données associées : plusieurs


représentations (matrice d’adjacence, liste des prédécesseurs, liste des
Rumen Andonov <randonov@[Link]> : CM et TD (G1, G2 en Info, successeurs), équivalence et passage de l’une à l’autre.
3. Notions de complexité des algorithmes (ordre de grandeur des fonctions).
Victor Epain <[Link]@[Link]> : TD (G3 en Info et G1 en MIAGE) 4. Parcours en profondeur « Depth-first search (DFS) » et en largeur « Breadth-first
Arthur Gontier <[Link]@[Link]> : TD (G2 en MIAGE) search (BFS) ». Directed Acyclic Graph (DAG).
5. Composantes fortement connexes.
Université de Rennes 1 et INRIA Rennes Bretagne-Atlantique 6. Les problèmes du plus court chemin (PCC) :
algorithme de Dijkstra. Binary heap (tas binaire) ;
algorithme de Bellman-Ford. Découverte des circuits négatifs ;
PCC dans un DAG (ordre topologique).
7. Algorithmes gourmands pour l’ACM (Minimum spanning tree) : algs de Prim et
de Kruskal.
8. Le problème du flot maximum dans les réseaux de transport.
9. Chemins, flots et programmes linéaires dans les graphes.

2/220 2/220

Bibliographie

Ce cours est fondé essentiellement sur les références suivantes.


Algorithms, S. Dasgupta, C. H. Papadimitriou, et U. V. Vazirani, McGraw-Hill Généralités, notions de base, exemples d’applications
2006 (the undergraduate Algorithms course at Berkeley and U.C. San Diego)
Graphes et algorithmes, Michel Gondran et Michel Minoux, Eyrolles, 1995
Introduction à algorithmique, T. Cormen, C. Leiserson, R. Rivest, DUNOD, 1994.

3/220 3/220 4/220 4/220


Définitions formelles et notations : graphe, graphe orienté et non orienté Exemples de graphes
Obtention d’un diplôme Master d’informatique (Exam. décembre 2008)

Pour obtenir un Master d’informatique, il est nécessaire d’avoir passé un certain


nombre de modules. Chaque module demande un certain nombre de prérequis. Un
Un graphe est un doublet G = (V , E ), où V = {v1 , v2 , . . . , vn } est l’ensemble des master simplifié pourrait se composer (prérequis entre parenthèses) de :
sommets/noeuds et E est un ensemble de couples (u , v ) ∈ V × V . Si tous les Système (Programmation) ;
couples (u , v ) ∈ E sont symétriques, le graphe est dit non orienté. Sinon, le graphe
MAG (Programmation, Math Discrètes) ;
est orienté. Un couple symétrique / non ordonné est dit une arête. Un couple non
symétrique / ordonné est dit un arc. Sécurité réseau (Système, Initiation réseau) ;
Initiation réseau (Programmation, MAG) ;
Systèmes répartis (MAG, Système, Initiation réseau).

1. Modéliser les prérequis à l’aide d’un graphe.


2. Quel est le nombre minimum de semestres pour obtenir ce master ? On suppose
bien sur que vous passez tous les examens avec succès, que chaque module
dure un semestre et est enseigné chaque semestre. Le nombre de modules
Deux graphes : non orienté et orienté. suivis par un étudiant pendant un semestre n’est pas limité et il n’y a pas de
problème d’emploi du temps. Indiquer l’algorithme utilisé et justifiez votre choix.
3. Un étudiant décide d’étudier un module dès qu’il a obtenu les modules
prérequis. Quel est le nombre maximum de modules qu’il devra suivre
simultanément en appliquant cette stratégie ? Quel algorithme permet de le
calculer ? Justifiez votre choix.
5/220 5/220 6/220 6/220

Obtention d’un diplôme Master d’informatique : suite 1 Obtention d’un diplôme Master d’informatique : suite 2

1. Modéliser les prérequis à l’aide d’un graphe.

1. Quel est le nombre minimum de semestres pour obtenir ce master ?

Les modules sont ordonnancés de gauche à droite sur l’axe horizontal.


Modélisation à l’aide d’un graphe : les sommets correspondent aux modules, les arcs
- aux prérequis.

7/220 7/220 8/220 8/220


Obtention d’un diplôme Master d’informatique : suite 3 Exemple de graphes : suite

Construction d’un pavillon

1. Quel est le nombre minimum de semestres pour obtenir ce master ? La construction d’un pavillon demande la réalisation d’un certain nombre de tâches.
La liste des tâches à effectuer, leur durée et les contraintes d’antériorités à respecter
sont données dans le table ci-dessus. Le travail commençant à la date 0, on cherche
un planning des opérations qui permet de minimiser la durée totale.

Code tâche libellé durée antériorité


(semaines)
A Travaux de maçonnerie 7 -
B Charpente de la toiture 3 A
C Toiture 1 B
D Installation électrique 8 A
E Façade 2 D,C
F Fenêtres 1 D,C
G Aménagement du jardin 1 D,C
Au moins 4 semestres sont nécessaires pour obtenir ce master. Cela peut se calculer H Travaux de plafonnage 3 F
par un algorithme du plus long chemin dans un graphes sans cycles. J Mise en peinture 2 H
K Emménagement 1 E,G,J

F IGURE 1 – Liste des tâches, durée et contraintes.

9/220 9/220 10/220 10/220

Définitions formelles et notations : chemins, circuit, chaîne, cycle Vocabulaire

Un chemin P dans un graphe orienté G est une suite d’arcs dont les extrémités
droites/gauches coïncident de la façon suivante :
P = ((u0 , u1 ), (u1 , u2 ), (u2 , u3 ), . . . , (uk −1 , uk )). La longueur du P est le nombre Soit le graphe orienté G = (V , E ).
d’arcs (ici k ).
Pour un arc (x , y ) ∈ E, x est l’origine et y est l’extrémité de l’arc.
Si u0 = uk , le chemin est appelé circuit. On dit aussi que y est successeur de x, ou que x est prédécesseur de y .
Un chemin élémentaire est défini par une suite de sommets sans répétition (sauf Γ+ (x ) = {y ∈ V | (x , y ) ∈ E } est l’ensemble des successeurs de x.
pour le premier et le dernier sommet).
Γ−1 (x ) = {z ∈ V |(z , x ) ∈ E } est l’ensemble des prédécesseurs de x.
Si le graphe est non orienté, on utilise chaîne et cycle à la place de chemin et
d + (x ) = |Γ(x )| est le degré extérieur de x.
circuit.
d − (x ) = |Γ−1 (x )| est le degré intérieur de x.
Un graphe sans cycle/circuit est appelé acyclique / sans circuit.
d (x ) = d + (x ) + d − (x ) est le degré de x.
Un graphe non orienté tel que chaque couple de sommets est connecté par une
chaîne est dit connexe. Un chemin P allant de x à y , dont on ne précise pas les sommets intermédiaires,
sera noté : P = x ; y . y est alors un descendant de x et x un ascendant de y .
Un graphe orienté tel que chaque couple de sommets (u , v ) est connecté par un
chemin dans les deux sens (c.-à-d. de u à v et de v à u) est dit fortement
connexe. On dit aussi que les sommets u et v sont mutuellement accessibles.
Un graphe, non orienté, connexe et acyclique est dit arbre.

11/220 11/220 12/220 12/220


Vocabulaire : Illustration pour le problème "Obtention d’un diplôme" Vocabulaire

Soit le graphe G = (V , E ) où |V | = n et |E | = m. On dit parfois que G est d’ordre n.


Deux sommets sont indépendants s’ils ne sont pas connectés, c’est-à-dire pas
adjacents.
Il existe 2 cas extrêmes pour l’ensemble de ses arêtes : soit le graphe n’a
aucune arête : on parle alors de stable. Soit toutes les arêtes possibles pouvant
relier les sommets 2 à 2 sont présentes : le graphe est dit alors complet.
On dit aussi qu’ensemble de sommets est indépendant (ou stable) s’il n’y a pas
deux de ses sommets adjacents.
Une clique est un sous-graphe complet.
Un stable est un sous-graphe sans arête.
d + (PROG) = 3, d − (PROG) = 0 : PROG est un sommet source.
d + (SysRep) = 0, d − (SysRep) = 3 : SysRep est un sommet target/puits Pour un graphe général, il est souvent intéressant de rechercher de tels sous-graphes.
d + (MAG) = 2, d − (MAG) = 2 : MAG est un sommet intermédiaire.

13/220 13/220 14/220 14/220

Exemple de graphes : devoir maison Planning d’examen : solution

Planning d’examen

Les cinq étudiants : Dupont, Dupond, Durand, Duval et Duduche doivent passer
certaines épreuves parmi les suivants : Français, Anglais, Dessin, Couture,
On construit le graphe G = (V , E ) tel que V = {F , A, D , C , M , S } (un sommet par
Mécanique et Solfège. L’examen se déroulant par écrit, on désire que tous les
épreuve) et une arête relie deux solmmets si et seulement si un même candidat doit
étudiants qui doivent subir une même épreuve le fassent simultanément. Chaque
subir les épreuves correspondants.
étudiant ne peut se présenter qu’à une épreuve au plus chaque jour. Ci-dessous la
liste des épreuves que doit passer chaque étudiant : Dupont : Français, Anglais, 1. Le nombre maximal d’épreuves que l’on peut organiser le même jour est donné
Mécanique ; Dupond : Dessin, Couture ; Durand : Anglais, Solfège ; Duval : Dessin, alors par le cardinal du stable maximum {F , S , C }, donc 3.
Couture, Mécanique ; Duduche : Dessin, Solfège. 2. Pour trouver le nombre minimal de jours nécessaires à l’organisation de toutes
1. Quel est le nombre maximal d’épreuves que l’on peut organiser le même jour ? les épreuves on peut appliquer l’algorithme suivant : tant qu’il y un graphe
non-vide, on trouve le stable max et on enlève du graphe ; sur le graphe ainsi
2. Quel est le nombre minimal de jours nécessaires à l’organisation de toutes les
réduit on applique la même stratégie. La réponse est trois jours dans le cas
épreuves ?
consideré ; le 1e jour on organise {F , S , C }, le 2e jour on organise {A, D }, le
dernier jour on organise {M },

15/220 15/220 16/220 16/220


Exemple des graphes : les 7 ponts de Königsberg Vocabulaire et modélisation

On appelle chaîne eulérienne (resp. cycle eulérien) une chaîne (resp. un cycle)
qui emprunte une fois et une seule chaque arête du graphe.
Théorème d’Euler : Un graphe connexe a une chaîne eulérienne si et
seulement si tous ses sommets ont un degré pair ou tous ses sommets ont un
degré pair sauf deux sommets.
On peut démontrer que :
si le graphe n’a pas de sommet impair, alors il a un cycle eulérien.
un graphe ayant plus de deux sommets impairs ne possède pas de chaîne
eulérienne (donc non pour le graphe de la ville de Königsberg).
La ville de Königsberg sur le Pregel et ses 7 ponts. Déterminer s’il existe ou non une si le graphe a deux sommets impairs, ce sont les extrémités de la chaîne eulérienne.
promenade dans les rues de Königsberg permettant, à partir d’un point de départ au
choix, de passer une et une seule fois par chaque pont, et de revenir à son point de
départ. Ce problème (résolu par Leonhard Euler en 1736) est considéré comme
l’origine de la théorie des graphes.

17/220 17/220 18/220 18/220

Les 7 ponts de Königsberg : Modélisation et solution Exemples de graphes : suite

Modéliser l’accessibilité au centre-ville de l’Utopia (examen 2011/12)

Un ingénieur du service technique de la ville Utopia propose, pour la zone centrale, le


plan sens unique représenté à la figure (4). Avant d’adopter le plan, il convient
d’examiner s’il autorise la circulation des automobiles, c’est à dire s’il permet d’aller
de n’importe quel point à n’importe quel autre.
1. Enumérer les algorithmes vus en cours pouvant résoudre ce problème. Donner
la complexité de ces algorithmes pour un graphe quelconque G = (V , E ).
2. Appliquer l’algorithme de votre choix sur le graphe de la figure. Le calcul à
chaque itération sera clairement indiqué.
3. Vous constaterez facilement que le plan n’est pas acceptable. Quelles sont les
L’analyse des degrés des sommets montre que zones où les sommets sont mutuellement accessibles ? Quelle est la
d (A) = 3, d (B ) = 3, d (C ) = 5, d (D ) = 3. dénomination de ces zones dans la terminologie spécifique pour l’algorithme en
Ce graphe a plus de deux sommets impairs et ne possède donc pas de cycle eulérien considération ?
d’après le théorème d’Euler. 4. Trouver le nombre minimum de rues tel que l’inversion du sens de circulation
dans chacune de ces rues rend ce plan acceptable. Combien de solutions avez
vous trouvées ? Quelles sont ces solutions ?

19/220 19/220 20/220 20/220


Modéliser l’accessibilité au centre-ville de l’Utopia Modéliser l’accessibilité au centre-ville de l’Utopia : solution

1 2 3 4
1 2 3 4

5 6 7 8 9
5 6 7 8 9

10 11 12 13 14 15
10 11 12 13 14 15
F IGURE 3 – Les sommets jaunes et verts ne sont pas joignables à partir des sommets rouges.
F IGURE 2 – Le plan de sens uniques du centre-ville. Les trois zones coloriées en rouge, jaune et vert sont des Composantes Fortements Connexes
(CFC)

21/220 21/220 22/220 22/220

Modéliser l’accessibilité au centre-ville de l’Utopia Graphe de de Bruijn : à voir en TD

Un graphe de de Bruijn est un graphe


orienté qui permet de représenter les
chevauchements de longueur n − 1 entre
1 2 3 4
tous les mots de longueur n sur un
alphabet donné.
Le graphe de de Bruijn B (k , n) d’ordre n
sur un alphabet A à k lettres est construit
5 6 7 8 9
comme suit. Les sommets de B (k , n) sont
étiquetés par les k n mots de longueur n
sur A. Si u et v sont deux sommets, il y a
un arc de u à v s’il existe deux lettres a et
10 11 12 13 14 15 b, et un mot x, tels que u = ax et v = xb.
La présence d’un arc signifie donc un
F IGURE 4 – Le plan devient acceptable si on inverse au moins un arc (par exemple si l’arc chevauchement maximal entre deux mots
(14, 15) devient (15, 14)). de même longueur.
Le graphe B (2, 3) ci-contre est construit
sur un alphabet binaire A={0, 1} pour des
mots de longueur n = 3.

23/220 23/220 24/220 24/220


Exemple de graphes : Le problème de mariage (couplage) Le problème du flot maximum : un grand classique du domaine

Soit G = (V , E ) un graphe. Rappel : Soit R = (X , U , C ) un graphe connexe orienté (réseau). A ∀ arc u on affecte une
Un couplage M est un ensemble d’arêtes deux à deux non adjacentes. valeur (capacité) cu qui est une borne supérieure du flux sur l’arc.
Une couverture par sommets C est un ensemble de sommets tel que chaque Soit deux sommets particuliers s ∈ X (source) et t ∈ X (puits). Considérons le
arête est incidente avec au moins un sommet de C. graphe G0 = (X , U 0 ) où U 0 = U ∪ {t , s}.
Soit un graphe biparti G(U ∪ V , E ). L’ensemble des arêtes représente les couples
la loi de conservation du flot doit être satisfaite pour chaque sommet.
compatibles. Il s’agit de trouver le couplage maximum (un couplage contenant le plus
grand nombre possible d’arêtes) . Ci-dessous le problème de mariage modélisé comme un problème du flot
maximum. Les capacités sont fixées à 1 partout.

F IGURE 5 – Il s’agit de marier ces personnes en satisfaisant les contraintes des couples
compatibles. On peut voir ici (par énumération) qu’on ne peut marier que trois couples.

Pour le cas général, montrer que ce problème se réduit au problème du flot


maximum.
25/220 25/220 26/220 26/220

Le problème du flot maximum : solution Représentations des graphes : listes de successeurs

Dans le graphe ci-dessous à gauche on va chercher le nombre maximum de


chemins sommet-disjoints (donc ils ne se croisent pas) de s à t.
La solution est donnée à droite. On trouve trois chemins sommet-disjoints de s à
t. Cette valeur correspond à la valeur du couplage maximum. Soit le graphe G = (V , E ) où |V | = n et |E | = m. G peut être représenté en mémoire
soit par des listes d’adjacence, soit par une matrice d’adjacence.
Un graphe et sa représentation par des listes de successeurs.

27/220 27/220 28/220 28/220


Représentations des graphes : matrice d’adjacence Représentations des graphes : matrice d’incidence

Soit le graphe G = (V , E ) où |V | = n et |E | = m. G peut être représenté en mémoire


soit par des listes d’adjacence, soit par une matrice d’adjacence.
Soit le graphe G = (V , E ) où |V | = n et |E | = m.
La matrice d’adjacence d’un graphe G = (V , E ) où |V | = n, est une matrice
carrée de taille n et définie par : La matrice d’incidence sommet/arc d’un graphe orienté est une matrice
 A = [ai ,j ] i = 1, 2, . . . , |V | et j = 1, 2, . . . , |E | telle que :
1 si (u , v ) ∈ E
A(u , v ) = 
0 sinon  +1 si l’arc uj est sortant pour le sommet i
ai ,j = −1 si l’arc uj est entrant pour le sommet i

0 sinon

u1 u2 u3 u4 u5
s +1 +1 0 0 0
A= t 0 0 0 −1 −1
a −1 0 +1 +1 0
b 0 −1 −1 0 +1

Remarque : les valeurs en bleu sont les poids (longueurs) des arcs.

29/220 29/220 30/220 30/220

LP formulation for Shortest/Longest path problem (SPP/LPP) : Example LP formulation for Shortest/Longest path problem (SPP/LPP)
Any path from s to t can be represented by the vector x where xe = 1 if the arc e belongs to the
path, xe = 0 otherwise and under the conditions

xsu xsv xuv xut xvt Let A be the node-arc incidence matrix and denote by ai its ith row. The flow
s +1 +1 0 0 0 conservation law for any intermediate vertex i is written :
A= t 0 0 0 −1 −1
u −1 0 +1 +1 0 ai x = 0 (6)
v 0 −1 −1 0 +1
The linear program is :
Left : Values in red are the weights. Right : A denotes the node-arc incidence matrix for this
example. let d ∈ R n be defined as
a flow of value 1 exits the vertex s :
 max(min) ∑ xe we (7)
 +1 i =s e∈E
xsu + xsv = 1 (1) di = −1 i =t Ax =d (8)

a flow of value 1 enters the vertex t : 0 otherwise
∀e ∈ E , xe ∈ {0, 1} (9)
xut + xvt = 1 ⇔ −xut − xvt = −1 (2) Exemple :
flow conservation law for the intermediate vertex u :
xsu = xuv + xut ⇔ −xsu + xuv + xut = 0 (3) xsu xsv xuv xut xvt
flow conservation law for the intermediate vertex v :
s +1 +1 0 0 0
A= t 0 0 0 −1 −1
xsv + xuv = xut ⇔ −xsv − xuv + xut = 0 (4)
u −1 0 +1 +1 0
the goal is to maximize/minimize the total weight : v 0 −1 −1 0 +1
max(min)z = xsu + 2xsv + 2xuv + 3xut + xvt (5)
Values in red are the weights.
31/220 31/220 32/220 32/220
LP formulation for Shortest/Longest path problem (SPP/LPP) Le problème du flot maximum

Soit R = (X , U , C ) un graphe connexe orienté (réseau). A ∀ arc u on affecte une


valeur (capacité) cu qui est une borne supérieure du flux sur l’arc.
Any path from s to t can be represented by the vector x where xe = 1 if the arc e Soit deux sommets particuliers s ∈ X (source) et t ∈ X (puits). Considérons le
belongs to the path, xe = 0 otherwise and under the conditions graphe G0 = (X , U 0 ) où U 0 = U ∪ {t , s}. L’arc (t , s) est appelé l’arc de retour du
flow conservation law for any intermediate vertex v : flot (numéroté 0). Notons M = |U |.
On dit que [φ1 , φ2 , . . . φM ]T est un flot de s à t ssi la loi de conservation du flot est
∀v ∈ V ∑ xuv = ∑ xvu (10)
vraie en tout ∀u ∈ X \{s, t }, i.e.
(u ,v )∈E (v ,u )∈E

a flow of value 1 exits the vertex s and enters the vertex t : ∑ φ(u ,v ) = ∑ φ(v ,u ) (13)
(u ,v )∈Γ+ (u ) (v ,u )∈Γ− (u )

∑ xsv = 1 et ∑ xut = 1 (11) La valeur du flot est notée par φ0 . Elle est définie par
(s,v )∈E (u ,t )∈E

the goal is to maximize/minimize the total weight :


∑ φ(s,v ) = ∑ φ(u ,t ) = φ0 (valeur du flot) (14)
v ∈Γ+ (s) u ∈Γ− (t )

max(min)z = ∑ xuv wuv (12) But : Trouver dans G0 un flot compatible φ0 = [φ0 , φ1 , φ2 , . . . φM ] (c.-à-d.
(u ,v )∈E
0 ≤ φu ≤ cu , ∀u =∈ U (15)
Equations (10), (11) and (12) represent a linear program (LP).
et tel que φ0 soit maximale.

Appliquer ce modèle pour le problème des cases admissibles.


33/220 33/220 34/220 34/220

Exemple de graphes Problème des cases admissibles : exemple

Considérons l’instance suivante :

Application : Problème des cases admissibles

Soit le tableau T de taille m × n, dont certaines cases sont dites “admissibles” (les
autres sont “non admissibles”. On se donne également m + n entiers positifs ou nuls
l1 , . . . , lm , c1 . . . , cn . Il s’agit d’affecter des nombres entiers aux cases admissibles (et à
celles-ci seulement) de telle sorte que :
la somme des nombres affectés aux cases d’une ligne i soit inférieure ou égale
à li (i = 1, 2, . . . , m).
la somme des nombres affectés aux cases d’une colonne j soit inférieure ou
égale à cj (j = 1, 2, . . . , n).
F IGURE 6 – Exemple du problème de cases admissibles. Les cases interdites sont en gris.
la somme des nombres affectés aux cases du tableau soit maximum.

1. Formuler le problème des cases admissibles comme un problème de flot


Taille du tableau : m = 4 et n = 5.
maximum en décrivant le graphe approprié (devoir maison).
Valeurs des lignes : l1 = 9, l2 = 10, l3 = 15, l4 = 2.
Valeurs des colonnes : c1 = 7, c2 = 5, c3 = 9, c4 = 4, c5 = 8.
Cases interdites : t13 , t14 , t15 , t22 , t25 , t31 , t33 , t34 , t41 , t42 , t44 .

35/220 35/220 36/220 36/220


Problème des cases admissibles vu comme un problème de flot maximum
On utilise un graphe biparti G = (U ∪ V , E ) où U = {C1, C2, C3, C4, C5} et
V = {L1, L2, L3, L4} et l’ensemble E contient les cases admissibles. Les capacités
des arcs sortants de S sont données par les bornes sup. associées aux colonnes.
Les capacités des arcs entrants en T sont données par les bornes sup. associées
aux lignes. On considère que les capacités des arcs intermédiaires ne peuvent pas
bloquer la solution (ici 15 par exemple). Le flot maximum trouvé dans ce graphe
donnera la solution du problème des cases admissibles.

Exploration des graphes :


Parcours en profondeur et parcours en largeur

F IGURE 7 – Les capacités des arcs sont


écrites entre crochets. Par construction, F IGURE 8 – Un flot de valeur 27 est visualisé en
chaque flot dans ce graphe est acceptable bleu. Est-ce que c’est le flot maximum ?
pour le problème des cases admissibles.

37/220 37/220 38/220 38/220

Exploration des graphes Les structures Pile (Stack) et File (Queue)

L’exploration d’un graphe (c.-à-d. la visite de tous les sommets joignables à partir
d’un sommet de départ) est une opération fréquente et importante.
elle ressemble à l’exploration d’un labyrinthe
pour explorer un labyrinthe il faut :
une craie : pour noter les carrefours/couloirs déjà visités
un fil : pour pouvoir retourner sur ses pas (backtrack)

F IGURE 9 – Le fonctionnement LIFO (Last In F IGURE 10 – Le fonctionnement FIFO (First In


First Out) : Une pile P et ses opérateurs First Out) : Une file F et ses opérateurs

39/220 39/220 40/220 40/220


Parcours en profondeur (Depth-first Search (DFS)) : 1e version itérative Analyse de l’algorithme DFS(G,S)

Algorithm 1 DFS(G,s) (utilise une pile P et suit la stratégie LIFO (Last In First Out )).
L’algorithme (1) est appliqué sur le graphe G de la Fig. (35) à partir du sommet S. Les
Require: G=(V,E), start vertex s. valeurs v .in (v .out) seront indiquées en haut à gauche(droite) du sommet v (une fois
Ensure: [Link] = true for all vertices v ∈ V reachable from s. calculées).
1: Initialisation : ∀v ∈ V : [Link] ← false ; clock ← 1 ; previsit(s) ; P ← [s] ;
2: u ← P .head () ( u reçoit le sommet de la pile P )
3: while (u 6= nil ) do
4: if (∃(u , v ) ∈ E | v .visited = false ) then
5: { previsit(v) ; [Link](v) } { v est inséré dans P }
6: else
7: { postvisit(u) ; delete(u,P) } { le sommet u est supprimé de P }
8: end if
9: u ← P .head () { u reçoit le sommet de la pile P }
10: end while
F IGURE 11 – L’état de la pile P après les
premiers quatre coups d’horloge (clock). La F IGURE 12 – Le graphe G après les premiers
pile contient les quatre sommets S , A, B , C quatre coups d’horloge. Les valeurs v .in
where : qui sont empilés l’un après l’autre sur la pile. correspondent au moment de la
previsit(v)={[Link] ← true ; [Link] ← clock ; clock ← clock+1} La tête de la pile correspond au sommet de visite/découverte du sommet v .
la pile (C à l’occurence).
postvisit(v)={[Link] ← clock ; clock← clock+1}

41/220 41/220 42/220 42/220

Analyse de l’algorithme DFS(G,S) : suite Analyse de l’algorithme DFS(G,S) : suite

L’algorithme (1) est appliqué sur le graphe G de la Fig. (35) à partir du sommet S. L’algorithme (1) est appliqué sur le graphe G de la Fig. (35) à partir du sommet S.

F IGURE 13 – L’état de la pile P après les F IGURE 14 – Le graphe G après les premiers F IGURE 16 – Le graphe G après les premiers six
F IGURE 15 – L’état de la pile P après les
premiers cinq coups d’horloge (clock). La cinq coups d’horloge. C .out = 5 : c’est le coups d’horloge. Les valeurs v .in correspondent
premiers six coups d’horloge. La pile
pile contient les trois sommets S , A, B. Le moment quand le sommet C a été dépilé de la au moment de la visite/découverte du sommet
contient les deux sommets S , A. Le sommet
sommet B est actuellement la tête de la pile. pile. v . Les valeurs v .out indiquent le moment de
A est actuellement la tête de la pile.
l’enlèvement du sommet v de la pile.

43/220 43/220 44/220 44/220


Analyse de l’algorithme DFS(G,S) : suite Analyse de l’algorithme DFS(G,S) : suite

L’algorithme (1) est appliqué sur le graphe G de la Fig. (35) à partir du sommet S. . L’algorithme (1) est appliqué sur le graphe G de la Fig. (35) à partir du sommet S.

F IGURE 18 – Le graphe G après les sept coups F IGURE 19 – L’état de la pile P après les
F IGURE 17 – L’état de la pile P après sept d’horloge. Les valeurs v .in correspondent au premiers huit coups d’horloge. La pile ne F IGURE 20 – Le graphe G après les premiers
coups d’horloge (clock). La pile ne contient moment de la visite/découverte du sommet v . contient que les sommets S , D. Le sommet huits coups d’horloge.
que le sommet S qui est la tête de la pile. Les valeurs v .out indiquent le moment de D est la tête de la pile.
l’enlèvement du sommet v de la pile.

45/220 45/220 46/220 46/220

Analyse de l’algorithme DFS(G,S) : suite Analyse de l’algorithme DFS(G,S) : suite

L’algorithme (1) est appliqué sur le graphe G de la Fig. (35) à partir du sommet S.
L’algorithme (1) est appliqué sur le graphe G de la Fig. (35) à partir du sommet S. .

F IGURE 21 – L’état de la pile P après les F IGURE 22 – Le graphe G après les premiers
premiers neuf coups d’horloge. La pile F IGURE 24 – L’arbre de l’appel DFS (G, S ).
neuf coups d’horloge. Tous les sommets ont été F IGURE 23 – Tous les sommets ont éte visités.
contient les sommets S , D , E. Le sommet E Le graphe G a été parcouru en profondeur
visités. Les valeurs v .in correspondent au La pile P est vide.
est la tête de la pile. d’abbord. Les lignes pointillées indiquent
moment de la visite/découverte du sommet v .
des testes/vérifications éffectuées dans le
code.

47/220 47/220 48/220 48/220


Parcours en largeur d’abord (Breadth First Search (BFS)) Analyse de l’algorithme BFS(G,S)

Algorithm 2 BFS(G,s) (utilise une file F et suit la stratégie FIFO (First In First Out) ).
L’algorithme (2) est appliqué sur le graphe G de la Fig. (32) à partir du sommet S. Les
Require: G=(V,E), start vertex s. valeurs v .in (v .out) seront indiquées en haut à gauche(droite) du sommet v (dès
Ensure: to be discovered qu’elles soient calculées).
1: Initialisation : ∀v ∈ V : [Link] ← false ; clock← 1 ; previsit(s) ; F ← [s] ;
2: u ← P .head () (u reçoit le sommet de la file F )
3: while (u 6= nil ) do
4: if (∃(u , v ) ∈ E | v .visited = false) then
5: { previsit(v) ; [Link](v) } {v est inséré dans F }
6: else
7: { postvisit(u) ; delete(u,F) } {le sommet u est supprimé de F }
8: end if
9: u ← F .head () {u reçoit le sommet de la file F }
10: end while
F IGURE 25 – L’état de la file F après les
premiers cinq coups d’horloge. La file F IGURE 26 – Le graphe G après les premiers
contient le sommet S et les quatre sommets cinq coups d’horloge. Les valeurs v .in
where : qui lui sont adjacents A, C , D , E. La tête de correspondent au moment de la
previsit(v)={[Link] ← true ; [Link] ← clock ; clock ← clock+1} la file n’a pas bougé et pointe sur le sommet visite/découverte du sommet v .
S.
postvisit(v)={[Link] ← clock ; clock← clock+1}

49/220 49/220 50/220 50/220

Analyse de l’algorithme BFS(G,S) : suite Analyse de l’algorithme BFS(G,S) : suite

L’algorithme (2) est appliqué sur le graphe G de la Fig. (32) à partir du sommet S.. L’algorithme (2) est appliqué sur le graphe G de la Fig. (32) à partir du sommet S..

F IGURE 28 – Le graphe G après les premiers six F IGURE 30 – Le graphe G après les premiers
F IGURE 29 – L’état de la file F après les
F IGURE 27 – L’état de la file F après les sept coups d’horloge. Les valeurs v .in
coups d’horloge. Les valeurs v .in correspondent premiers sept coups d’horloge. La tête de la
premiers six coups d’horloge. Le sommet S correspondent au moment de la
au moment de la visite/découverte du sommet file pointe sur le sommet A. Le sommet B
a été enlevé et la tête de la file pointe sur le visite/découverte du sommet v . Les valeurs
v . Les valeurs v .out indiquent le moment de qui lui est adjacent est ajouté(enfilé) dans la
sommet A. v .out indiquent le moment de l’enlèvement du
l’enlèvement du sommet v de la file. file F .
sommet v de la file.

51/220 51/220 52/220 52/220


Analyse de l’algorithme BFS(G,S) : suite Analyse de l’algorithme BFS(G,S) : fin

L’algorithme (1) est appliqué sur le graphe G de la Fig. (32) à partir du sommet S.
L’algorithme (2) est appliqué sur le graphe G de la Fig. (32) à partir du sommet S..

F IGURE 32 – Le graphe G après les huit coups


F IGURE 31 – L’état de la file F après les huit d’horloge. Les valeurs v .in correspondent au F IGURE 34 – L’arbre de l’appel BFS (G, S ).
coups d’horloge. Après l’enlèvement de A, moment de la visite/découverte du sommet v . F IGURE 33 – Tous les sommets ont éte visités. Le graphe G a été parcouru en largeur
la tête de la file pointe sur le sommet C. Les valeurs v .out indiquent le moment de La file F est vide. d’abbord. Les lignes pointillées indiquent
l’enlèvement du sommet v de la file. des testes/vérifications éffectuées dans le
code.

53/220 53/220 54/220 54/220

Une application Parcours en largeur d’abord et calcul des PCC de s aux autres sommets

G = (V , E ) | ∀(u , v ) ∈ E , l (u , v ) = 1 (la longueur de chaque arête vaut 1).


La distance du sommet s au sommet v est la longueur du PCC(s ; v ).
Appliquer l’algorithme (1) sur le graphe (35).
Une version de l’algorithme Enigme est donnée par :
Appliquer l’algorithme (2) sur le graphe (35).
Commenter les différences constatées.
Algorithm 3 BFS(G,s) (2e version du parcours en largeur d’abord).

Require: G=(V,E), ∀(u , v ) ∈ E l(u,v)=1, start vertex s.


Ensure: For all vertices u reachable from s, [Link] is set to the distance from s to u.
1: Initialisation : ∀v ∈ V : v .visited ← false and v .dist = ∞ ; F ← [s] ; [Link] ← 0 ;
[Link] ← true ;
2: while (F 6= 0 / ) do
3: u ← eject (F ) { u reçoit le sommet de la file F , le dernier est supprimé de F }
4: while (∃(u , v ) ∈ E | v .visited = false ) do
5: [Link] ← true
F IGURE 35 – Un graphe non orienté G. 6: [Link] ← [Link]+1
7: inject(F,v) { le sommet v est inséré dans F }
8: end while
9: end while

55/220 55/220 56/220 56/220


Application BFS(G,s) : validation formelle

Proposition : BFS(G,s) visite chaque sommet joignable à partir de s.


Preuve : Par induction à la base des propriétés suivantes :
Lors de l’exécution de BFS(G,s), pour chaque d = 0, 1, 2, . . . , max_dist il existe
un moment tel que
pour chaque v éloigné de s à une distance ≤ d, la valeur v .dist a été correctement
calculée.
pour tous les autres sommets u , u .dist = ∞.
la file F contient uniquement les sommets u éloigné de s à une distance égale à d.
Analyse de complexité (similaire à l’analyse de DFS(G,s)) :
chaque sommet est inséré une fois dans F lors de sa première visite, et est éjecté de
F lorsque tous ses voisins ont été visités ( en total 2 × |V | opérations
insertions/éjections) .
Chaque arête (u,v)∈ E est examinée exactement deux fois (en cas d’un graphe non
orienté) ; chaque arc est examiné une seule fois (en cas d’un graphe orienté). Donc,
F IGURE 36 – Illustration du fonctionnement de l’algorithme 4. Θ(|E |) opérations sur les arêtes/arcs.
en total Θ(|V | + |E |).

Remarque : tous les chemins partant de la racine s sont des PCC (c.-à-d. que ceci
est un arbre des PCC de s à tous les autres sommets).

57/220 57/220 58/220 58/220

Exploration de la descendance d’un sommet donné v

Algorithm 4 Explore(G,v).

Require: G=(V,E), start vertex v∈ V.


Ensure: [Link] = true for all vertices u reachable from v.
Parcours en profondeur d’abord : 1: [Link] ← true
2: previsit(v)
version récursive 3: for all each edge (v,u)∈E do
4: if not [Link] then Explore(G,u)
5: end for
6: postvisit(v)

Les procédures « previsit(v) » et « postvisit(v) » contiennent des opérations


optionnelles à effectuer lors de la première visite du sommet v , et après l’avoir
complètement explorer. Ces procédures peuvent être extrêmement utiles.

59/220 59/220 60/220 60/220


Explore(G,v) : validation formelle Parcours en profondeur d’abord : l’algorithme complet

Puisque le graphe G peut avoir plusieurs composantes distinctes, plusieurs


appels d’Explore(G,.) à partir de différents sommets de départ sont
éventuellement nécessaires.

Algorithm 5 DFS(G) : algorithme depth-first search.


Proposition : Explore(G,v) visite chaque sommet joignable à partir de v.
Preuve : Supposons que le sommet u est joignable à partir de v, mais n’a pas Require: G=(V,E).
été visité par Explore(G,v). Notons P le chemin allant de v à u. Considérons le Ensure: [Link] = true for all vertices v∈ V.
dernier sommet z visité par Explore(G,v) sur ce chemin et soit w le sommet qui 1: for all v∈V do
suit immédiatement z sur P. 2: [Link] ← false
3: end for
4: for all v∈V do
5: if not [Link] then Explore(G,v)
D’après la définition d’Explore(G,v), w devrait être aussi visité ; contradiction. 6: end for

Analyse de complexité :
∀v ∈ V Explore(G,v) est appelée une seule fois (grâce à l’étiquette [Link]).
Chaque arête (u,v)∈ E est examiné exactement deux fois : la première fois lors
d’Explore(G,u) et une deuxième fois lors d’Explore(G,v).
Sous l’hypothèse que previsit et postvisit prennent un temps constant, DFS(G)
nécessite un temps Θ(|V | + |E |) (linéaire).

61/220 61/220 62/220 62/220

Forêt couvrante associée à un parcours en profondeur d’abord Calcul la numérotation [in, out] ([pre, post])

En général, DFS(G) engendre une foret qui contient plusieurs arbres de


parcours, une pour chaque composante connexe du graphe.

Les valeurs in/out peuvent être calculées dans les procédures previsit et
postvisit.
On utilise pour ce faire le compteur « clock » initialisé à 1 et défini comme suit.
previsit(v)={[Link] ← clock ; clock ← clock+1}
postvisit(v)={[Link] ← clock ; clock ← clock+1}
Proposition : Pour chaque couple de sommet u et v, les intervalles [[Link],[Link]] et
[[Link],[Link]] sont soit complètement disjoints, soit l’un est entièrement inclus dans
l’autre.
Preuve : L’intervalle [[Link], [Link]] indique le temps durant lequel le sommet u est
présent dans la pile. La stratégie LIFO explique alors la propriété ci-dessus.
Lors du parcours, chaque sommet v est muni de deux étiquettes ([Link], [Link]). On
utilise aussi les notations (pre[v], post[v]) 1 . [Link] indique le moment de la
première visite du sommet v. [Link] indique le moment quand la procédure DFS a
définitivement quitté le sommet v (il a été donc complètement exploré).

1. Dans la terminologie de ce cours la numérotation [pre, post] est une autre dénomination de la
numérotation [in, out] (c.-à-d. pre(u)=[Link] et post(u)=[Link])
63/220 63/220 64/220 64/220
Parcours en profondeur dans les graphes orientés Parcours en profondeur dans les graphes orientés : classification des arcs

DFS(G) s’applique d’une façon similaire dans les graphes orientés. En raison de
l’orientation des arcs, les arbres de parcours engendrés sont plus complexes
(appelés aussi arborescences).

Les arcs u → v tels que Explore(G,u) appelle Explore(G,v) sont nommés


arcs couvrants (« tree edges »). Les arcs couvrants constituent une forêt
couvrante d’arborescences de parcours en profondeur.
Les arcs en pointillé peuvent être de trois types différents.
Les arcs en avant (« forward edges ») sont les arcs (u,v) qui relient un sommet u à un
descendant v.
Les arcs retour (« back edges ») sont les arcs (u,v) reliant un sommet u à un ancêtre
F IGURE 37 – Un graphe G.
v. Les boucles sont considérées comme des arcs retour.
F IGURE 38 – L’arborescence de l’appel
Les arcs croisés (« cross edges ») sont tous les autres arcs. Ce sont des arcs pour
DFS (G, A).
lesquels il n’existe pas de chemin entre leurs extrémités dans la forêt. Ils peuvent
relier deux sommets d’une même arborescence, tant que l’un des sommets n’est pas
ancêtre de l’autre ; ils peuvent aussi relier deux sommets appartenant à des
arborescences différentes.
65/220 65/220 66/220 66/220

Relations entre le type d’arc et la numérotation [pre, post] ([in, out]) Application de DFS : tri topologique (linéaire)

Le parcours en profondeur peut être utilisé pour effectuer un tri topologique (ou tri
linéaire) d’un graphe orienté sans circuit. Le tri topologique d’un DAG (graphe orienté
acyclique) G = (V , E ) consiste à ordonner linéairement tous ses sommets de telle
sorte que si G contient l’arc (u,v) alors, u apparaisse avant v .
Dans une forêt DFS, le sommet u est un ancêtre du sommet v ssi u est visité le
premier et v est visité lors de l’appel explore(u) (c.-à-d. pre(u) < pre(v) <
post(v) < post(u)).
Dans une forêt DFS, le sommet u est un descendant du sommet v ssi v est visité
le premier et u est visité lors de l’appel explore(v) (c.-à-d. pre(v) < pre(u) <
post(u) < post(v)).
On peut alors donner la classification suivante pour l’arc (u,v) :
pre(u) < pre(v) < post(v) < post(u) ssi l’arc (u,v) est de type arc
couvrant/arc en avant.
pre(v) < pre(u) < post(u) < post(v) ssi l’arc (u,v) est de type arc retour.
les intervalles [pre(v), post(v)] et [pre(u), post(u)] sont disjoints ssi l’arc
(u,v) est de type arc croisé.

F IGURE 39 – Gauche : Un graphe G = (V , E ). Les sommets représentent un ensemble de


tâches, les arcs visualisent leurs relations d’antérieurités. Il n’est pas évident de trouver l’ordre
exécution de ces tâches ? Droite : le même graphe est trié topologiquement (linéarisé) par
l’ordonnancement des sommets v ∈ V . Ainsi, un ordre d’exécution des tâches est explicité.

67/220 67/220 68/220 68/220


Application de DFS : linéarisation d’un DAG (Directed Acyclic Graph) Application de DFS : linéarisation d’un DAG (suite)

Proposition : La numérotation post d’un DAG obtenue lors d’un parcours DFS
Les propositions suivantes sont utilisées pour effectuer un tri topologique. satisfait l’inégalité post (u ) > post (v ) pour chaque arc (u, v).

Proposition : Un graphe orienté G contient un circuit, ssi la forêt engendrée Preuve : Les seuls arcs (u , v ) pour lesquels post (u ) < post (v ) dans l’arbre DFS
pars le parcours DFS(G) contient un arc retour. sont les arcs retour. Or, il n’y pas de tels arcs dans un DAG.
Preuve :
Evident si le parcours DFS(G) contient un arc retour. Algorithm 6 Premier algorithme pour linéariser un DAG.
Supposons maintenant que G contient un circuit C : v0 → v1 → v2 → . . . → vk → v0 .
Soit vi le premier sommet du C qui a été visité durant le parcours DFS. Tous les Require: G=(V,E), DAG
autres sommets de C sont des descendants de vi dans l’arbre de parcours et alors Ensure: List vertices in linear order.
vi −1 → vi est un arc retour (si i = 0 alors vk → v0 ).
1: Perform a DFS search and obtain the number post (v ) for any vertex v ∈ V .
2: List vertices in order of decreasing post (v ) values.

69/220 69/220 70/220 70/220

Linéarisation d’un DAG par l’algorithme 6 Application de DFS : linéarisation d’un DAG (suite)

Propriété : Chaque DAG a au moins un sommet source (sommet sans


prédécesseurs) et au moins un sommet puits (sommet sans successeurs)
Preuve : Ce sont respectivement le sommet avec la plus grande, et la plus petite
F IGURE 41 – La numérotation
valeur de la numérotation post.
F IGURE 40 – Un graphe G = (V , E ). [pre, post ] obtenue avec un parcours
DFS (G, A).

Algorithm 7 Deuxième algorithme pour linéariser un DAG.

1: Find a source, output it, and delete it from the graph.


2: Repeat until the graph is empty.

Devoir : Analyser et donner la complexité des algorithmes 6 et 7.

F IGURE 42 – Le graphe G est trié topologiquement (linéarisé) par l’ordonnancement des


sommets v ∈ V dans l’ordre décroissant de leur numérotation post (v ).

71/220 71/220 72/220 72/220


Linéarisation d’un DAG par l’algorithme 7

F IGURE 43 – B est un sommet-source F IGURE 44 – D est un sommet-source


dans le graphe d’origine G = (V , E ). dans le graphe induit GB = (VB , EB ).
On l’enlève du G. On l’enlève du GB .
Composantes fortement connexes

F IGURE 45 – A est un sommet-source F IGURE 46 – C est un sommet-source


dans le graphe induit GD = (VD , ED ). dans le graphe induit GA = (VC , EC ).
On l’enlève du GB . On l’enlève du GA .

Les deux dernières tâches E et F peuvent être exécutées dans un ordre quelconque.
L’ordre d’exécution des tâches est donné par l’odre d’enlèvement des
sommets-sources : B, D, A, C, E, F.
73/220 73/220 74/220 74/220

Modéliser l’accessibilité au centre-ville de l’Utopia Modéliser l’accessibilité au centre-ville de l’Utopia : solution

1 2 3 4
1 2 3 4

5 6 7 8 9
5 6 7 8 9

10 11 12 13 14 15
10 11 12 13 14 15
F IGURE 48 – Les sommets jaunes et verts ne sont pas joignables à partir des sommets rouges.
F IGURE 47 – Le plan de sens uniques du centre-ville. Les trois zones coloriées en rouge, jaune et vert sont des Composantes Fortements Connexes
(CFC)

Comment détecter si ce plan est acceptable ? .

Le plan donc n’est pas acceptable puisque le graphe associé contient trois CFC.

75/220 75/220 76/220 76/220


Application de DFS : Composantes fortement connexes Application de DFS : Composantes fortement connexes (suite)

Soit le graphe orienté G = (V , E ). G est dit fortement connexe, si pour chaque La détection des c.f.c. se fait facilement grâce aux propriétés du parcours DFS.
couple de sommets (u , v ), il existe un chemin de u à v , noté (u ; v ), et un
Propriété 1 : La procédure explore(G,u) ne se termine que si tous les sommets
chemin de v à u, noté (v ; u).
accessibles à partir de u soient visités/explorés (c.-à-d. après avoir exploré toute
Cette définition définit une relation binaire dans V . la descendance Γ∗u du sommet u).

uRv ≡ (u ∈ Γ∗v ) ∧ (v ∈ Γ∗u ) (16) Ainsi, si la procédure explore(G, v ) est exécutée à partir d’un sommet v
appartenant à une c.f.c. puits (une c.f.c. sans arcs sortants), alors elle visiterait
où Γ∗v indique la descendance du sommet v . exactement cette c.f.c. La dernière pourrait être alors enlevée du graphe G, et le
0
C’est une relation d’équivalence dont les classes s’appellent compostantes processus continuerait sur le graphe résultant G .
fortement connexes (c.f.c.). Illustrer cette propriété avec les deux meta-sommets {D} et {G,H,I,K,J,L} du
Elle partitionne V en ensembles disjoints (appelés c.f.c.). graphe de la figure (53).

77/220 77/220 78/220 78/220

Application de DFS : Composantes fortement connexes (suite) Application de DFS : Composantes fortement connexes (suite)

Comment détecter une c.f.c. puits ?


Trouver une c.f.c. puits est difficile, mais trouver une c.f.c. source (sans arcs
entrants) est facile en raison de l’observation suivante.
Propriété 2 : Le sommet v avec la plus grande valeur post (v ) calculée lors d’un
parcours DFS se trouve dans une c.f.c. source.
Cette propriété est déduite du fait suivant.
F IGURE 49 – a) Un graphe orienté G et ses c.f.c. b) Le graphe réduit G̃ 0
Propriété 3 : Soit deux c.f.c. C et C , telles qu’il existe un arc d’un sommet de C
0
vers un sommet de C , alors :

max{post (u )} > max0 {post (u )} (17)


u ∈C u ∈C

Preuve : Deux cas sont à considérer.


DFS commence à partir d’un sommet u ∈ C. Alors DFS visite Γ∗u (tous les sommets
F IGURE 50 – Ce 0 0
meta-graphe a deux F IGURE 51 – On enlève F IGURE 52 – On enlève appartenants à C et C ) et post (u ) > post (v ), ∀v ∈ C ∪ C (propriété 1).
0 0
sommets-puits (en gris). On l’unique sommet-puits. l’unique sommet-puits. DFS commence à partir d’un sommet u ∈ C . Alors tous les sommets de C sont
peut les enlever. visités avant de commencer la visite de C. Donc, post (u ) > post (u ).
u ∈C u ∈C
0

La connaissance des sommets-puits permet de les enlever un par un et de découvrir


ainsi toutes les c.f.c. du graphe.
79/220 79/220 80/220 80/220
Application de DFS : Composantes fortement connexes (suite) Application de DFS : Composantes fortement connexes (suite)

Grace à la propriété 3, nous savons comment trouver une c.f.c. source dans G.
Déterminer les sommets appartenant aux c.f.c. nécessite que le parcours
commence à partir d’une c.f.c. puits. Comment trouver une telle c.f.c. ?
Idée : Renverser le graphe (c.-à-d. changer l’orientation de tous les arcs). Le
graphe ainsi obtenu sera noté GR . F IGURE 53 – a) Un graphe orienté G et ses c.f.c. b) Le graphe réduit G̃
Alors les c.f.c. ne changent pas (facile à vérifier). Mais les sommets puits se
transforment en sources et vice versa. Le graphe G̃ se renverse aussi (voir les
graphes des figures (53) et (54).
La linéarisation du DAG G̃R permet de trier topologiquement les sommets de
DAG G̃ dans l’ordre des sommets-puits vers les sommets-sources.

F IGURE 54 – a) GR : le graphe renversé du graphe G et ses c.f.c. b) G˜R : le graphe réduit de GR

81/220 81/220 82/220 82/220

Application de DFS : Algorithme de Kosaraju pour la détection des CFC Application de l’algorithme de Kosaraju (algorithme 8) : suite

Algorithm 8 Déterminer les CFC d’un graphe orienté G.

Require: G=(V,E)
Ensure: Detect the strongly connected components (SCC) of G
1: Reverse all the edges in G, yielding digraph GR .
2: Run DFS on GR , obtaining the post (v ) numbers for all vertices v .
3: k ← 1.
4: Run EXPLORE(G,v) in G from the vertex v that has the highest post (v ) value in
GR , and has not yet been assigned to any SCC. Assign all vertices mapped out by
the exploration into SCC k .
5: Set k ← k + 1 and repeat from step 4, until all vertices have been assigned to
SCCs.
F IGURE 56 – Le graphe GR = (V , ER )
avec la numérotation [pre, post ]
F IGURE 55 – Le graphe G = (V , E ). obtenue avec un parcours
Complexité : linéaire. DFS (GR , A).

Appliquer l’algorithme 8 pour trouver les c.f.c. du graphe de fig. (53.a)

83/220 83/220 84/220 84/220


Application de l’algorithme de Kosaraju (algorithme 8) : suite et fin

Calcul des Plus Courts Chemins (PCC) dans les


graphes

F IGURE 58 – Les cinq CFC


découvertes par l’algorithme de
Le cas des valeurs positives des arcs/arêtes
F IGURE 57 – Le graphe G = (V , E ) Kosaraju et le meta-graphe associé
avec la numérotation [pre, post ] (on dit aussi son graphe réduit G̃)
obtenue lors du parcours DFS (GR , A).

On applique EXPLORE(G,v) sur le graphe d’origine G = (V , E ) dans l’ordre


décroissant des valeurs post (v ) qui ont été obtenues lors du parcours de du graphe
renversé DFS (GR , A). Cela donne l’ordre suivant : EXPLORE(G,G), EXPLORE(G,D),
EXPLORE(G,C), EXPLORE(G,B), EXPLORE(G,A).

85/220 85/220 86/220 86/220

Calcul des PCC de s aux autres sommets dans le cas {le > 0 : e ∈ E } Algorithme de Dijkstra (suite)

Algorithm 9 Dijkstra_a (G,l,s).

Require: Graph G=(V,E) with positive edge weights {le > 0 : e ∈ E }, vertex s ∈ V
Ensure: ∀u ∈ V , dist (u ) is set to the shortest distance from s to u ; prev (u ) points
to the previous of u on this shortest path
1: Initialisation : ∀u ∈ V : dist (u ) ← ∞ and prev (u ) ← nil ; dist (s ) ← 0 ; Algorithm 10 dist_update(u,v).
2: P ← 0 / , (P contient les sommets v , tq dist (v ) est calculée définitivement)
1: if dist (v ) > dist (u ) + l (u , v ) then
3: T ← V (T contient des sommets v , tq dist (v ) n’est qu’une borne supérieure)
2: dist (v ) = dist (u ) + l (u , v )
4: while T is not empty do
3: prev (v ) ← u
5: u ← argmin dist (v )
v ∈(T ) 4: end if
S
6: P ← P {u }
7: T ← T \{u } Exemple :
8: for all edges (u , v ) ∈ E do
9: dist_update(u,v)
10: end for
11: end while

87/220 87/220 88/220 88/220


Application de l’algorithme de Dijkstra sur un graphe Justification de l’alg. de Dijkstra
B D B D
4 2 2

3
A 1 3 1 A 1
4 3
Soit le graphe G = (V , E , le > 0 : e ∈ E ). On cherche les PCC(s;u) : les plus
2 2 courts chemins de s aux autres sommets u ∈ V \{s}. Définissons dist ∗ (u )
C E C E comme la longueur du PCC(s;u).
5
L’algorithme procédera en |V | − 1 ittérations. Au début de chacune des itérations
itér P T
V est partinionné en deux sous-ensembles P et T , avec s ∈ P.
A B C D E Chaque sommet u ∈ V est affecté d’une étiquette dist (u ) qui vérifie les
propriétés suivantes ;
0 ∅ 0 ∞, nil ∞, nil ∞, nil ∞, nil
si u ∈ P : dist (u ) = dist ∗ (u )
1 {A} — 4, A 2, A ∞, nil ∞, nil si u ∈ T : dist (u ) = min dist (v ) + l (v , u )
2 {A; C } — 3, C — 6, C 7, C v ∈P ,v ∈Γ−1 (u )

3 {A; C ; B } — — — 5, B 6, B La valeur dist (u ), u ∈ T donne la longueur du PCC(s;u) à condition que tous


4 {A; C ; B ; D } — — — — 6, B les sommets excepté u sont dans P. Ainsi, à chaque itération dist (u ) fournit une
5 {A; C ; B ; D ; E } — — — — — borne supérieure de la valeur cherchée dist ∗ (u ). A début dist (u ) = ∞, à la fin du
calcul, dist ∗ (u ) = dist (u ).
F IGURE 59 – A est le sommet de départ. Chaque colonne u contient le couple (dist (u ), prev (u ))
où prev (u ) est le sommet qui précède u sur le plus court chemin de A à u. A chaque itération
l’opération u ← argmin dist (v ) est effectuée. Les valeurs dist (v ) sont mises à jour suivant la
v ∈(T )
procédure dist_update(u , v ). La mémorisation des valeurs prev (v ) permet de construire l’arbre
des plus courts chemins de A vers chaque sommet v du graphe (ci-dessus à droite).
89/220 89/220 90/220 90/220

Justification de l’alg. de Dijkstra Analyse de complexité - version tableaux (Array)


Algorithm 11 Dijkstra_a (G,l,s).
L’algorithme procédera en |V | − 1 ittérations. Au début de chacune des itérations Require: Graph G=(V,E) with positive edge weights {le > 0 : e ∈ E }, vertex s ∈ V
V est partinionné en deux sous-ensembles P et T , avec s ∈ P. Ensure: ∀u ∈ V , dist (u ) is set to the shortest distance from s to u ; prev (u ) points
Chaque sommet u ∈ V est affecté d’une étiquette dist (u ) qui vérifie : to the previous of u on this shortest path
si u ∈ P : dist (u ) = dist ∗ (u ) 1: Initialisation : ∀u ∈ V : dist (u ) ← ∞ and prev (u ) ← nil ; dist (s ) ← 0 ;
si u ∈ T : 2: P ← 0 / , (P contient les sommets v , tq dist (v ) est calculée définitivement)
dist (u ) = min dist (v ) + l (v , u ) (18)
v ∈P ,v ∈Γ−1 (u ) 3: T ← V (T contient des sommets v , tq dist (v ) n’est qu’une borne supérieure)

Lemme : Soit u ∈ T tq 4: while T is not empty do


5: u ← argmin dist (v )
v ∈(T )
dist (u ) = min dist (v ) (19) S
v ∈T 6: P ← P {u }
7: T ← T \{u }
Alors dist ∗ (u ) = dist (u ).
8: for all edges (u , v ) ∈ E do
Preuve : Il ∃ évidemment un chemin λ : s ; u de longueur dist (u ). 9: dist_update(u,v)
Considérons un autre chemin µ : s ; u, et divisons le en deux parties µ1 : s ; h 10: end for
et µ2 : h ; u, où h est le premier sommet de T rencontré, et µ2 le reste du 11: end while
chemin. Alorls length(µ1 ) ≥ dist (h) d’après (18) ; et dist (h) ≥ dist (u ) d’après
(19). Puisque length(µ2 ) ≥ 0, on obtient
length(µ) = length(µ1 ) + length(µ2 ) ≥ dist (h) ≥ dist (u ) et donc λ est le plus Alg 11 nécessite |V | opérations argmin plus |E | opérations update. La coût de
court chemin s ; u. ces opérations dépend du choix de la structure des données.
Si on utilise Array : on obtient Θ(|V |2 + |E |).
91/220 91/220 92/220 92/220
Arbres parfaits partiellement ordonnés et tas binaire (Binary heap) Arbres parfaits partiellement ordonnés et tas binaire : implementation et
tableau

Le tas binaire (Binary heap) est une file de priorité importante fréquemment
utilisée pour améliorer la complexité des algorithmes comme le tri par tas, l’alg.
de Dijkstra, l’alg. de Prim ....
Définition : Soit π(j ) la clé associée avec l’élément j de la file F. F est un tas
binaire si la condition suivante est satisfaite (relation entre le père et ses deux
fils) : F IGURE 60 – L’arbre parfait qui visualise un tas binaire avec 10 éléments. Seules les clés sont
j indiquées. Ci-dessous le tableau π associé avec ce tas binaire.
π(j ) ≥ π(b c) ∀j (20)
2
⇐⇒ π(j ) ≤ π(2j ) and π(j ) ≤ π(2j + 1) ∀j j 1 2 3 4 5 6 7 8 9 10
π(j ) 3 10 5 11 12 6 8 15 20 13
On représente le tas binaire par un arbre parfait partiellement ordonné :
∀ niveau est rempli de gauche à droite ; On a les règles suivantes :
∀ niveau est complètement rempli avant de commencer le niveau suivant ;
la condition (25) est satisfaite (l’élément contenu dans tout nœud est inférieur ou π(1) est la racine qui contient l’élément le plus petit ;
égal aux éléments contenus dans les fils de ce nœud). π(2j ) and π(2j + 1) sont les deux fils, s’ils existent, de π(j ). En plus,
Le tas est facile à implémenter en tableau. π(j ) ≤ π(2j ) and π(j ) ≤ π(2j + 1). ;
exemple j = 4 : π(4) = 11, π(8) = 15, π(9) = 20 ;
π(b 2j c) est le père de π(j ) pour j > 1 ;
exemple j = 9 : π(9) = 20, π(b 92 c) = π(4) = 11 ;
93/220 93/220 94/220 94/220

Arbres parfaits partiellement ordonnés et tas binaire : propriétés Arbres parfaits partiellement ordonnés et tas binaire : illustration du
fonctionnement

Les propriétés essentielles d’un tas binaire de k éléments :


la racine contient le plus petit élément. L’opération « accès à la racine » se fait en
Θ(1) ;
l’opération « insertion » se fait en Θ(log2 k ) ;
l’opération « suppression du minimum » se fait en Θ(log2 k ).

F IGURE 61 – (a) : un tas binaire avec 10 éléments. Seules les clés sont indiquées. (b)-(d) :
illustration de l’opération « insertion ». (e)-(g) : illustration de l’opération « extraction et
suppression du minimum ».
95/220 95/220 96/220 96/220
Version tas binaire de l’alg. de Dijkstra Version tas binaire de l’alg. de Dijkstra (suite)

Algorithm 12 Dijkstra_bis(G,l,s).

Require: Graphe G=(V,E) directed or undirected, with positive edge weights {le : e ∈ Algorithm 13 dist_update_bis(Q,(u , v )).
E } ; vertex s ∈ V
Require: Priority queue Q using dist as keys ; an edge (u , v ) ∈ E
Ensure: For all vertices u ∈ V , dist (u ) is set to the shortest distance from s to u ;
Ensure: Q is updated if the value of dist (v ) has been modified
prev (u ) points to the previous of u on this shortest path
if dist (v ) > dist (u ) + l (u , v ) then
1: ∀u ∈ V : initialize dist (u ) ← ∞ and prev (u ) ← nil
dist (v ) ← dist (u ) + l (u , v )
2: dist (s ) ← 0
prev (v ) ← u
3: P ← {s } {P contient les sommets v pour lesquels la valeur dist (v ) est calculée
ChangeKey(Q,v) {Q is updated according to the new value of dist (v ) }
définitivement}
end if
4: T ← makequeue(V) {créer une file de priorité T avec dist (v ), v ∈ (T ) comme
clés}
5: while T is not empty do Analyse de complexité de la version tas binaire de l’alg. de Dijkstra
6: u ← ExtractMin(T)
S
7: P ← P {u } makequeue(V) nécessite O (|V | log |V |) opérations.
8: T ← T \{u }
la boucle WHILE) (line 6) nécessite O (|V |) ExtractMin plus O (|E |) ChangeKey
9: for all edges (u , v ) ∈ E do
(updates) : O ((|V | + |E |) log |V |) opérations.
10: dist_update_bis(T,(u , v ))
11: end for En total : O ((|V | + |E |) log |V |).
12: end while

97/220 97/220 98/220 98/220

Présence de poids négatifs

Les valeurs dist (.) dans l’alg. de Dijkstra sont soit des valeurs exactes, soit des
bornes supérieurs. La valeur dist (u ) équivaut dist ∗ (u ) à condition que tous les
sommets intermédiaires du chemin s;u sont dans P. Les valeurs dist (.) peuvent être
vues comme une suite des mises à jours :

Calcul des chemins les plus courts dans les graphes Algorithm 14 Procédure update((u , v ) ∈ E).

dist (v ) = min{dist (v ), dist (u ) + l (u , v )}

Présence de poids négatifs Propriétés :


dist (v ) = dist ∗ (v ) si dist (u ) = dist ∗ (u ) et si u est l’avant-dernier sommet
(u = prev (v )) sur le PCC(s;v) ;
la procédure update((u , v )) ne génère que des bornes supérieures à la valeur
dist ∗ (v ).
Utilisation pour chercher le PCC(s;v) :
(a) | PCC (s ; v ) |≤| V | −1 ;
(b) si update(.,.) est appliqué aux arêtes du PCC(s;v)
(s, u1 ), (u1 , u2 ), (u2 , u3 ), . . . (u , v )) dans cet ordre, alors dist (v ) = dist ∗ (v ).

99/220 99/220 100/220 100/220


Présence de poids négatifs : Algorithme de Bellman-Ford Algorithme de Bellman-Ford (variant)

Une autre approche est d’utiliser la fonction multivoque Γ−1 et l’observation que le
Algorithm 15 Procédure Bellman-Ford (G,l,s). (PCC(s;v)) passe par un des prédécesseurs u ∈ Γ−1 (v ). On doit donc avoir
Require: Graphe G=(V,E) directed, edge weights {le : e ∈ E } with no negative cycles ; dist (v ) = min {dist (u ) + l (u , v )} = min{dist (v ), min {dist (u ) + l (u , v )}}
u ∈Γ−1 (v ) u ∈Γ−1 (v )
vertex s ∈ V
(21)
Ensure: For all vertices u ∈ V reachable from s, dist (u ) is set to the shortest distance
On obtient la variante suivante.
from s to u ;
1: for all u ∈ V do Algorithm 16 Procédure Bellman-Ford_bis (G,l,s).
2: dist (u ) ← ∞
3: prev (u ) ← nil Require: Graphe G=(V,E) directed, edge weights {le : e ∈ E } ; vertex s ∈ V
4: end for Ensure: dist k (u ) is set to the shortest distance from s to u over all paths with at most
5: dist (s ) ← 0 k arcs. It also detects the presence of negative cycle.
0 0
6: k ← 1 1: Initialisation : ∀u ∈ V : dist (u ) ← ∞ ; dist (s ) ← 0 ; stable ← false ; k ← 1 ;

7: while (k ≤ |V | − 1) do 2: while ((k ≤ |V |) and (nonstable)) do

8: for all edges (u , v ) ∈ E do 3: dist k (s) ← 0


9: dist (v ) ← min{dist (v ), dist (u ) + l (u , v )} 4: for all vertices v ∈ V \ {s} do
10: end for 5: dist k (v ) = min{dist k −1 (v ), min dist k −1 (u ) + l (u , v )}
u ∈Γ−1 (v )
11: k ← k +1 6: end for
12: end while
7: stable ← (dist k (v ) = dist k −1 (v ), for all v ∈ V ) ; k ← k + 1 ;
8: end while
Complexité de l’algorithme (15) : O (|V ||E |) 9: if (k = |V | + 1) then ∃ negative cycle
10: end if
101/220 101/220 102/220 102/220

Illustration pour l’algorithme de Bellman-Ford Techniques d’accélération


Complexité de l’algorithme
de l’algorithme (16) : O (|V ||Ede
|) Bellman-Ford_bis

dist k (v ) représente la valeur du PCC (s ; v ) qui ne contient pas plus de k arcs.


Dans l’algorithme (16) on a le choix de l’ordre à la ligne 4 et on a intérêt à définir
un ordre astucieux sur les sommets.
Par exemple si les le sont positifs et l’ordre est définit par l’alg de Dijkstra, alors
l’alg. (16) converge en une seule étape.
Si peu d’arcs ont une valeur négative, on a aussi intérêt à effectuer d’abord l’alg.
de Dijkstra qui donnera une bonne initialisation des valeurs dist (v ) et on prendra
alors comme ordre celui des dist (v ) croissants.
F IGURE 62 –

Algorithm 17 Procédure update((u , v ) ∈ E).

dist (v ) = min{dist (v ), dist (u ) + l (u , v )}

103/220 103/220 104/220 104/220


Accélérations posibles pour l’algorithme de Bellman-Ford_bis (exemple)

2
4 Calcul des chemins les plus courts/longues dans les
2 5
graphes
1

7
−2 L’approche programmation dynamique
1 2
2 3

3 6
2

105/220 105/220 106/220 106/220

Alg. de Bellman-Ford dans le contexte de la programmation dynamique Illustration pour l’algorithme de Bellman-Ford

Soit le graphe G = (V , E , l ) et un sommet donné s ∈ V . Pour calculer le PCC(s;v),


dont la valeur est calculée dans la variable dist (v ), on observe que le PCC(s;v)
passe par un des prédécesseurs u ∈ Γ−1 (v ). On doit donc avoir
dist (v ) = min {dist (u ) + l (u , v )} (22)
u ∈Γ−1 (v )

L’équation (22) permet de calculer la valeur dist (v ) sous l’hypothèse que les valeurs
dist (u ), ∀u ∈ Γ−1 (v ) sont calculées. Ce qui nécessite de résoudre des sous-
problèmes possedant un arc de moins par rapport au problème originel. Notons
dist k (v ) la valeur du PCC (s ; v ) qui contient au plus k arcs et réécrivons (22) :
dist k (v ) = min{dist k −1 (v ), min dist k −1 (u ) + l (u , v )} (23)
u ∈Γ−1 (v )

La récurrence (23) permet de résoudre un ensemble de sous-problèmes


{dist k (u ), u ∈ V } en commençant par les plus « petits », et en allant vers les
plus « grands ». Pour les « plus petits » (k = 0), la solution est connue.
C’est une méthode de résolution applicable aux problèmes qui satisfont le F IGURE 63 –
principe d’optimalité de Bellman (1955) : chaque sous-chemin d’un chemin
optimal est lui-même optimal.
C’est une approche très générique. La fonction min de la l’équation (23) peut dist k (v ) = min{dist k −1 (v ), min dist k −1 (u ) + l (u , v )} (24)
être remplacée par la fonction max et l’opérateur binaire « addition » par u ∈Γ−1 (v )

« multiplication ».
107/220 107/220 108/220 108/220
Algorithmes pour linéariser un DAG (graphe orienté sans circuit) (rappel) Linéarisation d’un DAG par l’algorithme 6

Propriétés importantes des DAG :


(a) Chaque DAG a au moins un sommet source (sommet sans prédécesseurs) et au
moins un sommet puits (sommet sans successeurs)
(b) Les sommets du graphe peuvent être numérotés dans l’ordre topologique (ils
peuvent être placés sur une ligne de façon que tous les arcs soient orientés de
gauche à droite).
F IGURE 65 – La numérotation
F IGURE 64 – Un graphe G = (V , E ). [pre, post ] obtenue avec un parcours
DFS (G, A).
Algorithm 18 Premier algorithme pour linéariser un DAG.
Require: G=(V,E), DAG
Ensure: List vertices in linear order.
1: Perform a DFS search and obtain the number post(v) for any vertex v ∈ V .
2: List vertices in order of decreasing post(v) values.

Algorithm 19 Deuxième algorithme pour linéariser un DAG.


1: Find a source, output it, and delete it from the graph.
2: Repeat until the graph is empty. F IGURE 66 – Le graphe G est trié topologiquement (linéarisé) par l’ordonnancement des
sommets v ∈ V dans l’ordre décroissant de leur numérotation post (v ).

109/220 109/220 110/220 110/220

Application de l’ordre topologique/linéaire pour la détermination les chemins les Application de l’ordre topologique/linéaire pour la détermination des chemins
plus courts/longs dans un DAG plus courts/longs dans un DAG

Algorithm 20 Procédure dag-shortest-paths(G,l,s).

Require: DAG G=(V,E), edge weights {le : e ∈ E }, vertex s∈ V Algorithm 21 Procédure dag-shortest-paths(BIS)(G,l,s).
Ensure: For all vertices u reachable from s, dist (u ) is set to the distance from s to u Require: DAG G=(V,E), edge weights {le : e ∈ E }, vertex s∈ V
1: for all u ∈ V do Ensure: For all vertices u reachable from s, dist (u ) is set to the distance from s to u
2: dist (u ) ← ∞ 1: for all u ∈ V do
3: end for 2: dist (u ) ← ∞
4: dist (s ) ← 0 3: end for
5: linearize G 4: dist (s ) ← 0
6: for all u ∈ V , in linearized order do 5: linearize G
7: for all edges (u , v ) ∈ E do 6: for all v ∈ V \ {s }, in linearized order do
8: dist (v ) = min{dist (v ), dist (u ) + l (u , v )} 7: for all edges (u , v ) ∈ E do
9: end for 8: dist (v ) := min{dist (v ), dist (u ) + l (u , v )}
10: end for 9: end for
10: end for

Complexité de l’algorithme (24) : le coût de la linéarisation ( O (|V | + |E |)) + le


coût des boucles (6) et (7) (Σu d + u) = O (|V | + |E |).

111/220 111/220 112/220 112/220


Cas des graphes sans circuit (DAG) Une application de la fonction rang
Obtention d’un diplôme Master d’informatique (Exam. décembre 2008)

Pour obtenir un Master d’informatique, il est nécessaire d’avoir passé un certain


nombre de modules. Chaque module demande un certain nombre de prérequis. Un
Propriétés importantes des DAG : master simplifié pourrait se composer (prérequis entre parenthèses) de :
s =0
(a) Il existe au moins un sommet s tel que Γ− 1
/ (c.-à-d. s est sans prédécesseurs). Système (Programmation) ;
(b) Les sommets du graphe peuvent être numérotés dans l’ordre topologique (ils MAG (Programmation, Math Discrètes) ;
peuvent être placés sur une ligne de façon que tous les arcs soient orientés de
gauche à droite). Sécurité réseau (Système, Initiation réseau) ;
Afin de générer un ordre topologique, en plus les algorithmes 6 et 7, on peut Initiation réseau (Programmation, MAG) ;
aussi utiliser la fonction rang (22). Systèmes répartis (MAG, Système, Initiation réseau).
Pour introduire rapidement cette notion, nous supposerons que le graphe 1. Modéliser les prérequis à l’aide d’un graphe.
possède un seul sommet sans prédécesseurs (disons le sommet s). 2. Quel est le nombre minimum de semestres pour obtenir ce master ? On suppose
La fonction rang associe à chaque sommet v ∈ V \{s} le nombre rank (v ) qui bien sur que vous passez tous les examens avec succès, que chaque module
correspond au nombre d’arcs dans un chemin de cardinalité maximum entre s et dure un semestre et est enseigné chaque semestre. Le nombre de modules
v. suivis par un étudiant pendant un semestre n’est pas limité et il n’y a pas de
problème d’emploi du temps. Indiquer l’algorithme utilisé et justifiez votre choix.
3. Un étudiant décide d’étudier un module dès qu’il a obtenu les modules
prérequis. Quel est le nombre maximum de modules qu’il devra suivre
simultanément en appliquant cette stratégie ? Quel algorithme permet de le
calculer ? Justifiez votre choix.
113/220 113/220 114/220 114/220

Obtention d’un diplôme Master d’informatique : suite 1 Obtention d’un diplôme Master d’informatique : suite 2

1. Modéliser les prérequis à l’aide d’un graphe. 1. Quel est le nombre minimum de semestres pour obtenir ce master ?

F IGURE 68 – On calcule d’abord la fonction rang, on obtient ainsi les valeurs rank . Les modules
F IGURE 67 – Modélisation à l’aide d’un graphe : les sommets correspondent aux modules, les sont alors ordonnancés dans l’ordre croissant de leur numéro rank . Le graphe est représenté
arcs - aux prérequis. par niveau, chaque niveau correspond aux sommets ayant la même valeur rank .

115/220 115/220 116/220 116/220


Obtention d’un diplôme Master d’informatique : suite 3 Obtention d’un diplôme Master d’informatique : suite 2

1. Quel est le nombre maximum de modules qu’il devra suivre simultanément en


appliquant cette stratégie ?
1. Quel est le nombre minimum de semestres pour obtenir ce master ?

F IGURE 69 – Au moins 4 semestres sont nécessaires pour obtenir ce master. Cela peut se
calculer par un algorithme du plus long chemin dans un graphes sans circuit (DAG).
F IGURE 70 – Le nombre maximum de modules qu’il devra suivre simultanément vaut 2 : c’est le
nombre maximum de sommets dans un niveau (colonne) du graphe représenté par niveau, où
chaque niveau correspond aux sommets ayant la même valeur rank .

117/220 117/220 118/220 118/220

Cas des graphes sans circuit (DAG) : calcul de la fonction rang Calcul de la fonction rang : Illustration de l’algorithme vertex-rank(G)

Algorithm 22 Procédure vertex-rank(G).


4 7
4
Require: DAG G = (V , E ), vertex s∈ V such that d − (s) = 0.
4 10
Ensure: For all vertices u reachable from s, rank (u ) is set to the number of arcs in
2
the longest (in cardinality) path from s to u 5
− −1 2 5
1: Initialisation : ∀u ∈ V : d (u ) ← |Γ (u )| ; k ← 0 ; S0 ← {s } ; 7
− 5
2: while |Sk | > 0 do (Sk est l’ensemble des sommets v tels que d (v ) = 0 ; ) 1
−3
3: Sk +1 ← 0/ 2 3
4: for all u ∈ Sk do 1
5: rank (u ) ← k 3 6
7
6: for all edges (u , v ) ∈ E do
7: d − (v ) ← d − (v ) − 1 k Sk d − (1) d − (2) d − (3) d − (4) d − (5) d − (6) d − (7) rank
8: if (d − (v ) = 0) then 0 {1} 0 2 1 2 3 2 2 rank (1) = 0
S 1 {3} 1 0 2 3 2 2 rank (3) = 1
9: Sk +1 ← Sk +1 {v }
2 {2} 0 2 2 1 2 rank (2) = 2
10: end if
3 {6} 1 1 0 2 rank (6) = 3
11: end for 4 {4, 5} 0 0 2 rank (4) = 4
12: end for rank (5) = 4
13: k ← k +1 5 {7} 0 rank (7) = 5
14: end while
F IGURE 71 – Sk est l’ensemble des sommets v tels que d − (v ) = 0 ; La fonction rang associe à
chaque sommet v ∈ V \{1} le nombre rank (v ) tel que rank (v ) =le nombre d’arcs dans un
Complexité de l’algorithme (22) : O (|V | + |E |). chemin de cardinalité maximum entre 1 et v .

119/220 119/220 120/220 120/220


Cas des graphes sans circuit (DAG) (suite) Application de l’algorithme Vertex-rank-shortest-paths(G,l,s)

Algorithm 23 Vertex-rank-shortest-paths(G,l,s).

Require: DAG G = (V , E ), edge weights {le : e ∈ E }, vertex s∈ V , G is represented


by vertex-rank levels
Ensure: For all vertices u reachable from s, dist (u ) is set to the shortest distance from F IGURE 72 – Le graphe G est représenté par niveaux. Pour calculer le chemin le plus court du
s to u sommet 1 au sommet 7 on applique alors l’algorithme Vertex-rank-shortest-paths(G,l,1) qui
1: for all u ∈ V do consiste à appliquer la récurrence suivante :
2: dist (u ) ← ∞
3: end for v ∈ V \ {1} in rank order do dist (v ) = max {dist (u ) + l (u , v )}
4: dist (s ) ← 0 u ∈Γ−1 (v )
5: for all vertices v ∈ V \ {s } in rank order do On obtient ainsi
6: dist (v ) = min {dist (u ) + l (u , v )} dist (1) = 0
u ∈Γ−1 (v )
7: end for dist (3) = dist (1) + 1 = 1
dist (2) = min(dist (1) + 7, dist (3) + 5) = 6
dist (6) = min(dist (3) + 7, dist (2) − 3) = 3
Complexité de l’algorithme (23) : O (|V |) + le coût des boucles (5) et (6)
(Σu d − u) = O (|V | + |E |). dist (4) = min(dist (2) + 4, dist (6) + 5) = 8
dist (5) = min(dist (3) + 2, dist (6) + 3, dist (2) + 2) = 3
dist (7) = min(dist (4) + 4, dist (5) + 10) = 12
121/220 121/220 122/220 122/220

Application l’ordre topologique/linéaire pour calculer les chemins les plus Application l’ordre topologique/linéaire pour calculer les chemins les plus
longs/courts longs/courts

La fonction rang permet de déterminer un ordre topologique/linéaire.


Pour se faire, il suffit de placer les sommets sur une ligne dans l’ordre croissant Un variant de l’algorithme (24) est le suivant :
de leurs rangs (les sommets de grands rangs placés à droite).
Une version de l’algorithme (23) est donné par l’algorithme suivant. Algorithm 25 Procédure dag-shortest-paths(BIS)(G,l,s).

Algorithm 24 Procédure dag-shortest-paths(G,l,s). Require: DAG G=(V,E), edge weights {le : e ∈ E }, vertex s∈ V
Ensure: For all vertices u reachable from s, dist (u ) is set to the distance from s to u
Require: DAG G=(V,E), edge weights {le : e ∈ E }, vertex s∈ V 1: for all u ∈ V do
Ensure: For all vertices u reachable from s, dist (u ) is set to the distance from s to u 2: dist (u ) ← ∞
1: for all u ∈ V do 3: end for
2: dist (u ) ← ∞ 4: dist (s ) ← 0
3: end for 5: linearize G
4: dist (s ) ← 0 6: for all v ∈ V \ {s }, in linearized order do
5: linearize G 7: for all edges (u , v ) ∈ E do
6: for all u ∈ V , in linearized order do 8: dist (v ) = min{dist (v ), dist (u ) + l (u , v )}
7: for all edges (u , v ) ∈ E do 9: end for
8: dist (v ) = min{dist (v ), dist (u ) + l (u , v )} 10: end for
9: end for
10: end for

Complexité de l’algorithme (24)123/220


: le coût de la linéarisation ( O (|V | + |E |)) + le 123/220 124/220 124/220
Les principes de la programmation dynamique : rappel Les principes de la programmation dynamique : rappel

Trouver le PCC est particulièrement simple dans le cas d’un graphe G = (V , E )


de type DAG (graphe orienté, sans circuit, et avec des poids sur les arêtes
{le : e ∈ E }).
Cela est dû à la propriété des DAG d’être linéarisés (c.-à-d. numéroter les Problème : Trouver le PCC/PLC d’un sommet s ∈ V à tous les autres v ∈ V \{s}.
sommets de façon que pour chaque arc (u , v ) ∈ E on a num(u ) < num(v )). Observation : Le problème se simplifie si on connait les PCC (s ; u ) pour
Exemple ∀u ∈ Γ−1 (v ). Dans ce cas :

dist (v ) = min {dist (u ) + l (u , v )}


F IGURE 73 – À gauche : un graphe G ; à droite : le même graphe après l’avoir trié/ordonné u ∈Γ−1 (v )
topologiquement/linéairement).
Le calcul des valeurs dist dans l’ordre linéaire garantit que les valeurs
A B nécessaires pour le calcul de dist (v ) sont déjà connues au moment de ce calcul.
6 3
Cela permet de trouver les valeurs dist avec un seul parcours des sommets
1 2 (l’algorithme 25 « dag-shortest-paths(BIS)(G,l,s) »).
S 4 1 E S0 C0 A0 B0 D0 E0
2 4 6 1 1

2 1
1 2
C D
3

125/220 125/220 126/220 126/220

Les principes de la programmation dynamique : rappel La plus longue sous-séquence croissante

L’algorithme 25 illustre bien l’approche programmation dynamique qui consiste à


résoudre un ensemble de sous-problèmes {dist (u ), u ∈ V } en commençant par
les plus « petits » (les prédécesseurs) et en allant progressivement vers les plus Donné : Une séquence de nombres S = a1 , a2 , . . . , an .
« grands » (les successeurs).
Def_1 : Une sous-séquence : chaque sous-ensemble des nombres ai1 , ai2 , . . . , aik tel
Cependant, le graphe DAG peut ne pas être explicitement donné, mais il est que 1 ≤ i1 ≤ i2 ≤ . . . ik ≤ n.
implicite.
Def_2 : Une sous-séquence croissante : telle que les nombres ai croissent.
Les sommets représentent dans ce cas les sous-problèmes à résoudre, tandis
Problème : Trouver la plus longue sous-séquence croissante de S (PLSSC(S)).
que les arcs correspondent aux dépendances entre les problèmes ; si la solution
du sous-problème B nécessite une réponse du sous-problème A, on met un arc Exemple : La plus longue sous-séquence croissante de S = 5, 2, 8, 6, 3, 6, 9, 7 est 2, 3, 6, 9.
(conceptuel) de A à B.
A est considéré ainsi comme un sous-problème plus petit que B (un
prédécesseur de B).

127/220 127/220 128/220 128/220


La plus longue sous-séquence croissante Algorithme pour la plus longue sous-séquence croissante

Algorithm 26 Algorithme longest increasing subsequence.


L’espace des solutions sera présenté par un DAG G = (V , E ) où à chaque
nombre ai on associera un sommet i ∈ V et on ajoutera un arc (i , j ) si i < j et 1: for j = 1 to n do
ai < aj . 2: L(j ) = 1 + max{L(i ) | (i , j ) ∈ E }
3: end for
On établit ainsi une bijection (« one-to-one correspondence ») entre les chemins
4: return maxj L(j )
dans G et les sous-séquences croissantes dans S.
where max{} = 0.
L’objectif est de trouver le plus longue chemin (PLC) dans ce graphe.
Exemple : Le graphe DAG associé à la séquence S = 5, 2, 8, 6, 3, 6, 9, 7.
L’idée de base : L(j ) est la longueur de la PLSSC aboutissant au sommet j (+1)
(on cherche le nombre de sommets, pas des arêtes).
L(j ) est la longueur maximale parmi les PLSSC des prédécesseurs du j (+1).
On découvre ici l’approche programmation dynamique : l’ordre et les relations
entre les problèmes indiquent que pour résoudre un problème donné L(j ), il faut
que ses prédécesseurs (les sous-problèmes qui le précédent) soient résolus.
Complexité de l’algorithme (26) : le coût de la boucle for de la ligne (1) (O (|V |))
+ le coût de la ligne (2) Σj ∈V d − (j ) = O (|E |). En total : O (|V | + |E |) = O (n2 ).
L’algorithme (26) ne trouve que la longueur de la PLSSC. Pour connaitre la
séquence même, il faut sauvegarder les indices argmax de la ligne (2).

129/220 129/220 130/220 130/220

Attention aux appels récursifs naïfs ! ! ! ! La distance de Levenshtein (distance d’édition, de similarité)

La ligne 2 de l’algorithme (26) suggère une alternative – pourquoi ne pas utiliser


un algorithme récursif ?
En fait, c’est une mauvaise idée puisque l’algorithme récursif s’exécute en temps La distance de Levenshtein entre mots ou chaînes de caractères donne des
exponentiel. indications sur le degré de ressemblance de ces chaînes.
Considérons par exemple le cas d’une séquence croissante. Elle contient tous
les arcs {(i , j ) | i < j }. La formule devient Exemple : Deux alignements possibles des mots « SNOWY » et « SUNNY ».
L(j ) = 1 + max{L(1), L(2), . . . , L(j − 1)}. S - N O W Y - S N O W - Y
Pour L(5) on obtient alors : S U N N - Y S U N - - N Y
coût = 3 coût = 5

Le symbole « _ » indique une omission (« gap »). On peut en utiliser tant que l’on
veut.
Le coût d’un alignement équivaut le nombre de colonnes où les caractères
divergent.
La distance de Levenshtein correspond au coût du meilleur alignement.
Et ce sous-problème sera résolu maintefois !. Pour L(n) la taille de l’arbre sera
exponentielle. Cela s’explique par les dépendances entre les problèmes L(j ) et Si A, B sont deux mots, la distance de Levenshtein est le nombre minimum de
L(j − 1) ; ils sont presque de la même taille. remplacements, ajouts et suppressions de lettres pour passer du mot A au mot
Pour améliorer l’efficacité il faut mémoriser les solutions des sous-problèmes B.
résolus, et les calculer dans le bon ordre (cela évoque déjà la programmation
dynamique).
131/220 131/220 132/220 132/220
La distance d’édition par la programmation dynamique La distance d’édition par la programmation dynamique

Comment découper E (i , j ) en sous-problèmes ?


Considérons la dernière colonne de l’alignement de x [1, 2, . . . , i ] avec
Afin d’appliquer la programmation dynamique, il faut repérer les sous-problèmes.
y [1, 2, . . . , j ]. Il y trois cas possibles.
L’entrée consiste en deux séquences x [1, 2, . . . , m] et y [1, 2, . . . , m].
x[i] où _ où x[i]
Considérons la distance d’édition entre le préfixe x [1, 2, . . . , i ] de x et le préfixe
_ y[j] y[j]
y [1, 2, . . . , j ] de y . Notons ce problème E (i , j ).
Dans le premier cas le coût est 1 + le coût d’aligner x [1, 2, . . . , i − 1] avec
L’objective est de calculer E (m, n)
y [1, 2, . . . , j ] (c.-à-d. le sous-problème E (i − 1, j )).
Par exemple, le problème E (7, 5) compare les parties en rouge des deux
Dans le deuxième cas le coût est 1 + le coût d’aligner x [1, 2, . . . , i ] avec
E X P O N E N T I A L
séquences suivantes. y [1, 2, . . . , j − 1] (c.-à-d. le sous-problème E (i , j − 1)).
P O L Y N O M I A L
Dans le troisième cas le coût est le coût d’aligner x [1, 2, . . . , i − 1] avec
y [1, 2, . . . , j − 1] (c.-à-d. le sous-problème E (i − 1, j − 1)) + 1 si x [i ] 6= y [j ] et 0 si
x [i ] = y [j ].

133/220 133/220 134/220 134/220

La distance d’édition par la programmation dynamique La distance d’édition par la programmation dynamique

E (i , j ) est découpé donc en trois sous-problèmes : E (i − 1, j ), E (i , j − 1), Algorithm 27 Dynamic programming algorithm for edit distance.
E (i − 1 , j − 1 ).
1: for i = 0 to m do
Pour trouver la meilleure solution il suffit de prendre le min : 2: E (i , 0) = i
3: end for
E (i , j ) = min{1 + E (i − 1, j ), 1 + E (i , j − 1), diff(i,j) + E (i − 1, j − 1)}
4: for j = 0 to n do
où diff(i,j)=0, si x [i ] = y [j ], 1 sinon. 5: E (0, j ) = j
6: end for
Pour se faire, on mémorisera les solutions des sous-problèmes E (i , j ) dans une
7: for i = 0 to m do
table 2D. Cette table sera parcourue de façon que les sous-problèmes
8: for j = 0 to n do
E (i − 1, j ), E (i , j − 1), E (i − 1, j − 1) sont calculés avant E (i , j ).
E (i , j ) = min{1 + E (i − 1, j ), 1 + E (i , j − 1), diff(i,j) + E (i − 1, j − 1)}
Valeurs initiales : on pose E (i , 0) = i (puisque c’est la distance d’édition entre 9: end for
une séquence vide et les i premiers caractères de x). On pose aussi E (0, j ) = j. 10: end for
On obtient ainsi l’algorithme suivant. 11: return E (m, n)

135/220 135/220 136/220 136/220


La distance d’édition par la programmation dynamique Recherche du plus courts chemin entre chaque couple de sommets

Les sous-problèmes sont de la forme (i , j ) et dans le graphe DAG associé il


existe des dépendances (arcs) entre (i − 1, j ), (i , j − 1), (i − 1, j − 1) et (i , j ).
On peut fixer les longueurs des arcs de façon que les distances d’édition
Initialisation : dist (i , j , 0) = l (i , j ) si (i , j ) ∈ E, dist (i , j , 0) = ∞ sinon.
correspondent aux plus courts chemins.
En utilisant le principe d’optimalité de Bellman, on obtient alors pour chaque
nouveau sommet intermédiaire la récurrence suivante :
On pose le = 1 pour tous dist (i , j , k ) ← min{dist (i , j , k − 1), dist (i , k , k − 1) + dist (k , j , k − 1)}.
les arcs sauf pour les arcs
entre (i − 1, j − 1) et (i , j )
pour lesquels x [i ] = y [j ].
Dans ce dernier cas on
pose le = 0 (ces arcs
correspondent aux arcs
diagonales de la figure).
On obtient à la fin la longueur du PCC (i ; j ) pour chaque couple (i , j ).
La distance d’édition
équivaut la longueur du
PCC entre (0, 0) et (m, n).

137/220 137/220 138/220 138/220

Algorithm 28 Procédure Floyd-Warshall(G,l,s). Algorithme de Floyd-Warshall : illustration


Require: G = (V , E ) without negative cycles, edge weights {le : e ∈ E }
Ensure: dist (i , j , n) = length of of the shortest path from i to j for all i , j , ∈ V
1: for i = 1 to n do
2: for j = 1 to n do
3: dist (i , j , 0) ← ∞ F IGURE 74 – Appliquer l’alg. de Floyd-Warshall au graphe suivant.
4: end for
5: end for 2
6: for all (i , j ) ∈ E do
1 2
7: dist (i , j , 0) ← l (i , j ) 3
8: end for 2
9: for k = 1 to n do
−2 2 4
10: for i = 1 to n do 3
11: for j = 1 to n do
12: dist (i , j , k ) ← min{dist (i , j , k − 1), dist (i , k , k − 1) + dist (k , j , k − 1)}
3 4
13: end for 1
14: end for
15: end for 4
Améliorations possibles : Ajoutez des testes complémentaires pour éviter le calcul
si l (i , k ) = ∞ et qui permettent de s’arrêter à la détection du premier circuit de
longueur négative.

139/220 139/220 140/220 140/220


Définitions et propriétés principales

Définition : Un graphe, non-orienté, connexe et acyclique est dit arbre.


On peut démontrer les propriétés suivantes :
Propriétés : Un arbre avec n sommets possède n − 1 arêtes.
Si le graphe G = (V , E ), non-orienté et connexe, est tel que |E | = |V | − 1, alors G
Arbres couvrants minimaux (ACM) est un arbre.
Un graphe non-orienté est un arbre, si et seulement si, entre chaque couple de
sommets il existe un seul chemin.
Problème : Donné un graphe G = (V , E , we , e ∈ E ), non-orienté, connexe. On cherche
T ⊆ E qui connecte tous les sommets et qui minimise le poids total
i w (T ) = ∑ w (u , v ).
(u ,v )∈T
On voit facilement que T est acyclique, donc un arbre. T est appelé Arbre
Couvrant Minimal (ACM) 2 .

2. " Arbre Couvrant Minimal" est un racourci pour " Arbre Couvrant de poids Minimal". Tous les arbres
couvrants comportent exactement |V | − 1 arêtes.
141/220 141/220 142/220 142/220

Arbre Couvrant Minimal : Illustration Une application des arbres couvrants minimaux

Des chemins forestiers


Les Eaux et Forêts ont décidé d’abattre 5 bosquets situés dans une forêt. Les
distances mutuelles entre les bosquets sont données (en km) par la matrice suivante.

a b c d e
a 10 1 2 5
b 10 6 4 3
c 1 6 8 9
d 2 4 8 7
e 5 3 9 7

Pour mener à bien cette exploitation il est nécessaire de tracer un réseau de chemins
de coût de construction minimum qui permette de circuler entre tous les bosquets.
Les coûts de construction de ces chemins sont proportionnels à leurs longueurs.

F IGURE 75 – Un graphe connexe. Les arêtes de l’arbre couvrant sont grisées. Le poids total de Enumérer les algorithmes vus en cours pouvant résoudre ce problème. Donner
l’arbre montré est 37. L’arbre n’est pas unique : on peut remplacer l’arête (b, c ) par l’arête (a, h) la complexité de ces algorithmes pour un graphe quelconque G = (V , E ).
et on obtient un autre arbre de même poids.
etc. (cf. le sujet d’examen du décembre 2011 )

143/220 143/220 144/220 144/220


Définitions et propriétés principales Théorème de l’arête minimale qui traverse la coupure : Illustration

Soit T un ACM, et soit X ⊂ T . Soit S ⊂ V tq X ne traverse pas la coupure (S , V \ S )


(on dira que la coupure respecte X ), et soit e = (u , v ) une arête minimale traversant
Problème : Donné un graphe G = (V , E , we , e ∈ E ), non-orienté, connexe. On cherche (S , V \S ). Alors e est une arête sure pour X .
T ⊆ E qui connecte tous les sommets et qui minimise le poids total
w (T ) = ∑ w (u , v ). On voit facilement que T est acyclique, donc un arbre.
(u ,v )∈T
T est appelé Arbre Couvrant Minimal (ACM) .
Définitions : Soit T un ACM, et soit X ⊆ T . Une arête (u , v ), telle que X ∪ {(u , v )} ⊆ T , est
appelée arête sure pour X .
Une coupure (S , V \S ) du graphe G(V , E ) est une partition des sommets V .
Une arête traverse la coupure (S , V \S ) si l’une de ses extrémités appartient à S et
la seconde appartient à V \S.
Un ensemble d’arêtes X traverse la coupure (S , V \S ) si ∃ au moins une arête e ∈ X
qui traverse cette coupure.
Une arête est dite minimale pour la traversée de la coupure si son poids est minimal
parmi toutes les arêtes qui traversent la coupure.
Théorème : Soit T un ACM, et soit X ⊂ T . Soit S ⊂ V tq X ne traverse pas la coupure
(S , V \S ) (on dira que la coupure respecte X ), et soit (u , v ) une arête minimale
traversant (S , V \S ). Alors (u , v ) est une arête sure pour X . F IGURE 76 – (a) Un graphe G = (V , E ) ; (b) l’ensemble X = {(A, B ), (A, C ), (E , F )} a trois
arêtes et fait partie de l’ACM T visualisé sur (c) ; (d) S = {A, B , C , D } est la coupure (S , V \ S )
respecte X puisqu’aucune arête de X ne traverse la coupure. (e) l’arête minimale est
e = (D , E ). D’après le théorème de l’arête minimale X ∪ {e} fait partie d’un ACM ( à l’occurence
T 0 ).
145/220 145/220 146/220 146/220

Théorème de l’arête minimale qui traverse la coupure : preuve Algorithme générique pour la construction d’un ACM

Soit T un ACM, et soit X ⊂ T . Soit S ⊂ V tq X ne traverse pas la coupure (S , V \ S )


(on dira que la coupure respecte X ), et soit e = (u , v ) une arête minimale traversant
(S , V \S ). Alors e est une arête sure pour X .
Preuve : Si e ∈ T il n’y a rien à démontrer. Supposons e ∈ / T . Puisque T est un Algorithm 29 ACM_generique (G(V,E),w)
arbre, ∃ dans T un chemin entre les sommets u ∈ S et v ∈ V \ S. Soit e0 ∈ T l’arête
de ce chemin qui traverse la coupure (S , V \ S ). Notons T 0 = T ∪ {e} \ {e0 }. T 0 est Require: Un graphe G = (V , E ) avec des poids we , e ∈ E.
un arbre (puisque un graphe connexe et a le même nombre d’arêtes que T ). De plus, Ensure: Un ACM défini par les arêtes de l’ensemble X .
w (T 0 ) = w (T ) − w (e0 ) + w (e) ≤ w (T ) puisque w (e) ≤ w (e0 ). T 0 est donc un ACM. X ← 0/
while X ne forme pas un arbre couvrant do
trouver pour X une arête sure (u , v )
X ← X ∪ {(u , v )}
end while
return X

147/220 147/220 148/220 148/220


Algorithme de Prim pour la construction d’un ACM (version tbl) Illustration pour l’algorithme ACM_Prim (G(V,E),w,A)
L’algorithme de Prim ressemble beaucoup à l’alg. de Dijkstra.

Algorithm 30 ACM_Prim (G(V,E),w,r)

Require: Un graphe G = (V , E ) avec des poids we , e ∈ E. r est le sommet initial.


Ensure: Un ACM défini par les pointeurs prev (v ), ∀v ∈ V .
/ ; clef (r ) ← 0 ;
1: Initialisation : ∀u ∈ V : clef (u ) ← ∞ and prev (u ) ← nil ; S ← 0
2: F ← maketbl(V) {crée un tbl F avec clef (v ), v ∈ (V ) comme clés}
3: while F is not empty do
4: u ← ExtractMin(F) {l’élément u sera considéré hors F }
5: S ← S ∪ {u } itér S F
6: for all edges (u , v ) ∈ E do
7: if v ∈ F and clef (v ) > w (u , v ) then A B C D E F
8: clef (v ) ← w (u , v ) 0 {} 0 ∞, nil ∞, nil ∞, nil ∞, nil ∞, nil
9: prev (v ) ← u 1 {A} — 5, A 6, A 4, A ∞, nil ∞, nil
10: end if 2 {A; D } — 2, D 2, D — ∞, nil 4, D
11: end for 3 {A; D ; B } — — 1, B — ∞, nil 4, D
12: end while
4 {A; D ; B ; C } — — — — 5, C 3, C
13: return prev
5 {A; D ; B ; C ; F } — — — — 4, F —
Complexité : pour chaque u de la ligne 4 on fait d (u ) mises à jour. En total 6 {A; D ; B ; C ; F ; E } — — — — — —
∑v ∈V d (u ) = O (|E |) mises à jour. Le coût de O (|V |) recherches de min dans
F IGURE 77 – Un graphe et son ACM de poids 14 trouvé par l’algorithme de Prim.
un tableau est O (|V |2 ). En total O (|V |2 + |E |) = O (|V |2 ).
149/220 149/220 150/220 150/220

Arbres parfaits partiellement ordonnés et tas binaire (Binary heap) Arbres parfaits partiellement ordonnés et tas binaire : implementation en
tableau

Le tas binaire (Binary heap) est une file de priorité importante fréquemment
utilisée pour améliorer la complexité des algorithmes comme le tri par tas, l’alg.
de Dijkstra, l’alg. de Prim ....
Définition : Soit π(j ) la clé associée avec l’élément j de la file F. F est un tas
binaire si la condition suivante est satisfaite (relation entre le père et ses deux F IGURE 78 – L’arbre parfait qui visualise un tas binaire avec 10 éléments. Seules les clés sont
fils) : indiquées. Ci-dessous le tableau π associé avec ce tas binaire.
j
π(j ) ≥ π(b c) ∀j (25)
2
j 1 2 3 4 5 6 7 8 9 10
⇐⇒ π(j ) ≤ π(2j ) and π(j ) ≤ π(2j + 1) ∀j π(j ) 3 10 5 11 12 6 8 15 20 13
On représente le tas binaire par un arbre parfait partiellement ordonné :
∀ niveau est rempli de gauche à droite ; On a les règles suivantes :
∀ niveau est complètement rempli avant de commencer le niveau suivant ; π(1) est la racine qui contient l’élément le plus petit ;
la condition (25) est satisfaite (l’élément contenu dans tout nœud est inférieur ou
égal aux éléments contenus dans les fils de ce nœud). π(2j ) and π(2j + 1) sont les deux fils, s’ils existent, de π(j ). En plus,
π(j ) ≤ π(2j ) and π(j ) ≤ π(2j + 1). ;
Le tas est facile à implémenter en tableau.
exemple j = 4 : π(4) = 11, π(8) = 15, π(9) = 20 ;
π(b 2j c) est le père de π(j ) pour j > 1 ;
exemple j = 9 : π(9) = 20, π(b 92 c) = π(4) = 11 ;

151/220 151/220 152/220 152/220


Arbres parfaits partiellement ordonnés et tas binaire : propriétés Arbres parfaits partiellement ordonnés et tas binaire : illustration du
fonctionnement

Chaque élément d’un tas binaire est caractérisé par le couple (nom, valeur
numérique) (v , clef (v )).
la racine contient le plus petit élément. L’opération « accès à la racine » se fait en
Θ(1) ;
l’opération « insertion » se fait en Θ(log2 k ) ;
l’opération « suppression du minimum » se fait en Θ(log2 k ).

F IGURE 79 – (a) : un tas binaire avec 10 éléments. Seules les clés sont indiquées. (b)-(d) :
illustration de l’opération « insertion ». (e)-(g) : illustration de l’opération « extraction et
suppression du minimum ».
153/220 153/220 154/220 154/220

Algorithme de Prim pour la construction d’un ACM (version tas binaire) Algorithme de Kruskal pour la construction d’un ACM ACM_Kruskal
Algorithm 31 ACM_Prim (G(V,E),w,r) (G(V,E),w) : Illustration
Require: Un graphe G = (V , E ) avec des poids we , e ∈ E. r est le sommet initial.
Ensure: Un ACM défini par les pointeurs prev (v ), ∀v ∈ V .
Arête Poids Garder count
1: Initialisation : ∀u ∈ V : clef (u ) ← ∞ and prev (u ) ← nil ; clef (r ) ← 0 ;
considérée l’arête
2: F ← makequeue(V) {crée une file de priorité F (binary heap) }
(B,C) 1 Oui 1
3: while F is not empty do
(C,D) 2 Oui 2
4: u ← ExtractMin(F)
(B,D) 2 Non 2
5: for all edges (u , v ) ∈ E do
6: if clef (v ) > w (u , v ) then (C,F) 3 Oui 3
7: clef (v ) ← w (u , v ) (A,D) 4 Oui 4
8: prev (v ) ← u (D,F) 4 Non 4
9: ChangeKey(F,v) {F is updated according to the new value of clef (v ) } (E,F) 4 Oui 5
10: end if (A,B) 5 Non -
11: end for (C,E) 5 Non -
12: end while (A,C) 6 Non -
13: return prev c)
Complexité :
La ligne (2) s’exécute en O (|V | log |V |). F IGURE 80 – a) un graphe G = (V , E ) ; b) son l’ACM de poids 14 ; c) Illustration du
pour un sommet u donné par la ligne 4 on fait d (u ) mises à jour de la clef. fonctionnement de l’alg. de Kruskal pour ce graphe. L’algorithme s’arrête quand le conteur count
En total, pour ∀v ∈ V , on fait O (|E |) mises à jour de la clef. Donc la boucle (3-11) s’exécute en atteint la valeur |V | − 1.
|E | log |V | puisque chaque mise à jour se fait en O (log |V |).
On obtient en total : O (|V | log |V | + |E | log |V |) = O (|E | log |V |).
155/220 155/220 156/220 156/220
Algorithme de Kruskal pour la construction d’un ACM Opérations et structures de données pour les ensembles disjoints

Algorithm 32 ACM_Kruskal (G(V,E),w)

Require: Un graphe G = (V , E ) avec des poids we , e ∈ E.


Ensure: Un ACM défini par les arêtes de l’ensemble X .
for all u ∈ V do
makeset(u) La structure de données maintient à jour une collection {S1 , S2 , . . . , Sk } d’ensembles
end for dynamiques disjoints. Chaque ensemble est un arbre orienté, dont la racine est le
X ← 0/ représentant de cet ensemble. Chaque noeud de l’arbre est muni d’un pointeur, (π ),
trier les arêtes E par leurs poids vers son père, ainsi que d’un rang, (rank), qui équivaut la taille de sous-arbre
for all (u , v ) ∈ E, dans l’ordre croissant des poids do enraciné à ce noeud. Cette structure permet de connaitre rapidement à quel
if find(u) 6= find(v) then ensemble appartient un élément donné, et de pouvoir réunir deux ensembles.
X ← X ∪ {(u , v )}
union(u,v)
end if
end for
return X

Complexité : On fait |V | makeset, 2|E | find et |V | − 1 unions.

157/220 157/220 158/220 158/220

Opérations et structures de données pour les ensembles disjoints (suite) Opérations et structures de données pour les ensembles disjoints (suite)
Algorithm 33 procedure makeset (x) Algorithm 36 procedure union (x,y)

Ensure: crée un nouvel ensemble dont le seul élément (et donc le représentant) est Require: Deux ensembles dynamiques Sx et Sy représentés par leurs racines x et y .
x. Sx et Sy sont supposés disjoints avant l’opération.
π(x ) ← x Ensure: Réunit les ensembles dynamiques Sx et Sy dans Sx ∪ Sy . On fait pointer la
rank (x ) ← 0 racine du moindre rang sur celle de rang supérieur au moment de l’union. Comme
les ensembles de la collection sont obligatoirement disjoints, on supprime les en-
Algorithm 34 function find(x) sembles Sx et Sy .
rx ← find(x)
Ensure: retourne un pointeur vers le représentant de l’ensemble (unique) contenant
ry ← find(y)
x.
if rx = ry then
while x6= π(x ) do
return
x ← π(x )
end if
end while
if rank(rx ) > rank(ry ) then
return x π(ry ) ← rx
Algorithm 35 function find_bis(x) else
π(rx ) ← ry
Ensure: effectue une compression du chemin lors de l’opération find if rank(rx ) = rank(ry ) then
if x6= π(x ) then rank(ry ) ← rank(ry ) + 1
π(x ) ←find(π(x )) end if
end if end if
return π(x )
159/220 159/220 160/220 160/220
Illustration pour les opérations sur les ensembles disjoints Illustration pour les opérations sur les ensembles disjoints

F IGURE 82 – Compression du chemin lors de la fonction find-bis.

F IGURE 81 – Résultat des opérations makeset et union sur des ensembles disjoints

161/220 161/220 F IGURE 83 – Résultat de l’opération


162/220 union sur des ensembles disjoints 162/220

Analyse de complexité des opérations sur les ensembles disjoints Algorithme de Prim versus l’algorithme de Kruskal

Une instance géometrique du problème de l’arbre couvrant de poids minimal (ACM) :


les poids des arêtes sont proportionnels à la distance géometrique entre les sommets.

Propriétés des structures de données pour les ensembles disjoints :


∀x 6= la racine, rank(x) < rank(π(x))
Chaque racine de rang k a au moins 2k noeuds dans son arbre.
n
Chaque ensemble de n éléments possède au plus 2k
noeuds de rang k .
La hauteur de l’arbre représentant un ensemble de n éléments ne dépasse pas
log n.

Corolaire 1 La complexité des opérations find et union est en O (log |V |).


Corolaire 2 La complexité de l’algorithme de Kruskal est en
O (|E |(log |E | + log |V |)) = O (|E | log |V |) puisque log |E | ≈ log |V |
(la même que la complexité de l’algorithme de Prim).

F IGURE 84 – (a) visualise les quatre premières arêtes ajoutées par l’algorithme de Prim à partir
du sommet r ; (b) visualise les quatre premières arêtes ajoutés par l’algorithme de Kruskal. Pout
les deux cas la ligne indiquée en pointillés est la suivante à être ajoutée.
163/220 163/220 164/220 164/220
Réseaux : définitions

Soit G = (X , U , C ) un graphe connexe orienté (réseau). A ∀ arc u on affecte une


valeur (capacité) cu qui est une borne supérieure du flot sur l’arc.
Soit deux sommets particuliers s ∈ X (source) et t ∈ X (puits). Considérons le
graphe G0 = (X , U 0 ) où U 0 = U ∪ {t , s}. L’arc (t , s) est appelé l’arc de retour du
flot (numéroté 0). Notons n = |X | et m = |U |.
Le problème du flot maximum dans les réseaux :
l’algorithme de Ford-Fulkerson

F IGURE 85 – Un réseau G = (X , U , C ). Chaque arc u ∈ U est muni d’une capacité cu .

165/220 165/220 166/220 166/220

Exemple de flot Définition d’une coupe et de sa capacité


Soit le réseau G = (X , U , C ). Une coupe séparant s et t (notée s − t) est une
On dit que [φ1 , φ2 , . . . φm ]T est un flot de s à t ssi la loi de conservation du flot est
partition (L, R ) de X , telle que s ∈ L et t ∈ R = L̄ = X \ L.
vraie en tout ∀u ∈ X \{s, t }, i.e.
La capacité C (L, R ) de la coupe s − t est définie par C (L, R ) = ∑ ce où
∑ φ(u ,v ) = ∑ φ(v ,u ) (26) e∈ω+ (L)
v ∈Γ+ (u ) v ∈Γ− (u )
ω (L) représente le sous-ensemble d’arcs qui ont leurs extrémités initiales dans
+
La valeur du flot est notée par φ0 . Elle est définie par L et leurs extrémités terminales dans L̄ = R.
∑ φ(s,v ) = ∑ φ(u ,t ) = φ0 (valeur du flot) (27) Lemme : La valeur maximale d’un flot de s à t compatible avec cu n’excède
v ∈Γ+ (s) u ∈Γ− (t ) jamais la capacité d’une coupe séparant s et t.

But : Trouver dans G0 un flot compatible φ0 = [φ0 , φ1 , φ2 , . . . φm ] (c.-à-d.


0 ≤ φu ≤ cu ∀u ∈ U) et tel que φ0 soit maximale.

F IGURE 87 – Une coupe s − t définie par la partition L = {s, a, b} and R = {c , d , e, t }. Chaque


flot s ; t doit passer de L à T et traverser ainsi la coupe s ; t. Donc, la valeur d’aucun flot ne
peut dépasser la valeur de la capacité C (L, R ) qui vaut 7. Ainsi, chaque flot s ; t de valeur 7,
F IGURE 86 – Un flot de valeur 6. Les valeurs du flot sur chaque arc sont indiquées en rouge, les devrait être maximal (certificat d’optimalité).
valeurs des capacités en noir. On cherche un flot de valeur maximale.
167/220 167/220 168/220 168/220
L’égalité entre le flot et la capacité d’une coupe est un certificat d’optimalité Graphe d’écart (graphe résiduel)

Soit φ = [φ1 , φ2 , . . . φm ]T un flot entre s et t compatible avec cu .


Le graphe d’écart associé à φ est le graphe Ḡ(φ) = [X , Ū (φ)] où Ū (φ) est
constitué de façon suivante :
pour ∀u = (i , j ) ∈ U on associe au plus deux arcs de Ḡ(φ)
u + = (i , j ) si φu < cu avec capacité (résiduelle) cu − φu > 0
u − = (j , i ) si φu > 0 avec capacité (résiduelle) φu > 0
Remarque : si φu = cu , on lui associe seulement u − , si φu = 0, on lui associe
seulement u + .

F IGURE 88 – Les valeurs en rouges sont les F IGURE 89 – Les valeurs en bleu visualisent
poids des arcs. le flot sur les arcs.

La valeur du flot sur le réseau ci-dessous vaut 20. La capacité de la coupe


({S , B , E , C }, {A, G, D , F , T }) est donnée par la somme des capacités des arcs
(S,A), (C,G), (E,D), (B,D), (E,F) est égale aussi à 20. Cette égalité sert comme un
certificat d’optimalité du flot et de la coupe respectivement. C’est une preuve que cest F IGURE 90 – a) Un réseau G avec un flot φ de valeur 5. Le couple (φu , cu ) associé à chaque arc
le flot maximum, tandis que la coupe est minimale. On observe que tous les arcs sur u indique la valeur du flot φu et sa capacité cu . b) : Le graphe d’écart Ḡ(φ) associé au flot φ.
cette coupe sont saturés - ce qui est indiqué par deux traits verticaux.
169/220 169/220 170/220 170/220

Un chemin améliorant Algorithme de Ford et Fulkerson (1956)

Etant donné un flot φ, un chemin améliorant (s ; t ) est un chemin simple 3 de s


à t dans le réseau résiduel Ḡ(φ).
Soit ε > 0 le minimum des capacités résiduelles d’un chemin améliorant π. La notion du chemin améliorant est à la base de l’algorithme de Ford et Fulkerson.
On ajoute ε au flot sur les arcs de type u + et on l’enlève du flot des arcs de type
u − ; la loi de conservation du flot est satisfaite ainsi. k = 0. Partir d’un flot initial φ0 compatible avec les capacités.
0
On obtientr un nouveau flot de valeur φ0 = φ0 + ε.
Soit φk le flot courant.
Tant qu’il existe un chemin améliorant (s ; t ) dans Ḡ(φk ) faire
soit πk un chemin améliorant (s ; t ) dans Ḡ(φk ).
Soit εk le minimum des capacités résiduelles du πk .
Définir le flot φk +1 par
φku +1 = φku + εk si u + ∈ πk (28)

φku +1 = φku − εk si u − ∈ πk (29)


φk0 +1 = φk0 k
+ε (30)
F IGURE 91 – a) Le chemin π = ((S , A)(A, B )(B , T )) est un chemin améliorant (s ; t ) dans le k ← k +1
graphe résiduel Ḡ(φ) et ε = 1 sur ce chemin. On ajoute cette valeur à la valeur du flot sur les
arcs (S , A) et (B , T ) ; on la soustrait de la valeur de l’arc (A, B ). b) Le nouveau flot de valeur fin tant que : le flot φk est de valeur maximale.
0
φ0 = 6. Peut-on l’améliorer ? Le réponse est donnée par le critère d’arrêt dans l’algorithme de
Ford et Fulkerson.

3. On dit aussi un chemin élémentaire. C’est un chemin qui passe au plus une fois par chaque sommet.
171/220 171/220 172/220 172/220
Algorithme de Ford et Fulkerson : illustration Algorithme de Ford et Fulkerson : illustration (suite)

F IGURE 92 – Un réseau G = (X , U , C ). On cherche le flot de valeur maximale.


F IGURE 94 – Un réseau G = (X , U , C ). On cherche le flot de valeur maximale.

F IGURE 93 – Le fonctionnement de l’algorithme de Ford et Fulkerson sur le réseau de la figure


92. Le flot courant est visualisé à gauche, son graphe d’écart est représenté à droite. Les figures F IGURE 95 – Le fonctionnement de l’algorithme de Ford et Fulkerson sur le réseau de la figure
a) et b) visualisent les deux premières itérations avec le flot nul (la figure a) à gauche) et le flot 94. Le flot courant est visualisé à gauche, son graphe d’écart est représenté à droite. Les figures
de valeur 1 (la figure b) à gauche). c) et d) visualisent les itérations 3 et 4 respectivement.
173/220 173/220 174/220 174/220

Algorithme de Ford et Fulkerson : illustration (fin) La relation entre le flot maximum et la coupe minimale

Théorème : Soit φ un flot compatible dans le réseau G. Les conditions suivantes sont
équivalentes :
1. φ est un flot maximum dans G.
2. Le réseau résiduel Ḡ(φ) ne contient aucun chemin améliorant.
3. La valeur du flot φ est égale à la capacité d’une coupe de capacité minimale
séparant s et t.
Démonstration :
(1) ⇒ (2) : Evident
(2) ⇒ (3) : On définit L = {v ∈ X : ∃ un chemin de s à v dans Ḡ(φ)}.
Soit R = X \ L. La partition (L, R ) est une coupe : de façon triviale s ∈ L et t ∈ R.
Par hypothèse, pour chaque arc (u , v ) tq u ∈ L et v ∈ R on a φ(u , v ) = c (u , v ).
D’autre part, pour chaque arc (v , u ) tq v ∈ R et u ∈ L on a φ(v , u ) = 0 .
Donc, size(φ) = C (L, R ).
F IGURE 96 – Les figures e) et f) visualisent les dernières itérations de l’algorithme de Ford et
Fulkerson. Le flot de valeur 7 (la figure (f) à gauche) est l’optimal. L’optimalité est démontrée par (3) ⇒ (1) : Conséquence du lemme : La valeur maximale d’un flot de s à t
le fait qu’il n’existe pas de chemin (s ; t ) dans le graphe d’écart Ḡ(φk ) (la figure (f) à droite). Il compatible avec cu n’excède jamais la capacité d’une coupe séparant s et t.
n’y a que les sommets a et b qui sont joignables à partir du sommet s. Une coupe de capacité
minimale, égale à la valeur du flot, est visualisée.

175/220 175/220 176/220 176/220


Analyse de complexité : le cas où la valeur de chaque capacité égale à 1

La recherche d’un chemin améliorant dans le graphe résiduel peut se faire en


O (|X | + |U |) (avec un des parcours vus en cours).
Supposons que chaque sommet et est incident avec au moins un arc. Alors
|X |
m = |U |, m ≥ et O (|X | + |U |) = O (m)
Analyse de complexité 2
La mise à jour du flot dans chaque itération de la boucle tant que (équations
(28) et (29)) nécessite O (m) soustractions/additions.
Considérons le cas où la valeur de chaque capacité vaut 1. Alors chaque
itération de la boucle tant que sature exactement un arc. Donc, le nombre
d’itérations de la boucle tant que ne dépasse pas min(d + (s), d − (t )).
En conséquence, le temps total de l’algorithme de Ford-Fulkerson (FF) est en
O (min(d + (s), d − (t ))m).

177/220 177/220 178/220 178/220

Le cas où la valeur de chaque capacité est une valeur entière ≥ 1 Analyse de complexité : les capacités sont des entiers ≥ 1

Réécrivons l’algorithme de Ford-Fulkerson algorithm de la manière suivante : Theorem


Notons φ le flot dans G, et soit π un simple chemin s ; t dans Ḡ(φ). Alors
Algorithm 37 Ford-Fulkerson algorithm-bis v (φ0 ) = v (φ) + bottleneck (π, φ) ; et puisque bottleneck (π, f ) > 0, on a v (φ0 ) > v (φ).

1: Initialisation : set φ(e) = 0, ∀e ∈ E to be the initial flow Pour démontrer la terminaison de l’algorithme, nous allons expliciter une borne
2: while there is an s ; t path in the residual graph Ḡ(φ) do supérieure des valeurs du flot.
3: Let π be the current s ; t path in Ḡ(φ) Supposons que tous les arcs sortants de s et entrant dans t soient saturés ; la
4: φ0 = augment (φ, π) valeur du flot dans ce cas devrait être égale à C = min( ∑ ce , ∑ ce ).
5: Update φ to be φ0 e∈Γ+ (s) e∈Γ− (t )
6: Update the residual graph Ḡ(φ) to be Ḡ(φ0 )
Nous avons ainsi v (φ) ≤ C pour chaque flot s ; t.
7: end while
8: Return φ
Theorem
L’algorithme de Ford-Fulkerson effectue au plus C itérations de la boucle tant que .
Theorem
A chaque étape intermédiaire les valeurs du flot φ(e) et des capacités résiduelles Theorem
Ḡ(φ) sont entières. L’algorithme de Ford-Fulkerson s’exécute en O (mC ) temps.

179/220 179/220 180/220 180/220


Un cas difficile pour l’algorithme de Ford et Fulkerson Analyse de complexité : amélioration par l’algorithme de Edmonds-Karp

La borne de l’algorithme de Ford-Fulkerson peut être améliorée si on implémente la


recherche du chemin améliorant à la ligne 2 avec une recherche en largeur (c.a.d. le
chemin améliorant est un plus court chemin de s vers t dans le graphe résiduel, où
chaque arc possède une pondération unitaire). Cette implémentation a pour nom
algorithme de Edmonds-Karp. On peut démontrer que cet algorithme s’exécute en
0(|X | × |E |2 ) = O (n × m2 ).

F IGURE 97 – a) Analysons le comportement de l’algorithme de FF pour ce reseau ; b) Le


chemin améliorant (S,B,A,T) permet d’obtenir un flot de valeur 1 ; c) Le graphe résiduel associé
à ce flot ; d) Le chemin améliorant (S,A,B,T) sur ce graphe permet d’améliorer la valeur du flot
et elle devient 2 ; Ainsi l’algorithme de Ford et Fulkerson peut continuer de sélectioner les
chemins (S,B,A,T) et (S,A,B,T) alternativement 103 fois en améliorant chaque fois la valeur du
flot d’une unité. Dans le cas général cette valeur peut atteindre 10|X | , donc c’est une borne
exponentielle par rapport à la taille de graphe que l’algorithme peut atteindre en théorie.
Cependant, en pratique, cet algorithme est considéré efficace.

181/220 181/220 182/220 182/220

Barrage routier par les flots

F IGURE 98 – Le réseau routier d’une île. Pour exprimer leur mécontentement, les agriculteurs
Applications décident de bloquer toute possibilité d’aller de A à B. Pour réduire la gêne occasionnée, on
envisage bloquer seulement les routes, pas les agglomérations.

Proposer une méthode générale pour déterminer où placer les barrages routiers.
Déterminer le nombre minimal de barrages nécessaires et leur emplacement.
Les forces publiques de la vile A ont décidé de surveiller les routes au départ de
A. Toute possibilité de dresser un barage sur ces routes est donc exclue.
Déterminer à nouveau le nombre minimal de barrages nécessaires et leur
emplacement.

183/220 183/220 184/220 184/220


Barrage routier par les flots - suite Barrage routier par les flots - suite
Le problème consiste à supprimer un nombre minimal d’arcs de façon à ce qu’il n’existe plus de Pour modéliser le fait que les forces publiques de la vile A ont décidé de surveiller les routes au
chemin de A vers B. Le problème se ramène à la recherche d’une coupe de capacité minimale. départ de A, on affecte une capacité ∞ aux arcs sortants de A.
On affecte une capacité 1 à chaque arc. La valeur d’une coupe fournit le nombre d’arcs de
supprimer afin d’éliminer toute communication de A vers B.

F IGURE 101 – On construit un flot de valeur 3.

F IGURE 99 – On construit un flot de valeur 3.

F IGURE 102 – Le flot trouvé est le flot maximum puisqu’il n’existe pas de chemin dans le graphe
F IGURE 100 – Le flot trouvé est le flot maximum puisqu’il n’existe pas de chemin dans le graphe résiduel. La coupe associée (donnée par la partition des sommets en sommets rouges et
résiduel. La coupe associée (donnée par la partition des sommets en sommets rouges et blancs) est la coupe minimale. Elle suggère l’emplacement des barages – en l’occurrence sur
blancs) est la coupe minimale. Elle suggère l’emplacement des barages – en l’occurrence sur les arcs (1, 5), (13, B ), (14, B ).
les arcs (A, 1), (13, B ), (14, B ).
185/220 185/220 186/220 186/220

Construction d’autoroutes

Avant d’établir un projet de construction d’autoroutes on désire étudier la capacité du


réseau routier, représenté par le graphe ci-dessous, reliant la ville S à la ville T.
Pour cela, on a évalué le nombre maximal de véhicules que chaque route peut
écouler par heure, compte tenu des ralentissements aux traversées des villes et
villages, des arrêtes aux feux etc. ...Ces évaluations sont indiquées entre crochets, en
centaines de véhicules par heure sur les arcs du graphe. Les temps de parcours entre Chemins, flots et programmes linéaires dans les
villes sont tels que les automobilistes n’emprunteront que les chemins représentés
par le graphe. On cherche le débit horaire total maximal de véhicules susceptible de
graphes
s’écouler entre les villes S et T.

a d
[4]
[2]
[2] [2]
[3] [3] [7]

S b e T
[7] [4] [6]
[1]
[9] [5] [5]
c f
[3]

F IGURE 103 – Capacité d’un réseau routier.


187/220 187/220 188/220 188/220
Programmes Linéaires (PL) versus PL en Nombres Entiers (PLNE) Programmation Linéaire (PL)
Exemple de PL : Un artisan chocolatier décide de confectionner des œufs en
chocolat. En allant inspecter ses réserves, il constate qu’il lui reste 18 kg de cacao, 8
kg de noisettes et 14 kg de lait. Il a deux spécialités : l’oeuf Extra et l’oeuf Sublime. Un
L’intérêt de la Programmation Linéaire (PL) réside dans ce qui suit :
oeuf Extra nécessite 1 kg de cacao, 1 kg de noisettes et 2 kg de lait. Un oeuf Sublime
nécessite 3 kg de cacao, 1 kg de noisettes et 1 kg de lait. Il fera un profit de 20 e en Les programmes linéaires modélisent convenalement un grand nombre de
vendant un oeuf Extra, et de 30 e en vendant un oeuf Sublime. Combien d’œufs situations réelles.
Extra et Sublime doit-il fabriquer pour faire le plus grand bénéfice possible ? L’existance des solveurs efficaces pour la résolution (IBM ILOG CPLEX, Gurobi,
Modélisation : Consiste en trois éléments : COIN, MINOS, GLPK etc.).
Définir les variables du problèmes et leur type informatique ; L’existance des langages de modélisation comme AMPL (A Mathematical
Donner la fonction objectif (fonction économique) ; Programming Language) et Pyomo (Python-based, open-source optimization
Donner les contraintes du problème. modeling language), JuMP (Julia for Mathematical Optimization) ; PuLP : A
max z = 20x1 + 30x2 Objectif Linear Programming Toolkit for Python.
c1 : x1 + 3x2 ≤ 18 c1 : disponibilité du cacao
c2 : x1 + x2 ≤ 8 c2 : disponibilité des noisettes La programmation linéaire n’est pas le seul moyen d’aborder un problème
c3 : 2x1 + x2 ≤ 14 c3 : disponibilité du lait d’optimisation. Il y a deux autres grands paradigmes, la programmation par
c4 : x1 ≥ 0 x1 : la quantité des œufs Extra ; contraintes (PC) et les modèles SAT. Chaque méthode est différente et possède ses
c5 : x2 ≥ 0 x2 : la quantité des œufs Sublimes ; forces et faiblesses.
Solution : 3 œufs Extra, 5 œufs Sublime, bénéfice 210 e.
Si on avait 18,5 kg de cacao à la place de 18 kg on aurait obtienu la solution 2,75
Extra et 5,25 Sublime avec un bénéfice=212,5 e . Ce qui n’est pas admissible !. Pour
rendre le problème admissible on ajoute la conrainte : x1 , x2 , entier ; ( un PLNE).
189/220 189/220 190/220 190/220

Programmation par Contrainte (CP) Le problème SAT (problème de satisfaisabilité booléenne)

La Programmation par Contrainte est très efficace sur les problèmes hautement Les solveurs SAT n’utilisent que la Forme Normale Conjonctive (CNF) sur des
combinatoires comme l’ordonnancement ou la planification. Elle utilise des variables variables booléennes. Cette simplicité leur permet une grande rapidité et un
entière et des algorithmes de filtrage sur leurs domaines pour trouver une ou apprentissage des conflicts rencontrés pendant la résolution (CDCL).
plusieures solutions.
Très rapides (un problème à 4 millions de clauses peut être résolu en moins
Très efficace sur les problèmes hautement combinatoires. d’une seconde)
Un très grand nombre de contraintes différentes (plus de 500 contraintes Apprentissage de clause depuis les conflits rencontrés (CDCL)
référencées dans le catalogue de contraintes).
La modélisation en CNF peut être un peu difficile
Exemple :
Exemple : ^ _
AllDifferent({X1 , . . . , Xn }) xijk
Decreasing({X1 , . . . , Xn }) i ,j k ∈( q )
q −1
AtLeastNValue(N , {X1 , . . . , Xn }) ^
Cumulative({X1 , . . . , Xn }, {h1 , . . . , hn }, {d1 , . . . , dn }, c ) (¬xijk ∨ ¬xijk 0 ∨ ¬xijk 00 )
Among(c , {X1 , . . . . , Xn }, D ) i ,j ,k ,k 0 ,k 00 ;k 6=k 0 6=k 00

Solveurs : Glucose, z3, MiniSat, . . .


Solveurs : Choco, Chuffed, OR-Tools, . . .

191/220 191/220 192/220 192/220


Programmes linéaires (PL) Un PL sous forme matricielle
n
Maximiser ∑ cj xj
j =1
n
Chaque programme linéaire peut être décrit sous la forme : s. c. ∑ aij xj ≤ bj , i = 1, . . . , m
j =1
Forme canonique d’un PL : Max c1 x1 +···+ cn xn
xj ≥ 0 j = 1, . . . , n
s. c. a11 x1 +···+ a1n xn ≤ b1
.. .. .. ou
. . .
max{cx | Ax ≤ b, x ≥ 0}
am1 x1 + · · · + amn xn ≤ bm
x1 ≥ 0, x2 ≥ 0 , . . . , xn ≥ 0 où      
a11 ... a1n x1 b1
Un PL requiert toujours :  .. ..   ..   .. 
A= . . , x =  . , b =  . ,
une fonction objectif (linéaire)
am1 ... amn xn bm
m + n contraintes (linéaires) du problème.
n variables xi , i = 1, . . . , n c = (c1 . . . cn )
c désigne le vecteur objectif,
b – le vecteur membre droit,
et Am×n – la matrice des contraintes.

193/220 193/220 194/220 194/220

Historique Espace des solutions admissibles

Soit un PL : max{cx | Ax ≤ b, x ≥ 0}
La programmation linéaire est dans les fondements de la recherche L’espace des solutions admissibles/réalisables/faisables défini par
opérationnelle (RO) ou aide à la décision : propose des modèles conceptuels l’intersection d’un nombre fini de contraintes linéaires est un polyèdre
pour analyser des situations complexes et permet aux décideurs de faire les convexe P = {x | Ax ≤ b, x ≥ 0} ⊆ Rn .
choix les plus efficaces. (P est convexe si x ∈ P, y ∈ P et 0 ≤ λ ≤ 1 alors λx + (1 − λ)y ∈ P).
1940 P. Blackett dirige 1re équipe de RO :
prix Nobel de implantation optimale
physique (1948) de radars de surveillance
1939-45 L. Kantorovich programmation linéaire
1947 G. Dantzig algorithme du simplexe
(le fondateur) " one of the top 10 algorithms of the
century", CSE, 2 :1, 2000
2005 décès de Dantzig convexe non convexe

Aujourd’hui : développement considérable grâce aux solveurs très Un vecteur x ∈ S ⊆ Rn est un point extrême(sommet de S) si on ne peut pas
performants (Gurobi, CPLEX) et langages de modélisation AMPL, JuMP, l’exprimer comme une combinaison convexe de deux autres points de S
Pyomo, PuLP. (@(y ∈ S , z ∈ S , α, 0 < α < 1) tq x = αy + (1 − α)z).
En France : Société Française de Recherche Opérationnelle et d’Aide à la
Décision (ROADEF). Résultat principal : L’optimum, s’il existe, est atteint en au moins un sommet
du polyèdre P.
195/220 195/220 196/220 196/220
Points extrêmes du P ⊂ Rn L’approche graphique pour les programmes linéaires

Il y a un nombre fini de façons de choisir n parmi les m + n contraintes. Le gradient


Rappel :   d’une fonction f (x1 , x2 , . . . , xn ) est donnée par :
∂f  
  ∂x1 c1
n+m (n + m)!   n 
 .  .
n
=
m!n! ∇f (x ) =  . Si f est linéaire f (x ) = ∑ ci xi : ∇f (x ) = 


 .  i =1
.
∂f cn
Ceci donne le nombre des points extrêmes de P qui est une borne supérieure du ∂xn
nombre de solutions de réalisables. Le gradient donne la direction d’acroissance de la fonction f . L’approche graphique :
Exemple du problème du chocolatier : On se déplace selon la direction d’acroissance (de montée) ;
L’optimum est atteint en un point extrême du domaine.
max z = 20x1 + 30x2
(0,14)

x1 + 3x2 ≤ 18 max z = 20x1 + 30x2


x1 + x2 ≤ 8
2x1 + x2 ≤ 14
(0,8)
x1 + 3x2 ≤ 18
 
x1 ≥ 0
(0,6)
(4.8,4.4) x1 + x2 ≤ 8 20
14 ∇z = 30
(3,5)

x2 ≥ 0 2x1 + x2 ≤
x1 0
(6,2) (18,0)
(8,0) ≥
(0,0) (7,0)
x2 ≥ 0
Approche naïve : On est sûr de trouver la solution optimale dans un sommet. Donc il
suffit de parcourir tous les sommets et de prendre le meilleur.
Amélioration dans l’algorithme du simplexe : Parcourir les sommets de P de façon F IGURE 104 – Les valeurs de la fonction objectif sont visualisées par des lignes droites
plus intelligente (on vera cela ultérieurement). parallèles en pointillés.
197/220 197/220 198/220 198/220

L’approche graphique pour les programmes linéaires L’approche graphique pour les programmes linéaires

Résoudre les programmes linéaires ci-dessous par l’approche graphique.


Exercice 1 :
Maximiser z = 2x1 + x2
s. c. 4x1 + 2x2 ≤ 8
x2 ≤ 2
x1 , x2 ≥ 0
Exercice 2 :

Maximiser z = x1 + 2x2
s. c. −x1 + x2 ≤ 2
x2 ≤ 3
x1 , x2 ≥ 0
Exercice 3 :
Maximiser z = 5x1 + 8x2
s. c. x1 + x2 ≤ 2
F IGURE 105 – Un programme linéaire peut avoir : (a) plusieurs points d’optimum ou ; (b) ne pas
x1 − 2x2 ≤ 0
avoir d’optimum. Dans ce deuxième cas la fonction objectif n’est pas bornée.
−x1 + 4x2 ≤ 1
x1 , x2 ≥ 0

199/220 199/220 200/220 200/220


L’algorithme du simplexe : idée géométrique Simplexe – pourquoi ça marche ?
Idée : Parcourir les sommets de P de façon plus intelligente.

Passer itérativement d’un sommet à un sommet adjacent de façon à augmenter la


valeur de la fonction à optimiser jusqu’à trouver un sommet où le maximum est atteint. Grâce à la convexité du polyèdre des contraintes et à la linéarité de la
fonction objectif, il n’y a pas de maxima locaux.
Initialisation : Choisir un sommet x 0 ∈ P, t = 1
Itération t : Soit y 1 , . . . , y k tous les sommets voisins de x t (les sommets reliés
avec x t par une arête).
Si cx t > cy s , s = 1, . . . , k , stop. La solution optimale est x t .
Sinon, choisir un voisin y s , tel que cy s ≥ cx t . Poser x t +1 = y s et
passer à l’itération t + 1.

montagne convexe montagne non convexe

On se déplace d’un sommet à un autre en augmentant la valeur de la


fonction z. Le nombre de sommets et fini (au plus m+
n
n
).
180
210
Si la fonction objectif est bornée, on va finir par trouver le maximum
180

0 140 Si elle ne est pas bornée, on va le détecter.


F IGURE 106 – Deux itérations suffisent dans ce cas pour trouver l’optimum.

201/220 201/220 202/220 202/220

Exemple Interprétation géométrique du parcours effectué par l’algorithme de simplexe

B [94.5]

vertex x1 x2 x3 x4 z
C [102] A 0 0 0 0 0
product1 product 2 product 3 product 4 stock F [129]
A [0] B 0 10.5 0 0 94.5
E [127]
ressource A 2 4 5 7 42 C 0 0 0 6 102
ressource B 1 1 2 2 17 D 17 0 0 0 119
D [119]
ressource C 1 2 3 3 24 E 11.67 0 0 2.67 127
benefice 7 9 18 17 F 13 4 0 0 129
G [135]
G 0 3 6 0 135
Maximize z = 7x1 + 9x2 + 18x3 + 17x4 H 0 0 7 1 143
I 0 0 8 0 144
s. c. 2x1 + 4x2 + 5x3 + 7x4 ≤ 42 H [143]
I [144] J 4 1 6 0 145
x1 + x2 + 2x3 + 2x4 ≤ 17 J [145]
K [146,5] K 3 0 6.5 0.5 146.5
x1 + 2x2 + 3x3 + 3x4 ≤ 24 L 3 0 7 0 147
x1 , x2 , x3 , x4 ≥ 0
L [147]

F IGURE 107 – Les ponts extrêmes du domaine (il y en a douze) et les valeurs de la fonction
objectif correspondantes. Le parcours de l’alg de simplexe est visualisé en rouge. Deux
itérations suffisent pour trouver l’optimum.

203/220 203/220 204/220 204/220


Convergence and complexity of simplex algorithm

One moves from an extreme point to another increasing the value


 of the
n
objective function z. The number of vertices is bounded by m .
If the objective function is bounded, the optimum will be found.
Otherwise, the simplex detects that the objective function is unbounded
(no candidat to enter in the basis).
Complexity issues :
Applications de la programmation linéaire (PL) dans
In 1972 Klee and Minty showed that the worst case complexity of the
simplex is exponential. les graphes
However, it is has been shown that on average the simplex behaves
polynomially (O (min{(m − n)2 , n2 }).
In 1979 the Soviet mathematician Leonid Khachiyan described a
polynomial-time algorithm for linear programming (the ellipsoid method).
However, it is too slow to be of practical interest.
In 1984 Narendra Karmarkar proposed another polynomial-time
algorithm for linear programming (the interior-point method). It is
considered competitive with the simplex method.

205/220 205/220 206/220 206/220

Le problème du plus court chemin dans un graphe vu comme un PL Le problème du PCC dans un graphe vu comme un PL : formulation bis
Rappel :
esu esv euv eut evt
s +1 +1 0 0 0
Algorithm 38 Procédure Bellman-Ford (G,l,s) (summary)
A= t 0 0 0 −1 −1
Require: G=(V,E) directed, weights {le : e ∈ E } with no negative cycles ; vertex s ∈ V u −1 0 +1 +1 0
Ensure: ∀u ∈ V reachable from s, dist (u ) is set to the shortest distance from s to u ; v 0 −1 −1 0 +1
1: dist (s ) ← 0, u ∈ V {s } : dist (u ) ← ∞
F IGURE 108 – G = (V , E , l ), les valeurs en
2: for all edges (u , v ) ∈ E do F IGURE 109 – La matrice d’incidence
rouge sont les longueurs le , e ∈ E.
3: dist (v ) ← min{dist (v ), dist (u ) + l (u , v )} sommet-arc du G.
4: end for
Chaque chemin de s à t peut être représenté par un vecteur x tel que xe = 1 si l’arc e
Approche PL : Soit le graphe G = (V , E , l ) et un sommet s ∈ V . On cherche le plus appartient au chemin, xe = 0 sinon ; et les conditions suivantes :
court chemin (PCC) de s au sommet t ∈ V . Pour chaque sommet v ∈ V on introduit la le sommet s est le début du chemin ;
variable distv ≥ 0 : la distance la plus petite de s à v . xsu + xsv = 1 (34)
min distt (31) le sommet t est la fin du chemin ;
xut + xvt = 1 ⇔ −xut − xvt = −1 (35)
dists = 0 (32) la loi de conservation pour le sommet intermédiaire u :
distv ≤ distu + l (u , v ), ∀(u , v ) ∈ E (33) xsu = xuv + xut ⇔ −xsu + xuv + xut = 0 (36)

La relation (33) est une expression du critère d’arrêt de l’alg. de Bellman-Ford : la loi de conservation pour le sommet intermédiaire v :
l’inégalité du triangle doit être satisfaite pour chaque arc du graphe. xsv + xuv = xut ⇔ −xsv − xuv + xut = 0 (37)
207/220 207/220 208/220 208/220
Le problème du PCC/PLC dans un graphe vu comme un PL Le problème du flot maximum comme un PL

Soit R = (V , E , C ) un graphe connexe orienté (réseau). A ∀ arc u on affecte une


valeur (capacité) cu qui est une borne supérieure du flux sur l’arc.
Soit A la matrice d’incidence sommet-arc. Notons ai la i-ème ligne de A. La loi
Soit deux sommets particuliers s ∈ V (source) et t ∈ V (puits). Considérons le
de conservation pour chaque sommet intermédiaire i peut s’écrire :
graphe G0 = (V , E 0 ) où E 0 = E ∪ {t , s}. L’arc (t , s) est appelé l’arc de retour du
ai x = 0 (39) flot (numéroté 0). Notons m = |E |.
On dit que [φ1 , φ2 , . . . φm ]T est un flot de s à t ssi la loi de conservation du flot est
La forme matricielle du problème est :
vraie en tout ∀u ∈ V \{s, t }, i.e.
notons d ∈ R n le vecteur :
 max(min) ∑ xe le (40) ∑ φ(u ,v ) = ∑ φ(v ,u ) (43)
 +1 i =s e∈E (u ,v )∈E (v ,u )∈E
di = −1 i =t Ax =d (41)
 La valeur du flot est notée par φ0 . Elle est définie par
0 otherwise
∀e ∈ E , xe ∈ {0, 1} (42)
Exemple : ∑ φ(s,v ) = ∑ φ(u ,t ) = φ0 (valeur du flot) (44)
(s,v )∈E (u ,t )∈E

esu esv euv eut evt But : Trouver dans G0 un flot compatible φ0 = [φ0 , φ1 , φ2 , . . . φm ] (c.-à-d.
s +1 +1 0 0 0
A= t 0 0 0 −1 −1 0 ≤ φu ≤ cu , ∀u =∈ E (45)
u −1 0 +1 +1 0
v 0 −1 −1 0 +1 et tel que φ0 soit maximale.

209/220 209/220 210/220 210/220

Le problème du flot maximum comme un PL La forme matricielle du problème du flot maximum (MF)
esu esv euv eut evt
s +1 +1 0 0 0
esu esv euv eut evt
A= t 0 0 0 −1 −1
s +1 +1 0 0 0
u −1 0 +1 +1 0
A= t 0 0 0 −1 −1
v 0 −1 −1 0 +1
u −1 0 +1 +1 0
v 0 −1 −1 0 +1
F IGURE 110 – Un graphe G = (V , E , c ) F IGURE 111 – La matrice d’incidence
avec des capacités ce , e ∈ E. sommet-arc du G. F IGURE 112 – Un graphe G = (V , E , c ) F IGURE 113 – La matrice d’incidence
Le flot est représenté par un vecteur [φ1 , φ2 , . . . φm ]T tel que 0 ≤ φu ≤ cu , ∀u ∈ E et qui satisfait avec des capacités ce , e ∈ E. sommet-arc du G.
les conditions suivantes :
un flot de volume φ0 sort du sommet s ;
Soit ai la ligne i de la matrice A. La loi de conservation pour chaque sommet intermédiaire
φsu + φsv = φ0 (46) i:
un flot de volume φ0 entre dans sommet t ; ai φ = 0 (51)

φut + φvt = φ0 ⇔ −φut − φvt = −φ0 (47) La forme matricielle du problème MF :

la loi de conservation pour le sommet intermédiaire u :


notons d ∈ R n le vecteur max φ0 (52)
φsu = φuv + φut ⇔ −φsu + φuv + φut = 0 (48)
 d φ0 + Aφ = 0 (53)
la loi de conservation pour le sommet intermédiaire v :  −1 i =s
di = +1 i =t φ ≤ c (54)
φsv + φuv = φut ⇔ −φsv − φuv + φut = 0 (49)  0 otherwise φ ≥ 0 (55)
le but est de maximiser le flot total φ0 : φ0 ≥ 0 (56)
max φ0 (50)

211/220 211/220 212/220 212/220


Application : Le problème de mariage (couplage) Le problème de couplage maximum : modèle linéaire
Soit G = (V , E ) un graphe. Définitions :
Un couplage M est un ensemble d’arêtes deux à deux non adjacentes.
Une couverture C est un ensemble de sommets tel que chaque arête est
incidente avec au moins un sommet de C. Soit un graphe biparti G(U ∪ V , E ) et soit n = |V |, k = |U | et m = |E |. Le couplage
Un graphe est dit biparti si son ensemble de sommets peut être divisé en deux sera représenté par des variables binaires xe , ∀e ∈ E , telles que xe = 1 si l’arête e
sous-ensembles disjoints U et V tels que chaque arête ait une extrémité dans U fait partie du couplage, xe = 0 sinon, et sous les conditions suivantes :
et l’autre dans V .
ensemble d’arêtes deux à deux non adjacentes :
Exemple : Myles Dylan James Lily
∀s ∈ U ∑ xsv ≤ 1 (57)
Noah Berkeley Sirius Marlene (s,v )∈E

Isaiah Briar Remus Padma


∀t ∈ V ∑ xut ≤ 1 (58)
(u ,t )∈E

Lamar Rhea Draco Parvati l’objectif est de maximiser le cardinal du couplage :

F IGURE 114 – Groupe 1 F IGURE 115 – Groupe 2


max z = ∑ xuv (59)
(u ,v )∈E

F IGURE 116 – Les affinités entre les membres de deux groupes peuvent être visualisées par des Les équations (57), (58) et (59) représentent un programme linéaire (PL).
graphes bipartis. Tentons à marier ces personnes en satisfaisant les contraintes des couples
compatibles.
Donner le programme linéaire pour le problème de couplage
Montrer que ce problème se réduit au problème du flot maximum.
213/220 213/220 214/220 214/220

Application : Le problème de mariage (couplage) Le problème du flot maximum : un grand classique du domaine

Soit un graphe biparti G(U ∪ V , E ). L’ensemble des arêtes représente les couples
Soit un graphe biparti G(U ∪ V , E ). L’ensemble des arêtes représente les couples compatibles.
compatibles. Il s’agit de trouver le couplage maximum (un couplage contenant le plus Ci-dessous le problème de mariage modélisé comme un problème du flot
grand nombre possible d’arêtes). On peut montrer que ce problème se réduit au maximum. Les capacités sont fixées à 1 partout.
problème du flot maximum.

F IGURE 117 – Il s’agit de marier ces personnes en satisfaisant les contraintes des couples
compatibles. On observe par énumération qu’on ne peut marier que trois couples.

215/220 215/220 216/220 216/220


Le problème du flot maximum : solution Application : Problème des cases admissibles
Dans le graphe ci-dessous à gauche on chercher le nombre maximum de
chemins sommet-disjoints (donc ils ne se croisent pas) de s à t.
La solution est donnée à droite. On trouve trois chemins sommet-disjoints de s à
Problème des cases admissibles
t. Cette valeur correspond à la valeur du couplage maximum.
Soit le tableau T de taille m × n, dont certaines cases sont dites “admissibles” (les
autres sont “non admissibles”. On se donne également m + n entiers positifs ou nuls
l1 , . . . , lm , c1 . . . , cn . Il s’agit d’affecter des nombres entiers aux cases admissibles (et à
celles-ci seulement) de telle sorte que :
la somme des nombres affectés aux cases d’une ligne i soit inférieure ou égale
à li (i = 1, 2, . . . , m).
la somme des nombres affectés aux cases d’une colonne j soit inférieure ou
égale à cj (j = 1, 2, . . . , n).
la somme des nombres affectés aux cases du tableau soit maximum.

1. Formuler le problème des cases admissibles comme un problème de flot


maximum en décrivant le graphe approprié.
2. Formuler le même problème comme un programme linéaire.
F IGURE 118 – On peut vérifier par énumération qu’on F IGURE 119 – La valeur du flot maximum vaut aussi
ne peut marier que trois couples. 3.

217/220 217/220 218/220 218/220

Problème des cases admissibles : continuation Problème des cases admissibles vu comme un problème de flot maximum
On utilise un graphe biparti G = (U ∪ V , E ) où U = {C1, C2, C3, C4, C5} et
Considérons l’instance suivante :
V = {L1, L2, L3, L4} et l’ensemble E contient les cases admissibles. Les capacités
des arcs sortants de S sont données par les bornes sup. associées aux colonnes.
Les capacités des arcs entrants en T sont données par les bornes sup. associées
aux lignes. On considère que les capacités des arcs intermédiaires ne peuvent pas
bloquer la solution (ici 15 par exemple). Le flot maximum trouvé dans ce graphe
donnera la solution du problème des cases admissibles.

F IGURE 120 – Exemple du problème de cases admissibles. Les cases interdites sont en gris.

Taille du tableau : m = 4 et n = 5.
Valeurs des lignes : l1 = 9, l2 = 10, l3 = 15, l4 = 2. F IGURE 121 – Les capacités des arcs sont
écrites entre crochets. Par construction, F IGURE 122 – Un flot de valeur 27 est visualisé
Valeurs des colonnes : c1 = 7, c2 = 5, c3 = 9, c4 = 4, c5 = 8.
chaque flot dans ce graphe est acceptable en bleu. Est-ce que c’est le flot maximum ?
Cases interdites : t13 , t14 , t15 , t22 , t25 , t31 , t33 , t34 , t41 , t42 , t44 . pour le problème des cases admissibles.

219/220 219/220 220/220 220/220

Vous aimerez peut-être aussi