Support de Cours : Algorithmique de graphe & optimisation Enseignante: Naziha Dhibi Niveau: 1ére année II (Ingénieur en Informatique) Horaire: 1.5 heure par semaine Etablissement: École supérieure d’ingénieure privé de Gafsa [email protected] Résumé du cours : Le cours «Théorie des graphes» couvre les notions et les concepts de base de la théorie des graphes, ainsi que les algorithmes fondamentaux d’optimisation pour résoudre le problème de recherche d'un plus court chemin. Objectifs: Introduction aux concepts de la théorie des graphes, des algorithmes fondamentaux sur les graphes, et à leurs applications Définir les Problèmes de coloriage et d’optimisation sur les graphes, algorithmes : arbre de coût minimum, chemins maximaux ou minimaux. Apprendre comment résoudre le problème de recherche d'un plus court chemin par des algorithmes d’optimisation. Présenter les réseaux de transport, flots, circuits, séparateurs; algorithmes de Ford-Fulkerson, Problèmes d’affectation, couplages maximaux. Apprendre comment planifier des projets par les réseaux. 2 Chapitre 1 : Concepts fondamentaux de la théorie des graphes Chapitre 2 : Cheminements et connexités Chapitre 3 : Arbres et arborescences Chapitre 4 : Plus courts chemins Chapitre 5 : Réseaux de transport Bibliographie 3 Chapitre1: Concepts fondamentaux de la théorie des graphes 4 I. Pourquoi la théorie des graphes? Modélisation Plusieurs problèmes dans différentes disciplines : • Réseaux informatique, • Télécommunications, • Chimie, • Applications industrielles, … Un graphe peut représenter simplement la structure, les connexions, les cheminements possibles d’un ensemble complexe comprenant un grand nombre de situations Un graphe est une structure de données puissante pour l’informatique 5 II. Notions et vocabulaire de théorie des graphes 1. Un graphe orienté Un graphe orienté est un couple G(X,U) : X ensemble de sommets ou noeuds (|X|=n ). U ⊂ X × X ensemble d’arcs (|U|=m). 2 4 1 3 5 X = { 1, 2, 3, 4, 5 } U = { (1, 2), (1, 3), (2, 3), (3, 2), (4, 4), (4, 5) } Pour un arc u = (i, j), i est l’extrémité initiale, j l’extrémité finale (ou bien origine et destination). 6 2. Un graphe non orienté Un graphe non orienté est un couple G(X,U) : U ⊂ X × X ensemble d’arrêtes. C'est a dire que (Xi,Xj) est équivalent a (Xj,Xi). Une paire (Xi,Xj) est appelée une arrête, et est représentée graphiquement par Xi 1 5 Par exemple: 4 2 Xj. 6 3 Représente le graphe non orienté G = (X, U) avec X = {1, 2, 3, 4, 5, 6} et A = {(1, 2),(1, 5),(5, 2),(3, 6)} 7 3. Autre Définitions et concepts de base On appelle graphe valué et on note G = (X,U,C) un graphe où on associe une fonction f : U IR appelée coût ou poids des arcs ou valeur des arcs. Le coût d'un arc (i, j) est noté c(i, j) ou Un Graphe est dit symétrique si : Un Graphe est dit complet si : 8 i est successeur ou suivant de j si (j, i) ; l'ensemble des successeurs de i est noté S(i). i est prédécesseur ou précédent de j si (i, j) ; l'ensemble des prédécesseurs de i est noté P(i). Degrés Dans un graphe non orienté, le degré d'un sommet est le nombre d'arêtes incidentes à ce sommet(dans le cas d'un graphe simple, on aura Le degré extérieur de i, , est le nombre de sommets suivants de i ; • Le degré intérieur de i, , est le nombre de sommets précédents de i ; Le degré de i est: 9 Deux sommets sont adjacents (ou voisins) s’ils sont joints par un arc. Deux arcs sont adjacents s’ils ont au moins une extrémité commune. Un arc (i, i) est appelé une boucle. L’ordre d’un graphe est le nombre de ses sommets. Une boucle est un arc ou une arête reliant un sommet à lui-même. Un graphe non-orienté est dit simple s’il ne comporte pas de boucle, et s’il ne comporte jamais plus d’une arête entre deux sommets. 10 Considérons par exemple le graphe orienté suivant : Un chemin élémentaire dans ce graphe est < 1, 4, 2, 5 >. Un chemin non élémentaire dans ce graphe est < 3, 6, 6, 6 >. Un circuit élémentaire dans ce graphe est < 1, 2, 5, 4, 1 >. Un circuit non élémentaire dans ce graphe est < 1, 2, 5, 4, 2, 5, 4, 1 >. 11 i est dit ascendant de j s'il existe un chemin d'origine i et de destination j; j est alors un descendant de i. Soit .On dit qu'un arc de U est incident à A de l'extérieur si son extrémité terminale est dans A et son extrémité initiale dans X\A Il est dit incident à A de l'intérieur s'il est incident à X\A de l'extérieur. 12 4. Exercice d’application Dessiner un graphe non orienté complet à 4 sommets. Quel est le degré des sommets de ce graphe ? Combien d’arêtes possède-t-il ? Généralisez ces résultats à un graphe simple complet ayant n sommets. 13 III. Représentation d’un graphe Il existe deux façons classiques de représenter un graphe en machine: par une matrice d'adjacence ou par un ensemble de listes d'adjacence. 1. Représentation par matrice d'adjacence: Soit le graphe G = (X, U). On suppose que les sommets de X sont numérotés de 1 à n, avec n = . La représentation par matrice d'adjacence de G consiste en une matrice booléenne M de taille n x n telle que: 14 2. Représentation par listes d'adjacence Soit le graphe G = (X, U). On suppose que les sommets de X sont numérotés de 1 à n, avec . La représentation par listes d'adjacence de G consiste en un tableau T de n listes, une pour chaque sommet de X. Pour chaque sommet la liste d'adjacence est une liste chainée de tous les sommets existe un arc ou une arête Autrement dit, , tels qu'il . contient la liste de tous les sommets successeurs de . Les sommets de chaque liste d'adjacence sont généralement chainés selon un ordre arbitraire. Si le graphe est valué (par exemple, si les arêtes représentent des distances), on peut stocker dans les listes d'adjacence, en plus du numéro de sommet, la valuation de l'arête. 15 3. Représentation par matrice d’incidence Pour un graphe orienté G=(X,U), La matrice d'incidence C(n,m) est déterminée tel que : 16 4. Exercice d'application 1. Donnez les représentations par matrice d’adjacence et listes d’adjacence du graphe non orienté suivant : 2. Donnez les représentations par matrice d’adjacence et listes d’adjacence du graphe orienté suivant : 3. Donner la Matrice d’incidence du graphe suivant: x2 V2 V1 x1 V3 V4 x3 17 5. Des définitions Longueur d'un chemin (ou d’une chaîne) :nombre d'arcs du chemin (ou d’arêtes de la chaîne) Distance: la distance entre deux sommets d’un graphe est la plus petite longueur des chaînes, ou des chemins, reliant ces deux sommets. Ordre d'un graphe : nombre de sommets du graphe Diamètre : Le diamètre d’un graphe est la plus longue des distances entre deux sommets. Sous Graphe : le graphe G' est un sous graphe de G si l'ensemble des sommets de G' est inclus dans l'ensemble des sommets de G, et si l'ensemble des arcs de G' est égal au sous-ensemble des arcs de G reliant entre eux tous les sommets de G’ ; on a donc retiré de G certains sommets, et tous les arcs adjacents à ces sommets. 18 Chapitre 2: Cheminements et connexités 19 I. Notions de chemin, chaine, cycle et circuit Un chemin dans un graphe orienté est une suite (x,…,y) de sommets 2 à 2 distincts telle que si i suit j dans cette suite (i,j) est un arc. Un chemin est élémentaire si les sommets qu’il contient sont tous distincts. Une chaîne est un chemin dans un graphe non orienté Un chemin qui se referme sur lui–même est un circuit. Une chaîne qui se referme sur elle–même est un cycle. 20 II. Cheminements et connexités 1. Notions de connexité Graphes non orientés: Un graphe non orienté est connexe si chaque sommet est accessible à partir de n'importe quel autre. Autrement dit, si pour tout couple de sommets distincts il existe une chaine entre ; et . Par exemple, le graphe non orienté suivant n'est pas connexe car il n'existe pas de chaîne entre les sommets a et e. • En revanche, le sous-graphe défini par les sommets {a, b, c, d} est connexe. 21 Un graphe G = (X,U) est dit simplement connexe ou connexe si : il existe une chaîne entre i et j. Graphes orientés: • On retrouve ces différentes notions de connexités dans les graphes orientés, en remplaçant naturellement la notion de chaine par celle de chemin : on parle de graphe fortement connexe au lieu de connexe, de composante fortement connexe au lieu de composante connexe. • un graphe orienté est fortement connexe si chaque sommet est accessible à partir de n'importe quel autre. Autrement dit, si pour tout couple de sommets distincts il existe un chemin de vers et un chemin de vers • Par exemple, le graphe de gauche ci-dessous est fortement connexe, tandis que celui de droite ne l'est pas : 22 2. Exercices Exercice 1 Trois pays envoient chacun à une conférence deux espions; chaque espion doit espionner tous les espions des autre pays. 1) Représentez cette situation par un graphe d’ordre 6 dans lequel chaque arête reliant i et j signifie que i espionne j, et j espionne i. 2) Ce graphe est-il complet? Est-il connexe? 3) a- Quelle est le degrés de chaque sommet? b- En déduire le nombre d’arêtes du graphe. 23 Exercice 2 Etant donné un groupe de dix personnes, le tableau suivant indique les paires de personnes qui ont une relation d'amitié. 1) Représentez cette situation par un graphe d'ordre 10 dans lequel une arête entre les sommets i et j signifie qu'il y a une relation d'amitié entre i et j. 2) Ce graphe est-il complet ? connexe ? 3) Si l'adage "les amis de nos amis sont nos amis" était vérifié, que pourrait-on en conclure sur la structure du graphe ? 24 III. Notion de graphe eulérien 1. Définition Dans un graphe non orienté, une chaine eulérienne est une chaine qui emprunte une et une seule fois chaque arête du graphe. De même, un cycle eulérien est un cycle qui emprunte une et une seule fois chaque arête du graphe. Un graphe comportant une chaine ou un cycle eulérien est appelé graphe eulérien. Un graphe (simple ou multiple) connexe admet un cycle eulérien si et seulement s’il n’a pas de sommet de degré impair. 25 Un graphe (simple ou multiple) connexe admet une chaine eulérienne entre deux sommets u et v si et seulement si le degré de u et le degré de v sont impairs, et les degrés de tous les autres sommets du graphe sont pairs. On retrouve ces différentes notions sur les graphes orientés : un chemin eulérien est un chemin qui emprunte une et une seule fois chaque arc du graphe. De même, un circuit eulérien est un circuit qui emprunte une et une seule fois chaque arc du graphe. 26 2. Exercices d’application Exercice1 • Montrer que le graphe suivant est eulérien 27 Exercice 2 On considère le graphe G suivant: 1- Justifier que G n’admet pas un cycle eulérien mais qu’il admet des chaînes eulériennes. 2- Déterminer une chaîne eulérienne dans G. 28 Exercice 3 Pour les graphes suivants dites s’ils admettent au moins une chaîne eulérienne et dans l’affirmatique indiquez en une 4-3-2-5-1 29 Exercice 4 30 IV. Notion de graphe hamiltonien Dans un graphe simple non orienté comportant n sommets, une chaine hamiltonienne est une chaine élémentaire de longueur n- 1. Autrement dit, une chaine hamiltonienne passe une et une seule fois par chacun des n sommets du graphe. On appelle cycle hamiltonien un cycle élémentaire de longueur n. Un graphe possédant un cycle ou une chaine hamiltonienne sera dit graphe hamiltonien. Par exemple, le graphe suivant possède un cycle hamiltonien (< a; e; b; d; c; a >) En revanche, le graphe suivant ne possède pas de cycle hamiltonien, mais possède une chaine hamiltonienne (< a; b; e; d; c >). 31 V. Coloriage d’un graphe 1. Coloriages Un coloriage du graphe G est une manière d’attribuer une couleur à chacun de ses sommets. On dit qu’un coloriage est propre si deux sommets reliés par une arête ont des couleurs différentes. Le graphe G étant fini, Remarque : le problème du coloriage d’un graphe avec un nombre limité de couleurs est un problème combinatoire (on dit qu’il s’agit d’un problème NPcomplet). Cela signifie que tout algorithme résolvant ce problème de façon exacte pourra prendre un temps exponentiel par rapport au nombre de sommets du graphe (de l’ordre de 2n pour n sommets). Le problème de déterminer le nombre chromatique d’un graphe est également exponentiel, et est en fait encore plus difficile. 32 2. Nombre chromatique On peut définir le nombre chromatique X(G) d’un graphe fini G comme le plus petit nombre n tel que G puisse être colorié avec n couleurs. Le nombre chromatique est le plus petit nombre de couleurs permettant de colorier tous les sommets du graphe sans que deux sommets adjacents soient de la même couleur. Le nombre chromatique d'un graphe est inférieur ou égal au plus grand degré de ses sommets k majoré par 1: X(G)< K + 1 Le nombre chromatique d'un graphe est supérieur ou égal à l'ordre de tous ses sous graphes complets. 33 3. Exercices Exercice 1 1. A quoi ressemble un graphe de nombre chromatique 1 ? 2. Quel est le nombre chromatique d’un graphe bipartite ? 3. Quel est le nombre chromatique d’un graphe complet ? Correction: 1. Dès qu’il y a une arête, il faut au moins deux couleurs. Un graphe de nombre chromatique 1 est donc un graphe sans arêtes. 2. Soit un graphe bipartite (on suppose qu’il a au moins une arête), et soient I et J les deux ensembles de sommets indépendants de ce graphe. Alors on peut colorier tous les éléments de I avec une même couleur, et tous les éléments de J avec une autre couleur. Le nombre chromatique d’un graphe bipartite est donc égal à 2. 3. Dans un graphe complet, deux sommets quelconques sont reliés. Son nombre chromatique est donc égal au nombre de sommets 34 Exercice 2 Colorier un graphe en respectant les contraintes suivantes ? Utiliser le minimum de couleurs ; Faire en sorte que deux sommets ayant une arc commune soient coloriés de deux couleurs différentes... 35 4. Algorithme de Welch-Powell: algorithme glouton Colorer un graphe c'est colorer les sommets de telle façon que deux sommets distincts et adjacents aient toujours des couleurs différentes. • Méthode : 1- Ranger les sommets par ordre décroissant de leurs degrés ; 2- Choisir une couleur ; 3- Affecter cette couleur au premier sommet de la liste non encore coloré ; 4- Suivre la liste en attribuant cette même couleur à tout sommet qui: - n'est pas encore coloré ; - et qui n'est pas adjacent à un sommet coloré avec cette couleur. Continuer jusqu'à ce que la liste soit finie. Si tous les sommets ne sont pas colorés, choisir une couleur qui n'est pas encore utilisée et recommencer les étapes 3 et 4 ; Continuer tant que chaque sommet n'est pas coloré. 36 VI. Exercices d’application Exercice 1 Déterminer le nombre chromatique des graphes suivants: Correction Tout graphe contenant un triangle (K3) ne peut être colorié en moins de trois couleurs. Ces graphes ont respectivement pour nombre chromatique 3, 2 et 3 37 Exercice 2 Déterminer le nombre chromatique des graphes suivants: 38 Exercice 3 Recopier le graphe ci-dessous et utiliser l’algorithme de welch-Powell pour le colorier. 39 Exercice 4 T est le graphe ci-contre: 1) On note G (T) le nombre chromatique de T. a- Pourquoi le sous graphe constitué des sommets C, D, E et F est complet. b- Démontrer que 4 ≤ G (T) ≤ 6. c- Déterminer la valeur de G (T) 2) On considère un groupe d’élèves notés A, B, C, D, E, F et G. Pour un exposé, les élèves se mettent en équipes, mais il faut respecter les incompatibilités entre les élèves. Dans le tableau ci-après, chaque croix indique une incompatibilité entre les élèves correspondants. a- Si l’on décide de modéliser ce tableau d’incompatibilité par le graphe T, quel sens faut-il donner à l’existence d’une arrête entre deux sommets? b- Combien d’équipes faudra-t-il créer en minimum? Proposer une répartition des élèves en équipes : (une équipe peut comporter un seul élève). 40 Exercice 5 41 Exercice 6 Dans la ville de GRAPHE, on s’intéresse aux principales rues permettant de relier différents lieux ouverts au public, à savoir la mairie (M), le centre commercial (C), la bibliothèque (B), la piscine (P) et le lycée (L). Chacun de ces lieux est désigné par son initiale. Le tableau ci-dessous donne les rues existant entre ces lieux. a) Dessiner un graphe représentant cette situation. b) Montrer qu’il est possible de trouver un trajet empruntant une fois et une seule toutes les rues de ce plan. Justifier? c) Proposer un tel trajet. d) Est-il possible d’avoir un trajet partant et arrivant du même lieu et passant une fois et une seule par toutes les rues ? 42 Exercice 7 Soit le graphe ci-dessous constitué des sommets A, B, C, D, E, F et G. 1) Quel est son ordre et le degré de chacun de ces sommets ? 2) Construire un tableau indiquant les distances entre deux sommets de G : 3) En déduire le diamètre de ce graphe. 4) Donner un sous-graphe complet de G d’ordre 3. Qu’en déduire pour le nombre chromatique de G ? 5) Proposer une coloration du graphe G et en déduire son nombre chromatique. 6) Donner la matrice M associée à G (vous numéroterez les lignes et les colonnes dans l’ordre alphabétique). 43 Chapitre 3:Arbres et arborescences 44 I. Définition Les arbres et les arborescences sont des graphes particuliers très souvent utilisés en informatique pour représenter des données. Etant donné un graphe non orienté comportant n sommets, les propriétés suivantes sont équivalentes pour caractériser un arbre : 1. G est connexe et sans cycle, 2. G est sans cycle et possède n -1 arêtes, 3. G est connexe et admet n -1 arêtes, 4. G est sans cycle, et en ajoutant une arête, on crée un et un seul cycle élémentaire, 5. G est connexe, et en supprimant une arête quelconque, il n’est plus connexe, 6. Il existe une chaine et une seule entre 2 sommets quelconques de G. 45 Par exemple, le graphe suivant est un arbre : On appelle forêt un graphe dont chaque composante connexe est un arbre. Un arbre est un graphe non orienté connexe sans cycle simple 46 Dans un graphe G=(X,U), on appelle racine, un point a tel que tout autre sommet du graphe puisse être atteint par un chemin issu de a. Une racine n’existe pas toujours. La racine r de l'arbre est l'unique nœud ne possédant pas de parent 47 Tout sommet x qui n’est pas la racine a. un unique parent, noté parent(x) (appelé père parfois) 0 ou plusieurs fils. fils(x) désigne l’ensemble des fils de x Si x et y sont des sommets tels que x soit sur le chemin de r à y alors - x est un ancêtre de y - y est un descendant de x Un sommet qui n’a pas de fils est une feuille Quand il n’y a pas d’ambiguïté, on regarde les arêtes d’un arbre comme étant orienté de la racine vers les feuilles 48 1 est la racine 9,10,6,3,11,12,8 sont les feuilles 11 est un descendant de 4, mais pas de 2 2 est un ancêtre de 10 49 1 est la racine 2,3,4 sont à la profondeur 1 5,6,7,8 à la profondeur 2 La hauteur de 2 est 2, celle de 9 est 4, celle de 3 est 2, celle de 1 est 1. 50 Exercice On considère le graphe non orienté suivant : Combien faut-il enlever d’arêtes à ce graphe pour le transformer en arbre ? Donnez un graphe partiel de ce graphe qui soit un arbre. Correction Le graphe comporte 7 sommets et 11 arêtes. Pour le transformer en arbre il faudra donc enlever 5 arêtes. Par exemple, les arêtes (f; g), (b; g), (b; c), (b; d) et (g; c). 51 II. Les Arborescences Une arborescence est un graphe orienté sans circuit admettant une racine telle que, pour tout autre sommet , il existe un chemin unique allant de vers . Si l'arborescence comporte n sommets, alors elle comporte exactement n-1 arcs. Par exemple, le graphe suivant est une arborescence de racine a : 52 Exercice L’ile du Nivéou, en Camargue, se consacre à la culture du riz. Sur cette ile se trouvent 9 champs entourés de murs et disposés de la façon suivante : La culture du riz suppose que l’on puisse périodiquement inonder l’ensemble des champs. Cela est réalisé en ouvrant des vannes placées dans les murs séparant les champs et le Rhône ou les champs entre eux. Etant donné que l’installation d’une vanne est coûteuse, il s’agit de déterminer le nombre minimum de vannes et leur emplacement pour pouvoir, quand on le désire, inonder tous les champs. 53 Correction : Pour résoudre ce problème, on peut considérer le graphe non orienté comportant un sommet pour chaque intersection de mur, et une arête pour chaque mur : 54 En considérant que lorsqu’on place une vanne sur un mur, on supprime l’arête correspondante dans le graphe, le problème revient à supprimer des arêtes jusqu’à ce que le graphe ne comporte plus de cycles (autrement dit, placer des vannes jusqu’à ce qu’il n’y ait plus de champ entouré de murs sans vanne). Comme on souhaite poser le moins de vannes possible, on cherche un graphe partiel sans cycle tel que si l’on rajoute une arête on crée un cycle : selon la proposition 4, il s’agit d’un arbre. Ici, étant donné que le graphe a 12 sommets et 20 arêtes, l’arbre devra posséder 12-1= 11 arêtes (selon la proposition 2), et on devra donc installer 2011=9 vannes. On obtiendra (par exemple) l’arbre suivant : 55 III. Le problème de recherche d'un arbre de poids minimum Le problème de recherche d'un arbre de poids minimum (minimum tree of pods) Si on associe à chaque arc d'un graphe G=(X,U) une valeur (un poids). Le problème de l'arbre de coût minimum consiste à trouver un sous graphe qui est un arbre, dont la somme des poids des arcs est minimale. Par exemple: minimiser le coût d'installation des lignes téléphoniques dans une localité peut être représenté comme un problème de recherche d'un arbre de coût minimum. En effet, on veut relier tous les points de la localité sans avoir de lignes inutiles, d'où la recherche d'un arbre. Ensuite on veut avoir un coût d'installation minimum, alors on associera à chaque possibilité d'installation d'une ligne le coût nécessaire et on cherchera à minimiser le coût total de toute l'installation. 56 En 1956, Kruskal a donné un algorithme qui permet de résoudre ce problème. Algorithme de kruskal pour construire un arbre de poids minimum: 57 1. Algorithme de kruskal Le principe: L'idée de l'algorithme de Kruskal est tout d'abord de numéroter les arcs par ordre des poids croissants. Ensuite de construire progressivement l'arbre A en rajoutant dans leurs ordre, les arcs un par un. Un arc est ajouté seulement si son adjonction à A ne détermine pas de cycle, c'est-à-dire si A ne perd pas sa notion d'arbre, sinon on passe à l'arc suivant dans l'ordre de la numérotation. Application: Soit G=(X,U) un graphe connexe représentant le projet d'installation de lignes téléphoniques. Les poids représentent le coût d'installation des lignes. On veut donner un plan d'installation minimisant le coût total de l'installation. 58 2. Algorithme de Prim Principe: Construction incrémentale d'un arbre de poids minimum: Au départ, un sommet est choisi arbitrairement, ce sommet constitue l'arbre couvrant de poids minimum. Parmi toutes les arêtes incidentes à ,choisir celle de plus faible poids Le nouvel arbre obtenu est constitué des sommets et . et de l'arête Tant qu'il reste des sommets en dehors de l'arbre : Parmi l'ensemble des arêtes incidentes aux sommets de l'arbre et ayant une extrémité hors de l'arbre, choisir celle dont le poids est le plus faible. On construit un arbre en partant d'un sommet initial et en ajoutant chaque fois une arête du poids min qui le touche par une extrémité. 59 60 61 3. Parcours de graphes Beaucoup de problèmes sur les graphes nécessitent que l’on parcourt l’ensemble des sommets et des arcs/arêtes du graphe. On étudie dans la suite les deux principales stratégies d’exploration : Le parcours en largeur consiste à explorer les sommets du graphe niveau par niveau, à partir d’un sommet donné. Le parcours en profondeur consiste, à partir d’un sommet donné, à suivre un chemin le plus loin possible puis à faire des retours en arrière pour reprendre tous les chemins ignorés précédemment. 62 a. Arborescence couvrante associée à un parcours On parcourt un graphe à partir d'un sommet donné . Ce parcours va permettre de découvrir tous les sommets accessibles depuis sommets pour lesquels il existe un chemin depuis , c'est à dire tous les . En même temps que l'on effectue ce parcours, on construit l'arborescence de découverte des sommets accessibles depuis de , appelée arborescence couvrante . Cette arborescence contient un arc été découvert à partir du sommet entrer si et seulement si le sommet (autrement dit, c'est le sommet a qui a fait dans la file d'attente). Ce graphe est effectivement une arborescence, dans la mesure où chaque sommet a au plus un prédécesseur, à partir duquel il a été découvert. La racine de cette arborescence est parcours , le sommet à partir duquel on a commencé le 63 b. Parcours en profondeur (Depth-FirstSearch) Un parcours en profondeur (DFS) d’un graphe G: Un parcours en profondeur (DFS) d’un graphe G Visite tous les sommets et toutes les arêtes de G Détermine si G est connexe ou non Calcule les composantes connexes de G Calcule une forêt couvrante pour G L’algorithme de parcours en profondeur (DFS) d’un graphe G prend un temps O(n+m) L’algorithme de parcours en profondeur peut être étendu pour résoudre d’autres problèmes sur les graphes: Trouver un chemin entre 2 sommets Trouver un cycle dans un graphe 64 65 Propriétés du parcours en profondeur: Propriété 1: DFS(G,S) visite tous les sommets et les arêtes de la composante connexe de s Propriété 2: Les arêtes sélectionnées lors du parcours DFS(G,s) forme un arbre couvrant pour la composant connexe de s 66 Complexité en temps du parcours en profondeur: Étiquetter ou "lire" l'étiquette d'un sommet ou d'une arête Ο(1) Chaque sommet est étiquetté deux fois une fois "non exploré " O(n) une fois "visité " Chaque arête est étiquettée deux fois une fois "non explorée " O(m) une fois "sélectionnée" ou "de retour " L'opération incidents (U) est appelée une fois pour chaque sommet U Si notre graphe est représenté par une liste d'adjacences, la complexité en temps de l'algorithme DFS est O(m+n) 67 c. Applications du parcours en profondeur On peut étendre l’algorithme DFS en un algorithme pour trouver un chemin entre 2 sommets donnés v et z. L’idée est d’appeler DFS(G,v), sur v le premier sommet. On utilise une pile P qui garde en mémoire un chemin entre le sommet de départ et le sommet courant. Quand le sommet final z est atteint on retourne le contenu de la pile qui contient le chemin cherché. 68 On peut étendre l’algorithme DFS en un algorithme pour trouver un cycle dans un graphe (s’il en existe un). On utilise une pile P qui garde en mémoire un chemin entre le sommet de départ v et le sommet courant. Si on trouve une arête de retour vers v, on retourne le cycle trouvé qui est contenu dans la pile. 69 Parcours en profondeur Ordre de visite préfixé On marque quand on atteint le nœud. 1, 2, 5, 9, 10, 6, 3, 4, 7, 11, 12, 8 Ordre de visite postfixé On marque quand on quitte le nœud. 9, 10, 5, 6, 2, 3, 11, 12, 7, 8, 4, 1 70 Exercices d'application Exercice 1 Indiquer l’ordre de visite et de post-visite des sommets du graphe non orienté ci- dessous dans un parcours en profondeur. 71 Exercice 2 Existe-t-il un graphe G de huit sommets, numérotés de 1 à 8, de façon que, dans un parcours en profondeur de G l’ordre de visite des sommets soit 1,2,3,4,5,6,7,8 et l’ordre de post-visite soit: i) 5, 3, 2, 4, 7, 6, 8, 1? ii) 4, 3, 5, 2, 7, 6, 8, 1? S’il y a une solution, est-elle unique? 72 d. Parcours en largeur (Breadth-First Search) Un parcours en largeur (BFS) d’un graphe G Visite tous les sommets et toutes les arêtes de G Détermine si G est connexe ou non Calcule les composantes connexes de G Calcule une forêt couvrante pour G L’algorithme de parcours en largeur (BFS) d’un graphe G prend un temps O(n+m) L’algorithme de parcours en largeur peut être étendu pour résoudre d’autres problèmes sur les graphes: Trouver le plus court chemin entre 2 sommets Trouver un cycle simple dans un graphe 73 74 Propriétés du parcours en largeur: Propriété 1: BFS(G,s) visite tous les sommets et les arêtes de la composante connexe de s Propriété 2: Les arêtes sélectionnées lors du parcours DFS(G,s) forme un arbre couvrant pour la composant connexe de s Propriété 3: Pour tous sommets u dans L ,le chemin de s à u suivant les arêtes de l’arbre couvrant contient exactement i arêtes et i+1 sommets. C’est un plus court chemin de s à u. 75 • Complexité en temps du parcours en largeur: Étiquetter ou “lire” l’étiquette d’un sommet ou d’une arête O(1) Chaque sommet est étiquetté deux fois: une fois “non exploré O(n) une fois “visité Chaque arête est étiquettée deux fois une fois “non explorée une fois “sélectionnée” ou “de traverse” O(m) Chaque arête est insérée au plus une fois dans un ensemble Li L’opération Incidents (U) est appelée une fois pour chaque sommet U Si notre graphe est représenté par une liste d’adjacences, la complexité en temps de l’algorithme DFS est O(m+n). 76 e. Applications du parcours en largeur 77 Exemple En fait, c’est une généralisation des parcours hiérarchiques des arbres (on regarde la racine puis les voisins, puis les voisins des voisins, . . .). On va donc gérer la variable à traiter comme une file FIFO (First In First Out). Pour parcourir le graphe en largeur, on va ajouter deux règles : on fait défiler les sommets dans l’ordre des numéros ; on examine les successeurs d’un sommet dans le même ordre. On commence par 1 et ses voisins 2, 4 et 5. On regarde le plus petit voisin, c’est 2. On regarde les voisins de 2, ce sont 3 et 4. On a déjà vu 4 (il est déjà dans la pile). On ne tient donc pas compte de l’arc(2,4). Le sommet suivant est 4. Son seul voisin est 3, que l’on a déjà vu. Le sommet suivant est 5. Son seul voisin est 4, que l’on a déjà empilé ́. Le sommet suivant est 3. Le seul voisin, qui est 1, a déjà été traité. La file est alors vide. On remonte donc `a un sommet non-atteint, dans l’ordre des numéros. On traite donc le sommet 6. Ses voisins sont 7 et 8. On traite le sommet 7 dont le seul voisin est 5, qui a déjà été traité. On passe ensuite au sommet 8 dont les voisins 4, 6 et 7 ont tous déjà été traités. La file est alors vide et on a traité tous les sommets. 78 DFS vs BFS 79 IV. Exercice d'application Exercice1 Effectuez un parcours en largeur/profondeur d’abord en partant de 0 pour construire une arbre. 80 Exercice 2 Effectuez un parcours en largeur en partant de 5 pour construire une arbre. 81 Chapitre 4: Plus courts chemins 82 I. Définitions Un automobiliste souhaite découvrir le plus court chemin possible (en nombre de kilomètres) pour circuler de Strasbourg à Bordeaux. Etant donnée une carte routière de France, avec les distances de chaque portion de route, comment peut-il déterminer la route la plus courte ? Un parcours en largeur du graphe associé à la carte de France ne permettra pas de résoudre ce problème : il permettra de trouver l’itinéraire comportant le moins d’étapes (traversant le moins de sommets), mais cet itinéraire n’est pas nécessairement le plus court en nombre de kilomètres. Une possibilité consiste à énumérer tous les chemins entre Strasbourg et Bordeaux, additionner les distances pour chacun d’eux, et distinguer le plus court. Cependant, on s’aperçoit rapidement que, même en n’acceptant pas les chemins qui contiennent des circuits, il existe des milliers de possibilités, dont la plupart ne valent même pas la peine d’être considérées. 83 Soit G = (S;A) un graphe orienté valué tel que la fonction Cout: A R associe à chaque arc de A un coût réel cout • Le coût d'un chemin p =< S0, S1; S2, ... ... ; Sk > est égal à la somme des coûts des arcs composant le chemin, c'est-à-dire: Le coût d'un chemin sera aussi appelé poid du chemin. Le coût (ou poid) d'un plus court chemin entre deux sommets et est noté est défini par : 84 Considérons par exemple le graphe valué orienté suivant : on a δ(a; b) = 3, δ(a; e) = 5, δ(a; c) = 9 et δ(a; d) = 11. 85 II. Le problème de recherche d'un plus court chemin Conditions d'existence d'un plus court chemin : s'il existe un chemin entre deux sommets u et v contenant un circuit de coût négatif, alors (u; v) = -oo, et il n'existe pas de plus court chemin entre u et v. Un circuit négatif est appelé un circuit absorbant. Considérons par exemple le graphe orienté valué suivant Le chemin < s ; e; f; e;f; g > contient le circuit < e; f; e > de coût négatif -3. Autrement dit, à chaque fois que l'on passe dans ce circuit, on diminue de 3 le coût total du chemin. Par conséquent, et il n'existe pas de plus court chemin entre s et g. 86 On va maintenant étudier 2 algorithmes qui permettent de résoudre des problèmes de recherche de plus courts chemins à origine unique : L'algorithme de Dijkstra résout ce problème lorsque tous les coûts sont positifs ou nuls, L'algorithme de Ford-Bellman résout ce problème lorsque les coûts sont positifs, nuls ou négatifs, sous réserve qu'il n'y ait pas de circuit absorbant (de coût négatif). Les deux algorithmes procèdent de la même façon, selon une stratégie dite "gloutonne". l'idée est d'associer à chaque sommet qui une valeur représente une borne maximale du coût du plus court chemin entre et 87 C'est-à-dire • L'algorithme ainsi au départ: diminue alors progressivement les valeurs d[si] associées aux différents sommets, jusqu'à ce qu'on ne puisse plus les diminuer, autrement dit, jusqu' à ce que 88 Pour réduire les valeurs de d, on va répétitivement examiner chaque arc graphe, et observer si on ne peut pas améliorer la valeur de Cette opération de diminution est appelée relâchement de l'arc • Les du en passant par , et s'écrit algorithmes de Dijkstra et Bellman-Ford découlent tous les deux par relâchements successifs d’arcs. La différence entre les deux est que dans l’algorithme de Dijkstra, chaque arc est relâché une et une seule fois, tandis que dans l’algorithme de Bellman-Ford, chaque arc peut être relâché plusieurs fois. 89 III. Algorithme de Dijkstra L'algorithme de Dijkstra ne marche pas toujours quand le graphe contient des arcs dont les coûts sont négatifs. Considérons par exemple le graphe suivant, où l'on cherche les plus courts chemins à partir du sommet 1. On voit immédiatement que la plus courte distance entre les sommets 1 et 2 est 2, alors que l'algorithme de Dijkstra donne 3. 90 Algorithme de MOORE-DUKSTRA : énoncé Les données un graphe dont les arcs sont valués par des nombres positifs, un sommet s racine du graphe à partir duquel on veut déterminer les plus courts chemins aux autres sommets, pour chaque sommet x de X, l'ensemble succ(x) de ses successeurs. Initialisation Pour tous les sommets x dans S Poser , poser Corps de l'algorithme 91 Les résultats Pour chaque sommet, est égal à longueur d'un plus court chemin de S à X. Père(y) = x indique que le sommet x est le prédécesseur de y sur le plus court chemin de s à y. En comparaison avec l'algorithme de Dijkstra l'algorithme de Bellman-Ford permet de trouver les plus courts chemins à origine unique dans le cas où le graphe contient des arcs dont le coût est négatif, sous réserve que le graphe ne contienne pas de circuit absorbant (dans ce cas, l'algorithme de Bellman-Ford va détecter l'existence de circuits absorbants). 92 IV. Algorithme de Bellman-Ford Algorithme de Bellman Données • Un graphe valué sans circuit dont les sommets sont numérotés dans l'ordre du tri topologique • Le sommet de départ s est racine du graphe et il est numéroté 1 •On connaît pour chaque sommet x ses prédécesseurs Pred(x). Initialisation Poser λ(1) = 0 93 Corps de l'algorithme POUR x de 2 à n FAIRE (on examine les prédécesseurs du sommet x) Calculer λ (x) = min ( λ(y) +l(y,x)) pour y dans Pred(x) (on parcourt les prédécesseurs de x, on calcule ( λ(y) + l(y,x) et on prend le minimum de ces quantités) POSER père(x) = y avec y prédécesseur y de x pour lequel ce minimum est atteint FINFAIRE FINPOUR FIN Résultats λ(x) est égale à la longueur d'un plus court chemin de s à x. Père(x) détermine le sommet prédécesseur de x sur le plus court chemin de s à x. 94 L'algorithme de BelIman-Ford fonctionne selon le même principe que celui de Dijkstra : on associe à chaque sommet une valeur borne maximale du coût du plus court chemin entre qui représente une et L'algorithme diminue alors progressivement les valeurs . en relâchant les arcs. Contrairement à Dijkstra, chaque arc va être relâché plusieurs fois. On relâche une première fois tous les arcs ; après quoi, tous les plus courts chemins de longueur 1, partant de , auront été trouvés. On relâche alors une deuxième fois tous les arcs ; après quoi tous les plus courts chemins de longueur 2, partant de , auront été trouvés ... et ainsi de suite... Après la kième série de relâchement des arcs, tous les plus courts chemins de longueur k, partant de , auront ete trouves. 95 V. Synthèse 96 VI. Exercices d'application Exercice1 Cherchons les plus courts chemins d’origine A dans ce graphe: 97 Exercice 2 • Cherchons les plus courts chemins d’origine E dans ce graphe: 98 Exercice 3 Déterminer l’autoroute reliant A et I de cout minimum (Application d’un algorithme) 99 Exercice 4 • Cherchons les plus courts chemins d’origine 1 dans ce graphe 100 Exercice 5 • Cherchons les plus courts chemins d’origine S dans ce graphe en utilisant l’algorithme de Dijkstra 101 Correction 102 Algorithme de Bellman Il s'agit d'abord de numéroter les sommets du graphe dans l'ordre du tri topologique. Num(s) = 1 num(c) = 2 num(a) = 3 num(b) = 4 num(d) = 5 num(e) = 6 Pred(s) = ∅, Pred(c) = {s}, Pred(a) = {s, c}, Pred(b) = {a, c}, Pred(d) = {a, b, c}, Pred(e) = {b, d} On calcule successivement : λ(s) = 0, λ(c) = λ(s) + l(s, c) = 0+ 1 = 1, père(c) = s λ(a) = Min(λ(s) + l(s, a), λ(c) + l(c, a)) = min(0 + 5, 1 + 2) = 3 père(a) = c λ(b) = Min(λ(a) + l(a, b), λ(c) + l(c, b)) = min(3 + 1,1 + 2) = 3 père(b) = c λ(d) = Min(λ(a) + l(a, d), λ(b) + l(b, d), λ(c) + l(c, d)) = min(3 + 2, 3 + 1, 1 + 5) = 4, père(d )= b λ(e) = Min(λ(b) + l(b, e), λ(d) + l(d, e)) = min(3 + 4, 4 + 2) = 6, père(e) = d 103 Ces résultats sont reportés sur le graphique suivant : Les longueurs des plus courts chemins sont dans les étiquettes et les arcs en gras montrent pour chaque sommet l'arc le reliant à son père. 104 Exercice 6 On recherche les plus courts chemins à partir du sommet a. 105 Exercice 7 Considérons l’exemple suivant. On recherche les plus courts chemins à partir du sommet a. 106 Chapitre 5: Le problème central de l'ordonnancement 107 I. Introduction La réalisation de projets complexes comme par exemple la construction d’un barrage, l’installation d’une nouvelle chaîne de production, l’installation d’un nouveau système d’information,… requiert une planification au préalable et un contrôle au cours de l’exécution. Les problèmes liés à ces objectifs sont des problèmes d’ordonnancement . On cherche un ordre d’exécution des différentes tâches de manière à optimiser un certain critère Calendrier d’exécution 108 Résoudre un pb d’ordonnancement = trouver l’ordre et le calendrier suivant lequel devront être exécutées les tâches afin d’optimiser un projet donné en tenant comptes d’un certain nbr de contraintes Les contraintes sont de type: Potentiel : contraintes d’antériorité (ou postériorité), contrainte de localisation temporelle Disjonctif: La non réalisation simultanée de 2 tâches Cumulatif : les moyens disponibles (hommes, machines, budgets…) 109 II. Le problème central de l'ordonnancement Les seules contraintes considérées dans ce problème sont les contraintes d’antériorité On cherche à réaliser un ensemble de tâches appelé projet, chaque tâche est caractérisée par sa durée et par les contraintes qui la lie aux autres tâches Objectif :Finir le projet le plus tôt possible La représentation de ce problème pour un graphe permet d’identifier les tâches prioritaire et donne pour chaque tâche le temps d’exécution permettant de finir le projet au plus tôt. 110 III. Le graphe potentiel-Tâches À partir d’un prj donné on construit le graphe suivant: À chaque tâche i on associe un sommet du graphe On définit l’arc (i,j) si la tâche i précède la tâche j La longueur de l’arc (i,j) représente la durée d’exécution de la tâche i On rajoute deux sommets fictifs : dp correspondant au début du projet et reliés aux sommet sans précédents fp correspondant à la fin du projet et relié aux sommet sans suivants Le graphe ainsi construit doit être sans circuit 111 Exemple : Situation où l’on doit construire une maison 112 Le graphe potentiel-Tâches 113 1. Exercice 114 Pour chaque tâche, on définit la date du début d’exécution au plus tôt et au plus tard permettant de finir le projet au plus tôt Algorithmes: 1- Calcul des dates au plus tôt 1.Prendre les sommet par rang 2. 115 116 117 2. Définitions 1- On appelle marge de la tâche i, 2- Les tâches dont les marges sont nulles sont dites tâches critiques 3- On appelle chemin critique, tout chemin de dp à fp passant par les sommets critiques et de longueur égale à la durée min du projet. Remarques: 1- En cas de présence d’un circuit négatif, pour calculer les il faut calculer la longueur du plus long chemin μ du i à fp puis 2- Si un retard est pris sur une des tâches critiques, la durée minimale du projet sera augmentée d’autant. 118 119 3. Le diagramme de gantt a. Principe: On représente au sein d’un tableau, en ligne les différentes tâches et en colonne les unités de temps( exprimées en mois, semaines, jours, heures…) La durée d’exécution d’une tâche est matérialisée par un trait au sein du diagramme. b. Réalisation: 1. On détermine les différentes tâches (ou opérations) à réaliser et leur durée. 2. on définit les relations d’antériorité entre tâches. 3. on représente d’abord les tâches n’ ayant aucune antériorité, puis les tâches dont les tâches antérieures ont déjà été représentées, et ainsi de suite… 4. on représente par un trait parallèle en pointillé à la tâche planifiée la progression réelle du travail. 120 c. Exemple Tracer le graphe potentiels-Tâches associé, ainsi que le diagramme de Gantt 121 122 123 IV. Traduction des contraintes Si les contraintes de type potentiel ne sont pas uniquement des contraintes d’antériorité, on modifie le graphe potentiel-tâches ainsi: La contraint j ne doit pas commencer avant la moitié du temps de réalisation de la tâche i se représente par un arc (i,j) de valeur di/2 La contraint j ne doit commencer qu’après un temps t de la fin de i un arc(i,j) de valeur di +t La contraint j ne doit commencer qu’après la date bj arc(dp,j) de durée bj 124 • La contraint j doit commencer avant la date cj de durée –cj un arc entre dp et j La contraint j ne doit suivre immédiatement la tâche i se représente par un arc entre(i,j) REMARQUES 1.Attention, l’ajout des contraintes peut introduire des circuits dans le graphe. 125 V. Le graphe potentiel étapes(PERT) Â partir d’un projet donné on construit le graphe suivant: ►Chaque tâche est un arc de longueur di ( durée de i) ►Les sommets : Étapes du prj , i.e: le début et la fin de chaque tâche ►Si une tâche j succède à une tâche i L’extrémité initiale de j coïncide avec l’extrémité terminale de i ►On rajoute au graphe deux étapes fictives : dp et fp On définit ainsi un multigraphe sans circuit 126 Les dates au plus tôt et au plus tard de l’exécution d’une tâche sont calculées de la même manière que pour le graphe potentiel-tâche. ►La durée min du projet est la longueur du plus long chemin entre le début et la fin du projet. 127 REMARQUES: 1.un sommet est une étape signifiant toutes les tâches qui y arrivent sont terminées toutes les tâches qui en partent peuvent commencer 2.il est quelque fois nécessaire d'introduire des tâches fictives de durée nulle 128 3. deux arcs ne peuvent avoir à la fois la même origine et la même extrémité. Il est nécessaire de rajouter une tâche fictive dans ces conditions 129 Graphe potentiel étapes(PERT) 130 Exemple 131 132 Chapitre 6: Réseaux de transport 133 I. Introduction Les réseaux de transport peuvent être utilisés pour modéliser l’écoulement de liquide à l’intérieur de tuyaux, la circulation de pièces dans une chaîne de montage, du courant dans les réseaux électriques, de l’information à travers les réseaux de communication, ... D’une façon plus générale, un réseau de transport désigne le fait qu’un “matériau” (de l’eau, de l’électricité, de l’information,...) doit s’écouler depuis une source, où il est produit, jusqu’à un puits, où il est consommé. La source produit le matériau à un certain débit, et le puits consomme ce matériau avec le même débit. Entre la source et le puits, ce matériau est transporté par des conduits ; chacun de ces conduits a une capacité qui représente la quantité maximale de matériau pouvant transiter par le conduit pendant une unité de temps (par exemple, 200 litres d’eau par heure dans un tuyau, ou 20 ampères de courant électrique à travers un câble). 134 II. Modélisation de réseaux de transport Les réseaux de transport peuvent être modélisés par des graphes : Chaque arc du graphe correspond à un conduit du réseau de transport, par lequel le matériau est acheminé. Chaque arc est valué par la capacité du conduit correspondant. Chaque sommet du graphe correspond à une jonction de plusieurs conduits du réseau de transport. Le graphe possède en plus deux sommets particuliers, notés s et p et correspondant respectivement à la source et au puits du réseau de transport. 135 De façon plus formelle, un réseau de transport sera défini par un quadruplet (G; c; s; p) tel que: G = (S;A) est un graphe orienté, est une fonction qui associe à chaque arc sa capacité, est la source, est le puits. 136 On suppose qu'il n'y a pas de sommet "inutile", c'est-à-dire que pour tout sommet il existe un chemin de s à p passant par Pour des raisons de commodité d'écriture, on supposera que la fonction de capacité c est définie pour tout couple de sommets n'est pas un arc du réseau, alors C 137 =0 . , de telle sorte que si Exemple : l’usine “Max & Fils”, localisée à Lille, produit des voitures. Ces voitures sont acheminées en train jusqu’à Lyon, où elles sont stockées dans un entrepôt puis vendues. Les capacités des trains sont : sur la ligne Lille/Reims : 16 voitures par jour, sur la ligne Lille/Paris : 13 voitures par jour, sur la ligne Paris/Reims : 4 voitures par jour, sur la ligne Reims/Paris : 10 voitures par jour, sur la ligne Reims/Dijon : 12 voitures par jour, sur la ligne Paris/Nevers : 14 voitures par jour, sur la ligne Dijon/Paris : 9 voitures par jour, sur la ligne Nevers/Dijon : 7 voitures par jour, sur la ligne Nevers/Lyon : 4 voitures par jour, sur la ligne Dijon/Lyon : 20 voitures par jour. Ce réseau de transport sera modélisé par le graphe suivant : 138 La source est Lille, et le puits Lyon. 139 III. Problème du flot maximal On s'intéresse ici au problème du flot maximal dans un tel réseau de transport. Il s'agit de déterminer la plus grande quantité de matériau pouvant voyager depuis la source jusqu'au puits, sans violer aucune contrainte de capacité, et tout en préservant la propriété de "conservation de flot" : excepté la source et le puits, le matériau doit s'écouler d'un sommet à l'autre sans perte ni gain. Autrement dit, le débit à l'entrée d'un sommet doit être égal au débit en sortie. De façon plus formelle, un flot d'un réseau de transport (G = (S;A); c; s; p) est une fonction telle que : 140 1. Contrainte de capacité : 2. Contrainte de symétrie : 3. Conservation du flot : La valeur d'un flot f, notée est égale à la somme des flots partant de la source, et du fait de la propriété de conservation des flots, est aussi égale à la somme des flots arrivant au puits : 141 Exemple : Un flot pour le réseau de transport de l’usine “Max & Fils” est : Ce flot sera généralement représenté en ne faisant figurer que les arcs de valeurs positives : 142 Définition du problème du flot maximal : Etant donné un réseau de transport (G; c; s; p), il s’agit de trouver un flot f tel que |f | soit maximal. Modélisation en programmation linéaire : Le problème du flot maximal peut être exprimé comme un problème de programmation linéaire, c’est-à-dire comme une fonction linéaire à maximiser tout en respectant un certain nombre de contraintes linéaires. Etant donné le réseau de transport (G = (S;A); c; s; p), il s’agit de résoudre le problème linéaire suivant : 143 1. Algorithme de Ford Fulkerson On étudie ici l'algorithme de Ford-Fulkerson permettant de résoudre le problème du flot maximal sans passer par sa modélisation linéaire. L'algorithme procède selon une approche "gloutonne", en augmentant progressivement un flot : • Au départ, le flot est nul, c'est-à-dire que pour tout couple de sommets On augmente ensuite itérativement le flot f en cherchant à chaque fois un "chemin améliorant", c'est-à-dire un chemin allant de la source s jusqu'au puits p et ne passant que par des arcs dont le flot actuel est inférieur à la capacité. 144 Pour cela, à chaque itération, on calcule la "capacité résiduelle" de chaque arc, c'est-à-dire la quantité de flot pouvant encore passer. De façon plus formelle, étant donné un réseau de transport (G = (S;A); c; s ; p), et un flot f, on définit : La capacité résiduelle d'un couple de sommets est la quantité de flot pouvant encore passer par notée sans dépasser la capacité: 145 Le réseau résiduel de G, noté est le graphe partiel de G ne contenant que les arêtes dont la capacité résiduelle est positive: Un chemin améliorant est un chemin sans circuit allant de s à p dans le réseau résiduel La capacité résiduelle d'un chemin améliorant ch , notée est la plus grande quantité de flot transportable par les arcs du chemin. Théorème : Soient (G; c; s; p), un réseau de transport, f, un flot de G, Ch un chemin améliorant dans le réseau résiduel 146 un flot défini par: Alors, f ' est un flot de (G; c; s; p) tel que . 147 148 Principe: L'idée de l'algorithme de Ford Fulkerson est de faire passer un flot compatible dans le réseau, le plus évident est le flot nul, puis l'améliorer jusqu'à ce qu'on obtienne un flot complet. Une chaine pour laquelle le flot peut être augmenté est une chaine dont les arcs dans le sens direct n'ont pas atteint leur limite et les arcs dans le sens indirect ont un flux non nul qui les traverse. Autrement dit: une chaine C est dite augmentante si: Pour tout arc U direct de C, c'est-à-dire: Pour tout arc U indirect de C, c'est-à-dire 149 Le flot sur cette chaine C peut être augmenté de la valeur suivante: Pour améliorer le flot on ajoute Ɛ . au flot des arcs , c'est-à-dire les arcs directs dans la chaine. On retranche au flot des arcs de , c'est-à-dire, les arcs indirects, dans la chaine. 150 2. Exemple du problème du flot maximal : Voici une chaine C reliant les sommets s et p prise d'un réseau de transport dont le flot peut être augmenté: On augmentera donc le flot de cette chaine de 1, ce qui signifie: - Augmenter de 1 le flux entre s et x1. - Augmenter de 1 le flux entre x1 et x2. - Diminuer de 1 le flux entre x3 et x2. - Augmenter de 1 le flux entre x3 et p. On obtient alors le nouveau flot sur la chaine: 151 Recherche d’un chemin améliorant dans le réseau résiduel : Il s’agit d’un point critique de l’algorithme, qui peut faire varier considérablement l’efficacité de l’algorithme. Considérons par exemple le réseau de transport suivant : Au départ, on peut trouver plusieurs chemins améliorants différents pour ce réseau, à savoir <s,s1,s2,p>, ou <s,s1,p>, ou encore <s,s2,p>. Si l’on choisit le premier chemin (<s,s1,s2,p>), de capacité résiduelle 1, alors le réseau résiduel devient : 152 On peut alors trouver un deuxième chemin améliorant <s,s2,s1,p>, de capacité résiduelle 1, et le réseau résiduel devient : On peut continuer ainsi, de telle sorte qu’à chaque fois on trouve un chemin améliorant de capacité résiduelle égale à 1. Par conséquent, ce n’est qu’au bout de 2000 étapes successives que l’on trouvera le flot maximal et que l’algorithme s’arrêtera.). l’algorithme converge plus rapidement, et nécessite au plus n*p calculs de chemins améliorants successifs (avec n = nombre de sommets et p = nombre d’arcs). Par conséquent, pour chercher le chemin améliorant à chaque étape de l’algorithme de Ford-Fulkerson, il faudra utiliser un parcours en largeur d’abord, permettant de trouver un plus court chemin améliorant (en nombre d’arcs). 153 3. Complexité Si on considère un réseau de transport ayant n sommets et p arcs, l'initialisation (première boucle pour) nécessitera de l'ordre de opérations. On passera ensuite au plus n*p fois dans la boucle "tant que". A chaque passage dans cette boucle, on effectue un parcours en largeur pour chercher le chemin améliorant, ce qui nécessite de l'ordre de n + p opérations, puis on parcourt les arcs du chemin améliorant trouvé pour calculer la capacité résiduelle du chemin et mettre à jour le flot et la capacité résiduelle du réseau. Le chemin améliorant étant acyclique, il comporte au plus n-1 arcs, et donc cette série de traitements nécessite de l'ordre de n opérations. Au total, on fera de l'ordre de réseau est connexe, on a + (n*p)*(n + p) opérations. Etant donné que le . Par conséquent, la complexité globale de l'algorithme est en . 154 4. Flot compatible et flot complet: Soit le réseau R=(X,U,C) suivant: Dans le réseau R, le flot qui traverse chaque arc ne dépasse pas sa capacité, alors se flot est compatible. Flot complet: Un flot est complet si pour tout chemin allant de la source au puits il y'a au moins un arc saturé, c'est-à-dire: le flux qui le traverse est égal à sa capacité (f(u)=c(u)). 155 Exemple: Dans la figure précédente, on a 3 chemins qui mènent de s à p pour lesquels on a au moins un arc saturé. Le flot est complet. 156 IV. Exercice d’application Une usine à gaz alimente une ville V par l'intermédiaire du réseau de distribution ci-dessous. Les nombres associés aux arcs représentent les capacités de transport. On voudrait connaitre la quantité maximale que peut écouler l'usine. Ce qui revient à chercher un flot maximum sur le réseau. 157 [1] Christine Solnon, Théorie des graphes et optimisation dans les graphes. [2] Aimé Sache, La théorie des graphes, Presse universitaires de France. [3] Lilia Horchani, algorithmique de graphe et optimisation, ENSI, 2012. [4] Michel COUPRIE, Graphes et algorithmes Notes de cours et exercices,2017 158