Académique Documents
Professionnel Documents
Culture Documents
EXPLORATION DE GRAPHES
1 . INTRODUCTION 2
Exemple des graphes de jeux 3
2 . EXPLORATION D’ARBORESCENCES 7
3 . FOUILLE EN PROFONDEUR:
GRAPHES NON ORIENTÉS 8
3.1 Points d’articulation 10
4 . FOUILLE EN PROFONDEUR:
GRAPHES ORIENTÉS 14
4.1 Graphes sans circuit: tri topologique 16
4.2 Composantes fortement connexes 19
5 . FOUILLE EN LARGEUR 22
Exemple 1
Un vacancier arrive dans un pays étranger pour en visiter les principales
villes. Une fois ces villes identifiées, tout en ayant en sa possession une
carte du système routier de ce pays, il veut donc :
«Décrire un algorithme permettant de visiter ces villes.»
Exemple 2
Le tour du cavalier aux échecs (chemin hamiltonien).
Noter que le graphe à considérer n’est pas “tout à fait” l’échiquier!
But du chapitre
Suggérer des techniques d’exploration de graphes.
Les analyser.
5,4 4,2
3,3 2,2
position
perdante 1,1 2,1
Hypothèses communes
a) Le jeu se joue en alternance entre 2 joueurs.
b) Les 2 joueurs sont soumis aux mêmes règles (jeu symétrique).
c) Le hasard n’intervient pas (jeu déterministe).
d) Chaque partie dure un temps fini, et aucune configuration (nœud) ne
possède un nombre infini de successeurs possibles.
e) Les configurations terminales sont les nœuds du graphe n’ayant pas de
successeur.
Approche
Déterminer une stratégie gagnante en attribuant à chaque nœud une
étiquette choisie parmi {gagnante, perdante, nulle}, correspondant à la
situation d’un joueur placé devant cette configuration, et respectant les règles
suivantes:
- la valeur de l’étiquette (gagnante, perdante, ou nulle) d’une configuration
terminale est immédiate (elle dépend du jeu spécifique);
- une configuration non terminale est “gagnante” si au moins un de ses
successeurs est perdant;
- une configuration non terminale est “perdante” si tous ses successeurs
sont gagnants;
- dans tous les autres cas, une configuration non terminale est nulle (les
successeurs incluent au moins une position “nulle”).
Techniques d’exploration
(le préfixe indique où est visitée la racine par rapport à ses deux branches)
Résultats d’analyse
{Programme principal}
{Initialisations}
POUR chaque sommet v dans N FAIRE
Visité [v] ← faux
{Exploration et traitement}
POUR chaque sommet v dans N FAIRE
SI NON Visité [v] ALORS FEP (v) {Fouille en Profondeur et traitement}
Fin.
Analyse
Soient n le nombre de sommets et a le nombre d’arêtes de G=<N, A>
Exemple
1 2
7
9
4 8
3
6
2 composantes connexes
1
2
7
4 8
9
6
3
Point d’articulation
Définition: Un sommet v d’un graphe connexe tel que le sous-graphe
obtenu en supprimant v et toutes les arêtes incidentes à v n’est plus connexe.
Exemple: le sommet 1. (Est-ce le seul ?)
2 3 4
5 6 7 8
Graphe bicohérent
Définition: Graphe connexe où chaque point d’articulation est relié par au
moins 2 arêtes à chacune des composantes du sous-graphe restant.
Le graphe précédent n’est pas bicohérent au sommet 1 : il faudrait une
deuxième arête du sommet 1 vers la composante (4, 7, 8).
1
1 1 arcs de T
8
arêtes de A–T
2 6
6
2 1 4
4 7
3 7
3 7 6
3 1 6
4 8
6 2 8
2 5 6
Étude de PPH
• Le plus haut nœud w atteignable de cette manière est nécessairement un
ancêtre de v. Le plus haut w est donc celui qui minimise PréNum.
• Soit un nœud v autre que la racine, et supposons que v n’a pas de fils.
Alors ce n’est pas un point d’articulation de G (évident).
• Soit v un nœud autre que la racine, et soit x un fils de v.
- Supposons que PPH [x] < PréNum [v]. Alors il existe une chaîne d’arêtes
qui lie x aux autres sommets du graphe, même si v est supprimé. (cas du
nœud 3 de la figure). Donc, si cela est vrai pour tous les fils x de v, v n’est
pas un point d’articulation.
- Si, pour au moins un fils x de v, PPH [x] ≥ PréNum [v], alors il n'existe pas
de chaîne pour relier x au père de v (cas du nœud 4 de la figure). Donc v
est un point d’articulation.
• Si v est la racine, c’est un point d’articulation si et seulement si v a au moins
2 fils (dans ce cas la déconnexion de la racine sépare ses sous-arbres).
Algorithme
a) Effectuer une fouille en profondeur dans G. Soient
• T l’arborescence engendrée par la fouille,
• PréNum [v] ≡ le numéro attribué par la fouille au sommet v de G.
{Cette numérotation désigne le pré-ordre comme ordre de visite de T}
b) Parcourir l’arborescence T en post-ordre.
Au moment de la visite de chaque nœud v,
calculer PPH [v] (le PréNum du Plus Haut) comme le minimum de:
• PréNum [v],
• PréNum [w] pour tout sommet w tel que ∃ {v, w} ∈ A–T,
• PPH [x] pout tout sommet x qui est un fils de v (dans T).
c) Déterminer les points d’articulation de G comme suit:
i) la racine de T est un point d’articulation de G
⇔ elle possède plus d’un fils.
ii) un sommet v autre que la racine de T est un point d’articulation de G
⇔ v a un fils x tel que PPH [x] ≥ PréNum [v] .
1
3
8 1
2
7 1 1
3 6 6
2 4
3 1 6
4
7 6
5 1 7
2
5
5 8
1
6 8
1 4 6
Exemple
2 3 4
5 6 7 8
Ordre de visite: 1, 2, 3, 4, 8, 7;
puis: 5, 6.
2 4 5
3 8 6
Soit F l’ensemble des arcs de la forêt. Il existe 3 sortes d’arcs dans A–F:
2 4 5
3 8 6
Remarque
Dans le cas d’un graphe non orienté, seul le type (i) (ou (ii)) existe.
* *
/ + /
a b c d
1 4
Problème 9.26
Définition
∀ (i, j) ∈ A, i précède j dans la liste.
C
faire café boire café
Ordres possibles:
A B C F E D G
A F B C E D G
........
Définitions
• Un graphe orienté est fortement connexe
⇔ ∀ u, v ∈ N, ∃ un chemin allant de u à v ET un chemin allant de v à u
• Si un graphe orienté n’est pas fortement connexe, il s’agit de déterminer
chaque composante fortement connexe (de taille maximale) du graphe
original.
Exemple
A D
B C E
A D
B C E
Remarque préliminaire
Dans les fouilles en profondeur que nous allons effectuer, la numérotation
des sommets est faite en post-ordre.
Algorithme
i) Effectuer une fouille en profondeur dans le graphe G à partir d’un
sommet quelconque.
ii) Construire un graphe G’, à partir de G, en inversant simplement
l’orientation des arcs.
iii) Effectuer une fouille en profondeur dans G’ en commençant toujours une
fouille par le sommet w ayant la plus grande valeur de PostNum, en
autant qu’il n’a pas été visité.
iv) Chaque arborescence dans la forêt résultante est une composante
fortement connexe de G.
Analyse
i) ii) iii)
O (Max (a, n)) + O (a) + O (Max (a, n)) ≡ O (Max (a, n))
5 1
Début de la fouille A D
4
Graphe G B C E
3 2
=> 1 arborescence
4
B C E
3 2
4
Graphe G’
B C E
3 2
2ième point de départ => 2me composante
A D
=> 2 composantes
fortement connexes
B C E
Programme principal
∀ v ∈ N FAIRE Marque[v] ← non visité.
∀ v ∈ N FAIRE
SI Marque [v] ≠ visité ALORS Fouille (v) {FEP’ ou FEL selon le cas}
Efficacité: O (Max (a, n))
2 3 4
5 6 7 8
2 3 4
5 6 7 8
Exemple 1
Retrouver son chemin dans un labyrinthe en évitant de tourner en rond.
Exemple 2
Placer 8 reines sur un échiquier de telle sorte qu’aucune d’entre elles ne soit
prise par une autre.
Stratégie 2: Éviter de mettre plus d’une reine sur une même ligne.
88 ≡ 16 777 216 cas à examiner
Nous représentons un échiquier par un vecteur de 8 entiers donnant la
position de chaque reine sur sa ligne.
POUR i1 ← 1 à 8 FAIRE
POUR i2 ← 1 à 8 FAIRE
...
...
POUR i8 ← 1 à 8 FAIRE
Essai ← (i1, i2, ..., i8)
SI Solution (Essai) ALORS
Ecrire Essai ; Stop
Écrire “il n’y a pas de solution”.
Stratégie 3: Éviter en outre de mettre deux reines sur une même colonne.
⇒ l’échiquier est représenté par une permutation de (1, 2, ..., 8).
8! ≡ 40 320 cas possibles
Forme de l’algorithme
Essai ← permutation initiale.
TANT QUE non Solution (essai) ET essai ≠ permutation finale FAIRE
Essai ← permutation suivante.
SI Solution (essai) ALORS Écrire essai.
SINON {Essai = permutation finale} Écrire “pas de solution”.
Algorithme
PROCÉDURE Perm (i)
SI i = n ALORS Traiter (T) {T est une nouvelle permutation}
SINON {i < n}
POUR j ← i à n FAIRE
{Mettre T [j] en tête}
Interchanger T[i] et T [j]
{Générer et traiter toutes les permutations correspondantes}
Perm (i+1)
{Remettre T[j] à la place qu’il avait}
Interchanger T[i] et T[j].
FIN Perm.
où T[1..n] est initialisé à [1,2,...,n],
l’appel initial est Perm (1).
Remarque
Traiter (T) peut désigner : «SI Solution (T) ALORS Stop».
T = [1, 2, 3, 4]
j=1
T = [1, 2, 3, 4] j=2
T = [1, 2, 3, 4] j = 3 T = [1, 2, 3, 4]
j=4
Perm(4)
T = [1, 2, 3, 4]
Perm(3)
j = 4 T = [1, 2, 4, 3]
Perm(4) j=4
T = [1, 2, 4, 3]
j=3
T = [1, 3, 2, 4] j = 3 T = [1, 3, 2, 4]
j=4
Perm(4)
T = [1, 3, 2, 4]
Perm(2)
Perm(3)
j = 4 T = [1, 3, 4, 2]
Perm(1)
j=4
Perm(4)
T = [1, 3, 4, 2]
j=4
T = [1, 4, 3, 2] j = 3 T = [1, 4, 3, 2]
j=4
Perm(4)
T = [1, 4, 3, 2]
Perm(3)
j = 4 T = [1, 4, 2, 3]
j=4
Perm(4)
T = [1, 4, 2, 3]
Exercice
Pour montrer que Perm (1) génère toutes les permutations, montrons que:
Perm (i) génère toutes les permutations possibles des n–i+1derniers
éléments (positions i, i+1, ..., n), en de la manière suivante:
• toutes les permutations commençant par l’un quelconque de ces éléments
sont générées de manière consécutive,
• T est dans la configuration initiale à la fin de chacun de ces groupes.
Preuve
Procédons par induction sur i, en allant “à l’envers” de n à 1.
Base de l’induction: Perm (n). Trivial (T n’est pas modifié du tout).
Boucle d’induction: Perm (i) avec i < n.
Supposons que chaque appel à Perm (k), k = i+1, ..., n :
• (H1) génère toutes les permutations des positions {k, k+1, ..., n},
• (H2) laisse T inchangé.
Examinons alors le comportement de Perm (i).
Le corps de boucle de l’algorithme Perm se compose de trois instructions:
I1 (échange initial T[i] ↔ T[j]), I2 (appel à Perm (i+1)), et I3 (échange final).
Chaque exécution de I2 génère toutes les permutations possibles des
éléments en positions {i+1, ..., n} (d’après H1), donc toutes les permutations
des positions {i, i+1, ..., n} commençant par une même valeur en position i.
D’après H2, chaque exécution de I2 laisse T inchangé. L’état de T après I2
est donc le même que l’état de T après I1, donc le même que si I2 n’existait
pas. Ainsi, I3 a pour effet de remettre T dans l’état où il était avant exécution
de I1, c’est-à-dire dans l’état où il était au moment de l’entrée dans le corps
de boucle. Cet état est donc un invariant de cette boucle, ce qui montre que:
• l’élément en position i est successivement chacun des éléments de
l’ensemble {T[i], T[i+1], ..., T[n]}; donc toutes les permutations des positions
{i, i+1, ..., n} sont générées, ce qui prouve H1 pour i;
• l’état de T à la fin du dernier tour de boucle (j=n), donc à la sortie de
Perm(i), est le même que l’état de T avant le premier tour de boucle (j=i),
suite à l’entrée dans Perm(i), ce qui prouve H2 pour i.
Analyse d’Algorithmes 2001 Ch. 9 - EXPLORATION DE GRAPHES 27
6. Algorithmes à retour arrière (suite)
a si k = 1
t (k) =
n
∑ [2b + t(k–1)] sinon (deb laestpermutation
le temps
)
j=n–k+1
a si k = 1
t (k) =
k–1
k!
(k!) a + 2b ∑ (k–j)! sinon
j=1
k!
d'où (en majorant (k–j)! par k!):
t(n) ∈ O (a (n!) + 2b (n+1)!)
Principe général
Notes.
a) #N = 2057 (tandis que 8! = 40320)
b) En associant à chaque nœud prometteur les ensembles de colonnes,
de diagonales positives, et de diagonales négatives, contrôlées par les
reines en place, il est facile de décider si un vecteur est k-prometteur,
sachant qu’il est une extension d’un vecteur (k-1)-prometteur.
Algorithme
k ième ligne
Note: Dans certains cas, une fouille en largeur est préférable, soit parce
que le graphe est infini, soit parce que l’application s’y prête mieux
(par exemple s’il s’agit de minimiser le nombre de manipulations).
Stratégie
• si cette borne est telle qu’aucune solution éventuelle ne peut être meilleure
qu’une solution déjà trouvée, on abandonne l’exploration de cette partie
du graphe.
Ainsi, quels que soient i et j à l’extérieur du chemin déjà connu i1, ..., ip :
Exemple
10
1 2
5
15 13
6 9
Coût certain à 1: 0
1 Départ de 1: 5
Passage par 2: 5 + 2,5 = 7,5
Borne 22.5 Passage par 3: 4,5 + 3 = 7,5
Arrivée à 1: 2,5
Total: 22,5
Soit à calculer
n
Min F(X) = ∑ ai xi
i=1
sujet à
Bx = c
où les ai sont des réels, B est une matrice de réels, c un vecteur de réels, et
x le vecteur à calculer des booléens xi ∈ {0, 1} (i = 1, 2, ..., n).
NIL
Bornes inf. & sup.
x1 = 0 x1 = 1
–
x1 x1
Bornes inf. & sup. Bornes inf. & sup.
x2 = 0 x2 =
etc.