Recherche Opérationnelle Graphes
Transcription
Recherche Opérationnelle Graphes
Recherche Opérationnelle - Graphes Recherche Opérationnelle Graphes Yves Correc 0–1 Yves Correc 08/10/2007 Recherche Opérationnelle - Graphes Sommaire INTRODUCTION .......................................................................................................................0–3 Les graphes ...........................................................................................................................0–3 La programmation linéaire .....................................................................................................0–5 1. ELEMENTS DE LA THEORIE DES GRAPHES........................................................................1–6 1.1. Représentations d'un graphe .................................................................................................1–6 1.1.1. Représentation graphique ..............................................................................................1–6 1.1.2. Dictionnaire des suivants................................................................................................1–6 1.1.3. Matrice d'adjacence ........................................................................................................1–7 1.1.4. Matrice d'incidence sommets-arcs .................................................................................1–8 1.2. Définitions ............................................................................................................................1–10 1.3. Analyse de la structure d'un graphe ....................................................................................1–12 1.3.1. Recherche de circuits ...................................................................................................1–12 1.3.2. Décomposition en niveaux............................................................................................1–14 1.3.3. Fermeture transitive des sommets d'un graphe ...........................................................1–16 1.3.4. Composantes fortement connexes d’un graphe...........................................................1–19 1.3.5. Composantes connexes d'un graphe ...........................................................................1–22 0. 0.1. 0.2. 0–2 Yves Correc 08/10/2007 Recherche Opérationnelle - Graphes 0. INTRODUCTION 0.1. LES GRAPHES Les graphes donnent une représentation aisément manipulable des relations qui peuvent apparaître lors de l'analyse des phénomènes étudiés. Ces relations peuvent être spatiales (réseaux), temporelles (ordonnancement de projet) ou autres (routage, affectation, ...). Les modèles ainsi construits peuvent alors être utilisés pour rechercher une solution optimale (en un sens à préciser : coût, durée, qualité…) aux problèmes posés. Problème réel Ð position Ð Problème bien posé Ð analyse Ð Modèle mathématique Ð résolution Ð Solution On n'insistera jamais assez sur l'importance des deux premières étapes: il ne sert à rien de se précipiter pour résoudre ce que l'on croit être le problème mathématique posé, et trouver une solution fausse au problème physique originel !… On illustrera ce syndrome malheureusement trop répandu par un exemple classique: Un problème d'optimisation de porte-feuille (c'est à dire de répartition de ressources financières entre divers placements -actions, obligations, etc-) peut se ramener à un problème de programmation linéaire, ce qui revient à rechercher l'optimum d'une certaine fonction –le rendement global- à l'intérieur d'un polyèdre dont les facettes représentent les diverses contraintes qui s'appliquent à ce choix. La question posée habituellement s'énonce "déterminer la politique d'investissement optimale…", et appelle par conséquent une solution du genre " investir x en actions machin, y en actions truc, z en obligations…". Mais la contrainte sous-jacente, oubliée généralement par beaucoup d'étudiants, est que les ressources à investir ne sont pas infinies, même si l'on n'en a pas dit un mot auparavant. La seule solution consiste donc à raisonner en termes de pourcentages (x%, y%, z%… de l'investissement global), ce qui revient à inclure explicitement dans les contraintes du problème la contrainte implicite "x + y + z = 100" ,dont l'absence conduira à une solution tout à fait surréaliste !… En résumé, les trois étapes précitées sont indispensables, et passer rapidement sur les deux premières est un moyen très sûr de faire des bêtises. Donc: (1) Poser correctement le problème physique. Vérifier que l'on a bien compris le besoin du client, et que toutes les données sont sur la table, y compris les hypothèses implicites (c'est le nondit qui tue!). (2) Analyser le problème pour le transformer en un problème mathématique que l'on sait résoudre, et dont les méthodes sont l'objet de ce cours. (3) Résoudre le problème mathématique ainsi construit, et ne pas oublier de revenir au problème physique de départ, pour en donner la solution dans les termes de celui qui vous l'a posé. C'est pour cela que la recherche opérationnelle est une discipline à part entière. Pour reprendre une citation du professeur Faure "les mathématiques sont une science, mais la recherche opérationnelle est un art…". 0–3 Yves Correc 08/10/2007 Recherche Opérationnelle - Graphes Exemples Problème du plus court chemin Etant donné un graphe représentant un réseau, il s'agit de trouver le plus court chemin d'un point à un autre. Sur cet exemple, le plus court chemin du point A au point F passe par D et a pour longueur 6. 10 B 6 5 6 4 3 A G 5 C 2 1 4 3 E 2 2 D F Problème d'ordonnancement Il s'agit de réaliser "au mieux" un projet composé d'un certain nombre de tâches, soumis en outre à des contraintes de durée, de moyens ou de coût. Cela revient en particulier à trouver le chemin critique dans le graphe représentant le projet, c'est à dire le chemin tel que tout retard pris sur l'une des tâches qui le constituent se répercute sur l'ensemble du projet. Problème de l'arbre minimal Il s'agit de trouver dans un graphe représentant par exemple un réseau de distribution électrique le plus petit (longueur, coût) sous-ensemble de celui-ci qui en assure encore les fonctions. 3 B 4 A 3 5 6 E 2 C 3 F 4 D Problème du flot maximum Il s'agit de faire passer le flot maximum au travers d'un réseau dont les éléments ont une capacité donnée, limitée. Problème d'affectation Il s'agit d'affecter un ensemble de personnes à un ensemble de tâches de telle sorte que la satisfaction globale (somme des satisfactions individuelles) soit maximale. 0–4 Yves Correc 08/10/2007 Recherche Opérationnelle - Graphes Problème de transport Il s'agit d'acheminer au coût minimal un certain nombre de marchandises à partir d'un certain nombre d'origines jusqu'à un certain nombre de destinations, compte tenu de contraintes de capacité sur les tronçons utilisés. Stock0 Destination1 Stock1 Destination2 Stock2 Destination3 Destination4 Problème de tournée Il s'agit de d'effectuer au moindre coût le ramassage d'une denrée quelconque sur l'ensemble des points d'un réseau, en respectant éventuellement des contraintes additionnelles de capacité de transport ou de distance parcourue. 0.2. LA PROGRAMMATION LINEAIRE Soit un processus contrôlé par n variables xj (j=1 à n), il en résulte des effets mesurables yi supposés proportionnels aux variables de contrôle xj (considérées comme causes). Les yi (i = 1,n) peuvent donc s'écrire comme combinaisons linéaires des xj: yi = ai1 x1 + ai2 x2 + ai3 x3 + …… + ain xn (i = 1,n) On cherche alors à minimiser un certain résultat y0 = ∑ cj xj sous les contraintes de bornes yi ≤ bi. Ce qui s'écrit sous forme matricielle: Min c x (c x : objectif, coût, fonction économique) Ax≤b Avec l'écriture adéquate, les problèmes de graphes peuvent être traités comme des problèmes de programmation linéaire, mais son intérêt n'est évidemment pas là: Elle permet de traiter des problèmes beaucoup plus généraux, pourvu qu'ils résultent de la modélisation de processus linéaires, en variables continues, entières ou booléennes. exemple : Problème de production On fabrique x1 appareils sur une chaîne A, sur laquelle chaque appareil nécessite 3h de fabrication et 1h de finition pour un coût unitaire de 20kF. On fabrique x2 appareils sur une chaîne B, sur laquelle chaque appareil nécessite 1h de fabrication et 2h de finition pour un coût unitaire de 60kF. On dispose dans l'atelier de fabrication de 60h par mois, et dans l'atelier de finition de 70h par mois. La demande est de 30 appareils au moins par mois. Quelle doit être la production pour satisfaire la demande en minimisant le prix de revient ? (on n'oubliera pas les contraintes de production –ateliers-! ) La solution sera donnée par la résolution du problème d'optimisation linéaire suivant: Min 20 x1 + 60 x2 3 x1 + 1 x2 ≤ 60 1 x1 + 2 x2 ≤ 70 x1 + x2 ≥ 30 (coût = objectif à minimiser) (contrainte atelier de fabrication) (contrainte atelier de finition) (contrainte demande) 0–5 Yves Correc 08/10/2007 Recherche Opérationnelle - Graphes 1. ELEMENTS DE LA THEORIE DES GRAPHES 1.1. REPRESENTATIONS D'UN GRAPHE Un graphe est défini par un doublet (X,U), X étant un ensemble de points et U un ensemble de segments les joignant: G = (X,U) avec U ⊂ (X x X) 1.1.1. Représentation graphique X = {points} U = {segments joignants ces points} Un graphe est orienté ou non suivant que l'on impose ou non un sens de parcours sur ses branches. Exemple de graphe (orienté): x u x 2 x 4 4 u 1 u 1 u u 2 u 3 5 8 x u 7 u x 3 x u 6 9 5 6 On peut affecter à chaque branche, une ou plusieurs valeurs numériques qui la caractérisent (distance, capacité, durée, coût, ...). Il en est de même pour les noeuds. Il peut exister plusieurs branches joignant un point à un autre (cas où il existe par exemple plusieurs moyens de transport possibles): on parle dans ce cas de multigraphe. Les points du graphe sont appelés sommets, ou nœuds. Chaque branche joignant deux sommets est appelée arc (graphes orientés) ou arête (graphes non orientés). 1.1.2. Dictionnaire des suivants On définit l'application Γ : XÎX qui à chaque sommet x du graphe associe l'ensemble Γ(x) des sommets accessibles par un arc à partir de celui-ci. On peut alors représenter le graphe, en associant à chaque sommet, la liste de ses suivants: G=(X,Γ) Ce type de représentation est d'autant plus efficace que le graphe est peu dense (mémoire nécessaire ≅ nbsommets x nbarcs issus de chaque sommet) . La variante symétrique (dictionnaire des précédents) associe à chaque sommet la liste de ses "pères" -1 Γ (x) (c'est à dire les sommets depuis lesquels on peut venir par un arc). 1–6 Yves Correc 08/10/2007 Recherche Opérationnelle - Graphes Exemple: D B A F C E x Γ(x) Γ-1(x) A B,C ∅ B D A,C C B,D,E A D F B,C,E E D,F C F ∅ D,E 1.1.3. Matrice d'adjacence On définit l'application booléenne B: X x X → { 0,1} qui à deux sommets associe 1 s'il existe un arc joignant le premier au second, 0 sinon. On représente alors le graphe par le tableau à double entrée de ses valeurs (matrice booléenne). Cette matrice est aussi appelée matrice d'incidence sommetssommets. Si le graphe est non orienté, la matrice est symétrique. Si les branches du graphe sont valuées, on peut remplacer le 1 par la valeur numérique associée à la branche correspondante. Ce type de représentation est commode pour la mise en œuvre des algorithmes matriciels, mais son 2 usage est limité par son encombrement (mémoire nécessaire = nbsommets ). La matrice d'adjacence de l'exemple précédent est: A B C D E F A 0 1 1 0 0 0 B 0 0 0 1 0 0 C 0 1 0 1 1 0 D 0 0 0 0 0 1 E 0 0 0 1 0 1 F 0 0 0 0 0 0 1–7 Yves Correc 08/10/2007 Recherche Opérationnelle - Graphes 1.1.4. Matrice d'incidence sommets-arcs On définit l'application qui à chaque couple (sommet – arc) associe +1 si l'arc sort du sommet, -1 s'il y rentre, et 0 sinon. Le graphe est alors représenté par le tableau de ses valeurs. Cette notation n'a qu'un intérêt théorique. Dans le cas d'un graphe non orienté, las valeurs prises sont 0 et 1. La matrice correspondant à l'exemple traité est donnée ci-dessous. On observera, et cela résulte évidemment de la définition d'un arc, que chaque colonne contient un +1 (origine) et un –1 (extrémité). x u x 2 x 4 4 u 1 u 1 u u 2 u 3 8 x 5 u 7 u x x 3 u 6 9 5 6 u1 u2 u3 u4 u5 u6 u7 u8 u9 x1 +1 +1 0 0 0 0 0 0 0 x2 -1 0 -1 +1 0 0 0 0 0 x3 0 -1 +1 0 +1 +1 0 0 0 x4 0 0 0 -1 -1 0 -1 +1 0 x5 0 0 0 0 0 -1 +1 0 +1 x6 0 0 0 0 0 0 0 -1 -1 1–8 Yves Correc 08/10/2007 Recherche Opérationnelle - Graphes Exercice Donner les 3 représentations du graphe suivant: B U4 U1 E U5 A U3 U2 U8 U10 D G U6 C U9 U11 U7 F Solution Dictionnaires des suivants et des précédents x Γ(x) A BC Γ-1(x) ∅ B CD AE C ∅ ABDF D CEF B E BG D F CG D G ∅ EF Matrice d'adjacence A B C D E F G A 0 1 1 0 0 0 0 B 0 0 1 1 0 0 0 C 0 0 0 0 0 0 0 D 0 0 1 0 1 1 0 E 0 1 0 0 0 0 1 F 0 0 1 0 0 0 1 G 0 0 0 0 0 0 0 Matrice d'incidence sommets-arcs U1 U2 U3 U4 U5 U6 U7 U8 U9 U10 U11 A +1 +1 0 0 0 0 0 0 0 0 0 B -1 0 +1 -1 +1 0 0 0 0 0 0 C 0 -1 -1 0 0 -1 -1 0 0 0 0 D 0 0 0 0 -1 +1 0 +1 +1 0 0 E 0 0 0 +1 0 0 0 -1 0 +1 0 F 0 0 0 0 0 0 +1 0 -1 0 +1 G 0 0 0 0 0 0 0 0 0 -1 -1 1–9 Yves Correc 08/10/2007 Recherche Opérationnelle - Graphes 1.2. DEFINITIONS On a vu que les points du graphe sont appelés sommets (vertices) ou nœuds (nodes), et que chaque branche joignant deux sommets est appelée arc (arc) dans le cas des graphes orientés, ou arête (link, edge) dans le cas des graphes non orientés. Si l'origine d'un arc est l'extrémité d'un autre, ils sont adjacents. Une boucle (loop) est un arc dont l'origine et l'extrémité sont confondues. On appelle chemin (path) une suite d'arcs adjacents permettant de passer d'un sommet à un autre. On appelle circuit (circuit) un chemin dont les sommets initial et final coïncident. De même, dans les graphes non orientés, on appelle chaîne (chain) une suite d’arêtes adjacentes, et cycle (cycle) une chaîne refermée. Un chemin, un circuit, une chaîne, un cycle, est dit : - élémentaire (elementary) s'il ne passe qu'une seule fois par chacun de ses sommets, - simple (simple) s'il ne passe qu'une seule fois par chacun de ses arcs, - hamiltonien (hamiltonian) s'il passe une seule fois par chaque sommet du graphe, - eulérien (eulerian) s'il passe une seule fois par chaque arc du graphe (cf. ponts de Königsberg), - préhamiltonien (ou préeulérien) s'il passe au moins une fois par chaque sommet (ou chaque arc) du graphe. On appelle degré (degree) d'un sommet le nombre d'arcs qui lui sont connectés, et plus précisément demi degré extérieur (outdegree) le nombre d'arcs qui en sortent, et demi degré intérieur (indegree) le nombre d'arcs qui y rentrent. Un graphe est dit complet (complete) si pour toute paire de sommets, il existe un arc les joignant: ∀(xi,xj) ∈ X, (xi,xj)∈ U. Un graphe est dit symétrique (symmetric) si pour tout arc (xi,xj) il existe aussi un arc de sens opposé (xj,xi): ∀xi ∀xj (xi,xj) ∈ U ⇒ (xj,xi) ∈ U. Un graphe est dit antisymétrique (antisymmetric) s'il n'existe qu'un arc au plus joignant deux sommets: ∀xi ∀xj (xi,xj) ∈ U ⇒ (xj,xi ) ∉ U. La cardinalité (cardinality) d'un chemin est le nombre d'arcs qui le composent. Le poids (weight) ou longueur (length) d'un chemin est la somme des poids ou longueurs des arcs qui le composent. On appelle graphe partiel (partial graph) G' de G un graphe ayant les mêmes sommets que G, mais seulement un sous ensemble de ses arcs: G' = (X,V) avec V ⊂ U. On appelle sous-graphe (subgraph) engendré par un sous ensemble de sommets A ⊂ X, le graphe ayant pour sommets A et pour arcs ceux de U qui ont leurs extrémités dans A. Un graphe est planaire (planar) s'il peut être tracé sur un plan sans que ses arcs se coupent. Un graphe est dit connexe s'il existe au moins une chaîne reliant deux sommets quelconques. Un graphe est dit fortement connexe s'il existe au moins un chemin reliant deux sommets quelconques. Un sous-graphe connexe s'appelle une composante connexe, et un sous-graphe fortement connexe une composante fortement connexe. Dans un graphe G = (X,U) connexe, on dit qu'un sommet x est un point d'articulation si le sousgraphe obtenu en supprimant x n'est plus connexe. On appelle ensemble d'articulation A d'un graphe G, le sous-ensemble de sommets A ⊂ X tel que le sous graphe engendré par X-A n'est pas connexe. On appelle nombre de connexité , noté ω (G), le nombre minimal de sommets à supprimer pour rendre le graphe G non connexe. Si ω(G) ≥ h (entier), le graphe est dit h-connexe. On appelle arbre (tree) un graphe connexe sans cycle. 1–10 Yves Correc 08/10/2007 Recherche Opérationnelle - Graphes On appelle matrice d'incidence généralisée d'un graphe G = (X,U), la matrice des poids des arcs joignant les sommets. On appelle fermeture transitive (transitive closure) d'un sommet x, le sous-ensemble A ⊂ X des sommets accessibles depuis x par un chemin (x∉A). Si l'on ajoute x à A, on parle de fermeture réflexo-transitive. Exercice : Donner les degrés et demi-degrés du graphe de l'exercice précédent. Que peut-on dire de sa connexité? Existe-t-il des points d'articulation? Solution Les demi-degrés sont ici les sommes calculées sur les lignes (-extérieur) ou les colonnes (-intérieur) de la matrice d'adjacence (à moins que l'on ne préfère effectuer le décompte pour chaque sommet individuellement sur la représentation graphique). On vérifie que la somme des demi-grés extérieurs est égale à la somme des demi-degrés intérieurs, et au nombre d'arcs du graphe. A B C D E F G degré 2 4 4 4 3 3 2 1/2degré extérieur 2 2 0 3 2 2 0 1/2degré intérieur 0 2 4 1 1 1 2 Ce graphe est connexe (au sens large puisqu'il s'agit d'un graphe orienté et que la connexité est une notion non orientée, c'est à dire qu'ici l'on "oublie" par abus de langage l'orientation des arcs), mais pas fortement connexe. Il ne possède aucun point d'articulation, et ses plus petits ensembles d'articulation sont (B,C) et (E,F). Il est donc 2-connexe. Il admet une seule composante fortement connexe non dégénérée (c'est à dire non réduite à un seul sommet), qui est le circuit (BDE) (voir le paragraphe suivant pour la méthode). 1–11 Yves Correc 08/10/2007 Recherche Opérationnelle - Graphes 1.3. ANALYSE DE LA STRUCTURE D'UN GRAPHE 1.3.1. Recherche de circuits On commence par éliminer les boucles qui sont des circuits élémentaires (diagonale de la matrice d'adjacence). Le principe de base consiste à éliminer progressivement tous les sommets qui sont, soit uniquement origine, soit uniquement extrémité des arcs adjacents, et ne peuvent donc appartenir à un circuit. La procédure est donc la suivante: On examine tous les sommets les uns après les autres, dans un ordre quelconque. Si un sommet possède la propriété définie plus haut, on l'élimine ainsi que les arcs adjacents. Puis on passe au sommet suivant. S'il n'y a pas de circuit, tout le graphe disparaît. Sinon seuls subsistent les circuits. Exemple1 : on entoure en rouge les sommets qui n'ont pas de suivants. Etape1 : B D A F C E B D C E Etape2 : A Etape3 : B A C E Etape4 : B A C 1–12 Yves Correc 08/10/2007 Recherche Opérationnelle - Graphes Etape5 : A C Etape6 : A Le graphe proposé n'avait pas de circuit. Exemple 2 : On entoure aussi en bleu les sommets qui n'ont pas de précédents B A x A B C D E F G E D C B G F E D Γ(x) BC CD CFE BG CG x B D E F Γ(x) D FE B Γ-(x) E B D D x B D E Γ(x) D E B Γ-(x) E B D Γ-(x) AE ABDF B D D EF F B E D Il reste un seul circuit (BDE). 1–13 Yves Correc 08/10/2007 Recherche Opérationnelle - Graphes 1.3.2. Décomposition en niveaux Considérons un graphe connexe sans circuit et la relation d'ordre suivante entre deux sommets xi et xj: xi ℜ xj si et seulement s'il existe un chemin de xi à xj . Il est possible d'ordonner ce graphe à partir de cette relation d'ordre, c'est à dire de ranger les sommets suivant des niveaux croissants tels qu'il n'y ait pas de chemin d'un sommet à un autre sommet situé à un même niveau ou à un niveau inférieur. Cette décomposition peut s'effectuer en recherchant, à chaque itération, tous les sommets qui n'ont pas de précédent et donc constituent un niveau, et en les effaçant avant de rechercher le niveau suivant. On utilisera pour cela le dictionnaire des précédents. Cette décomposition descendante peut être remplacée par une approche ascendante remontant de la même manière du sommet qui n'a pas de descendants jusqu'à la racine de la décomposition, en utilisant le dictionnaire des suivants. Exemple: B D A F C Avec dictionnaire des précédents. -1 x Γ (x) A B A ,C C A D B, C, E E C F D, E E Premier niveau : A n’a pas de précédent A Deuxième niveau : C n’a pas de précédent, car A retiré. A C Troisième niveau : B et E n’ont pas de précédent car C et A retirés. B A C E Quatrième niveau : D n’a pas de précédent car B, C et E retirés. B A C Dernier niveau : F. Retrait de D -1 x Γ (x) F B C Retrait de C -1 x Γ (x) B D B, E E F D, E Retrait de E et B -1 x Γ (x) D F D D E A Retrait de A -1 x Γ (x) B C C D B, C, E E C F D, E D F E 1–14 Yves Correc 08/10/2007 Recherche Opérationnelle - Graphes On utilisera les dictionnaires des suivants ou des précédents pour effectuer la décomposition en niveaux. Cette décomposition sera utile dans la résolution des problèmes d'ordonnancement. NB. La recherche des circuits d'un graphe par élimination résulte de la double application de la procédure ascendante/descendante. CALCUL MATRICIEL (RAPPELS) Pour ceux qui auraient tout oublié, il est sans doute utile avant le paragraphe suivant de rappeler brièvement les quelques notions élémentaires de calcul matriciel qui seront nécessaires pour la suite. On passera sur le fait qu'un vecteur est la représentation algébrique d'un point d'un espace à n n dimensions R et une matrice celle d'une application linéaire de cet espace dans lui-même: n n A: R Æ R : x Æ Ax a11 a12 ... a1n Soit une matrice A =[aij]= ... an1 an2 ... ann Par convention, i sera l'indice des lignes, et j l'indice des colonnes b1 Soit un vecteur b = [bi] = ... bn La somme de deux vecteurs ou deux matrices a pour terme générique la somme des composantes correspondantes: b1+c1 Somme de 2 vecteurs [b+c]= ... ou encore [b+c]i = [bi+ci] bn+cn Somme de 2 matrices [A+B]ij = [aij+bij] Le produit d'un vecteur x par une matrice A est un vecteur dont chaque composante est le produit scalaire du vecteur par la ligne correspondante de la matrice. Exemple avec une matrice 3x3: x1 x2 x3 a11 a21 a31 a12 a22 a32 a13 a23 a33 x = a11*x1+a12*x2+a13*x3 a21*x1+a22*x2+a23*x3 a31*x1+a32*x2+a33*x3 k Soit [Ax]i=∑ aik xk Le produit de 2 matrices est une matrice ayant pour terme générique le produit scalaire d'une ligne de la première et d'une colonne de la seconde. Exemple du produit de deux matrices 2x2: b11 b21 a11 a21 a12 a22 b12 b22 x = a11b11+a12b21 a11b12+a12b22 a21b11+a22b21 a21b12+a22b22 k Soit [A.B]ij = ∑ aik bkj 1–15 Yves Correc 08/10/2007 Recherche Opérationnelle - Graphes 1.3.3. Fermeture transitive des sommets d'un graphe On va s'intéresser aux ensembles de suivants des sommets du graphe, soit les Γ(xi) accessibles 2 directement depuis xi par un chemin de longueur 1 (un arc), les Γ (xi)= Γ( Γ(xi)) accessibles par un chemin de longueur 2, etc... Dans un graphe à n sommets, il ne peut y avoir de chemin élémentaire (les circuits ne servent à rien ici) de plus de (n-1) arcs (sans répétition de sommet), si bien que la recherche pourra s'arrêter à n-1 k+1 k l'ordre n-1, c'est à dire Γ (xi). En fait, on pourra s'arrêter dès que Γ (xi)= Γ (xi). Pour déterminer la matrice des fermetures transitives M̂ , on utilise la matrice booléenne d'adjacence M. Introduisons les opérations matricielles "somme" ⊕ et "produit" * définies à partir des opérations scalaires "somme" ⊕ et "produit" * par: C = A ⊕ B ⇔ Cij = aij ⊕ bij C = A * B ⇔ Cij = ⊕ k ( aik * bkj ) (AA) (PP) Nous prendrons pour ⊕ et * la somme et le produit booléen, soit "max" et "min", ou encore "ou" et "et". 2 M = M*M nous donnera les listes des sommets relié aux sommets xi par des chemins élémentaires de longueur 2. L'opération a priori bizarre que nous venons de définir a été construite exactement pour cela. 2 Considérons en effet le terme (M )ij de cette matrice: il sera égal à 1 s'il y a un chemin (Xi,Xj) entre Xi et Xj, chemin décomposable en deux arcs adjacents (Xi,Xk) et (Xk,Xj) avec Xk éventuel sommet intermédiaire entre Xi et Xj. Il nous reste donc à regarder pour tous les indices k possibles s'il existe un arc entre Xi et Xk (alors aik=1) et un arc entre Xk et Xj (alors aik=1), pour connaître la valeur de 2 (M )ij , grâce à la formule (PP). Xk Xk Xj Xi Xk Xk 3 2 De même M = M*M donnera les suivants par des chemins élémentaires de longueur 3, et ainsi de 2 3 n-1 suite… La matrice cherchée sera alors M ⊕ M ⊕ M ⊕ .….. ⊕ M . Pratiquement, on s'intéressera plutôt à la matrice des fermetures réflexo-transitives M = I ⊕ M̂ . n-1 En effet, si l'on introduit la matrice M' = I ⊕ M, on peut montrer que M = (M') , dont le calcul est beaucoup plus rapide. Pour cela il suffit d'observer que l'opération ⊕ est idempotente (A ⊕ A = A), et 2 3 n-1 n-1 on démontre par récurrence que I ⊕ M ⊕ M ⊕ M ⊕ .….. ⊕ M = ( I ⊕ M ) . k On calculera donc la suite des ( I ⊕ M ) = M' chemins de longueur comprise entre 0 et k. k , qui nous fournira les suivants accessibles par des N.B. Comme seule nous intéresse la limite M , il sera plus rapide d'évaluer les matrices correspondant aux chemins de longueur 2, 4, 8, 16….. jusqu'à ce que le résultat devienne invariant (la suite aura convergé). La matrice obtenue représente l'ensemble des paires de sommets qui peuvent 1–16 Yves Correc 08/10/2007 Recherche Opérationnelle - Graphes être joints par un chemin (de longueur quelconque). La fermeture transitive d'un sommet est donc constituée par les sommets correspondant aux 1 de sa propre ligne. N.B. Dans M, une colonne de zéros correspond à une entrée du graphe (sommet sans précédents), et une ligne de zéros à une sortie du graphe (sommets sans suivants). Exemple : B D A F C E La matrice d’adjacence (matrice d'incidence sommet – sommets) est : A 0 0 0 0 0 0 A B C D E F B 1 0 1 0 0 0 C 1 0 0 0 0 0 D 0 1 1 0 1 0 E 0 0 1 0 0 0 F 0 0 0 =M 1 1 0 C 1 0 1 0 0 0 D 0 1 1 1 1 0 E 0 0 1 0 1 0 F 0 0 0 = M ⊕ I = M’ 1 1 1 Et la matrice M’ : A 1 0 0 0 0 0 A B C D E F B 1 1 1 0 0 0 2 Calculons M’ : 1 0 0 0 0 0 1 1 1 0 0 0 1 0 1 0 0 0 0 1 1 1 1 0 0 0 1 0 1 0 1 0 0 0 0 0 1 1 1 0 0 0 1 0 1 0 0 0 1 1 1 1 1 0 1 0 1 0 1 0 0 0 0 1 1 1 X 1 0 0 0 0 0 1 1 1 0 0 0 1 0 1 0 0 0 0 1 1 1 1 0 0 0 1 0 1 0 0 0 0 1 1 1 0 1 2 1 = M’ 1 1 1 Calculons par exemple le terme (1,4) (en rouge): 2 (M’ )14 = (1 et 0) ou (1 et 1) ou (1 et 1) ou (0 et 1) ou (0 et 1) ou (0 et 0) 1–17 Yves Correc 08/10/2007 Recherche Opérationnelle - Graphes 4 On calculera de la même manière M’ : 1 0 0 0 0 0 1 1 1 0 0 0 1 0 1 0 0 0 1 1 1 1 1 0 1 0 1 0 1 0 1 1 4 1 = M’ 1 1 1 4 2 M’ est différent de M’ , et l'on poursuit le calcul avec M’ 1 0 0 0 0 0 1 1 1 0 0 0 1 0 1 0 0 0 1 1 1 1 1 0 1 0 1 0 1 0 4 8 : 1 1 4 8 1 = M’ = M’ 1 1 1 8 Cette fois M’ = M’ , et le processus a convergé: la matrice des fermetures réflexo-transitives 4 3 en observant cherchée est M’ . En fait, nous aurions pu aussi nous arrêter à la matrice M’ simplement le graphe (on peut joindre tout couple de points par un chemin de longueur inférieure ou égale à 3). Mais ce raisonnement basé sur la représentation graphique n'est évidemment pas applicable à des graphes de grande taille où la visualisation est inaccessible, et seul le calcul utilisable. 1–18 Yves Correc 08/10/2007 Recherche Opérationnelle - Graphes 1.3.4. Composantes fortement connexes d’un graphe La relation définie sur X par x ℜ y Ù ( (il existe au moins un chemin de x à y et un chemin de y à x) ou (x=y) ) est une relation d’équivalence. La définition de cette relation entraîne en effet qu'elle est réflexive (x ℜ x car x=x), symétrique (x ℜ y ⇒ y ℜ x), et transitive (x ℜ y et y ℜ z ⇒ x ℜ z). Si l'on fait le quotient du graphe par cette relation d’équivalence, les classes obtenues se nomment composantes fortement connexes du graphe (CFC). Ce sont en pratique les classes de sommets qui sont tous reliés entre eux à l'intérieur d'une même classe. On verra ici deux méthodes pour les construire: • 1ère méthode (Algorithme de Foulkes): Cette méthode utilise la matrice M des fermetures réflexo-transitives, en observant que la sousmatrice associée à une CFC sera par définition pleine de 1 et située sur la diagonale de M . M On cherchera donc à les faire apparaître en permutant judicieusement ses lignes et colonnes (ce qui revient à une renumérotation des sommets du graphe), de façon à obtenir un partitionnement de M en sous-matrices carrées pleines de 1 (associées aux ensembles de sommets tous reliés deux à deux). En d'autres termes, on va permuter lignes et colonnes pour mettre M sous forme bloc-diagonale. Exemple: B Matrice d’adjacence M A C F D A B C D E F A 0 0 0 0 0 1 B 1 0 0 0 1 1 C 0 1 0 0 0 0 D 1 1 1 0 1 1 E 0 1 0 0 0 1 F 1 1 0 0 0 0 E Matrice M’ = I ⊕ M A B C D E F A 1 0 0 0 0 1 B 1 1 0 0 1 1 2 Matrice M’ C 0 1 1 0 0 0 D 1 1 1 1 1 1 E 0 1 0 0 1 1 F 1 1 0 0 0 1 A B C D E F 4 8 Matrice M’ = M’ = M A 1 1 0 0 0 1 B 1 1 0 0 1 1 C 1 1 1 0 1 1 D 1 1 1 1 1 1 E 1 1 0 0 1 1 F 1 1 0 0 1 1 A B C D E F A 1 1 0 0 1 1 B 1 1 0 0 1 1 C 1 1 1 0 1 1 D 1 1 1 1 1 1 E 1 1 0 0 1 1 F 1 1 0 0 1 1 1–19 Yves Correc 08/10/2007 Recherche Opérationnelle - Graphes Permutons les lignes et colonnes pour obtenir la forme bloc-diagonale recherchée: A B E F C D A 1 1 1 1 0 0 B 1 1 1 1 0 0 E 1 1 1 1 0 0 F 1 1 1 1 0 0 C 1 1 1 1 1 0 D 1 1 1 1 1 1 Les 3 composantes fortement connexes de ce graphe sont donc {A,B,E,F} , {C} et {D} (les deux dernières sont dégénérées, réduites à un seul sommet). • 2ème méthode (Décomposition de Malgrange) : Le principe de cet algorithme est le suivant: On établit pour un sommet quelconque la liste de tous ses précédents et la liste de tous ses suivants. Les points communs à ces deux listes (incluant en particulier le sommet considéré) constituent une composante fortement connexe. On supprime ensuite ces sommets (et les arcs adjacents) et on repart d'un autre sommet, …jusqu'à épuisement de ceux-ci. On traitera l'exemple qui suit en utilisant la matrice de fermeture réflexo-transitive M , ou directement une représentation graphique. B A C F D E Recherche des CFC sur une représentation chaînée du graphe: Partant du sommet A, on marque les sommets suivants (jaune) au cours d'une exploration du graphe menée en profondeur d'abord (depth first search): Partant d'un sommet, on passe à son premier suivant (fils), puis au suivant de celui-ci, etc, en laissant à chaque fois momentanément de côté les autres branchements possibles (frères). On progresse ainsi le plus loin possible sans former de cycle, puis on remonte jusqu'à la dernière bifurcation laissée de côté, que l'on explore alors en profondeur aussi, et ainsi de suite jusqu'au retour au sommet de départ. On marque de la même manière par une exploration en profondeur d'abord (et en arrière) les sommets précédents (bleu). Les sommets Mi marqués deux fois constituent CFC(A), puisqu'un tel sommet Mi est relié à A par un chemin dans chaque sens (de A vers Mi par les suivants, et de A vers Mi par les précédents c'est à dire de Mi vers A). On les retire et on itère sur le graphe résiduel… On observera que l'exploration du graphe aurait aussi bien pu être conduite en largeur d'abord (breadth first search) en marquant tous les suivants d'un sommet avant de poursuivre au niveau suivant. 1–20 Yves Correc 08/10/2007 Recherche Opérationnelle - Graphes Le déroulement du processus de construction est résumé sur la figure qui suit: Suivants C Précédents A A B F E F CFC (A) = {A,B,C,D,E,F} ∩ {A,F,B,E} = {A,B,E,F} B D E Puis CFC(C) ={C} , et enfin CFC (D) = {D} B A C F D E Recherche des CFC sur la matrice de fermeture réflexo transitive M Matrice M A B C D E F A 1 1 0 0 1 1 B 1 1 0 0 1 1 C 1 1 1 0 1 1 D 1 1 1 1 1 1 E 1 1 0 0 1 1 F 1 1 0 0 1 1 Suivants (A) = (111111) = {A,B,C,D,E,F} Précédents (A) = (110011) = {A,B,E,F} CFC (A) = (111111) ∩ (110011) = (110011) CFC (A) = {A,B,C,D,E,F} ∩ {A,B,E,F} = {A,B,E,F} On supprime alors les sommets ABEF qui constituent CFC (A) et l'on itère sur la matrice réduite: C D C 1 1 D 0 1 CFC (C) = (11) ∩ (10) = {C} Reste enfin CFC (D) = {D} 1–21 Yves Correc 08/10/2007 Recherche Opérationnelle - Graphes 1.3.5. Composantes connexes d'un graphe La vérification de la connexité d'un graphe est un problème important. On va décrire ici un algorithme de recherche des composantes connexes d'un graphe, analogue dans son principe à celui de Malgrange (Trémaux 1882, Tarjan 1972). Partant d'un sommet du graphe, on numérote les sommets dans l'ordre d'une exploration, en profondeur d'abord (depth first search). L'ensemble des sommets rencontrés forme la première composante connexe. Si tous les sommets ont été marqués, le graphe est connexe. Dans le cas contraire on recommence l'exploration à partir d'un sommet non encore rencontré, qui donnera une seconde composante connexe, et ainsi de suite… NB. La connexité est à considérer au sens strict dans un graphe non orienté, ou au sens large si l'on néglige l'orientation des arcs dans un graphe orienté. 1–22 Yves Correc 08/10/2007