Vous êtes sur la page 1sur 28

Chapitre1 : Les algorithmes de recherche

I. Définition et concepts de base


1. Définition

Graphe: est la donnée d'un ensemble de nœuds appelés sommets et d'un ensemble
de lignes appelées arêtes qui relient certains sommets entre eux.

Degré d’un sommet:


● Terminologie:
Dans le cas d’un graphe orienté G = (S, A),
Si a = (s1, s2) ∈ A est un arc de G, les sommets s1 et
s2 sont les extrémités de a :
- s1 est le début (ou l’origine) de a et s2 est la fin (ou l’extrémité finale) de
a.
- On dit aussi que s2 est un successeur de s1 et que s1 est un prédécesseur
de s2.
Si les deux extrémités d’un arc sont égales, l’arc est une boucle.
- On note G(s) l’ensemble des successeurs du sommet s
: G(s) = {t ∈ S | (s, t) ∈ A}
- On note G -1 (s) l’ensemble des prédécesseurs du sommet s :
G -1 (s) = {r ∈ S | (r, s) ∈ A}

● On appelle degré entrant d’un sommet x et on note d-(x) le nombre d’arcs dont
l’extrémité est x, c’est à dire le nombre de prédécesseurs de x :
d-(x) = |G-1 (x)|
● On appelle degré sortant d’un sommet x et on note d + (x) le nombre d’arcs
dont l’origine est x, c’est à dire le nombre de successeurs de x :
d + (x) = |G(x)|
● On appelle degré total d’un sommet x et on note d(x) le nombre d’arcs dont x
est l’origine ou l’extrémité (en comptant deux fois les boucles) :
d(x) = d - (x) + d + (x)
● Si G est un graphe non orienté, on définit de la même façon le degré d(x)
d’un sommet x comme le nombre d’arêtes ayant x pour extrémité (en
comptant deux fois les boucles).

1
Exemple:

d_(1)=4 d+(1)=2 d(1)=6


d_(2)=1 d+(2)=1 d(2)=2
d_(3)=1 d+(3)=1 d(3)=2
d_(4)=1 d+(4)=2 d(4)=3
d_(5)=1 d+(5)=2 d(5)=3

Sous-graphe: Soit G = (S, A) un graphe (orienté ou non). Un sous-graphe de G est


un graphe G’= (S’ , A’) tel que S’ ⊂ S et A’ ⊂ A.
Exemple:

Sous-graphe induit: Un sous-graphe G’ = (S’ , A’ ) d’un graphe G = (S, A) est un


sous-graphe induit si A’ est formé de tous les arcs (ou arêtes) de G ayant leurs
extrémités dans S’ c’est-à-dire ∀x, y ∈ S’ , (x, y) ∈ A’ ⇔ (x, y) ∈ A.
Exemple:

2
Sous-graphe induit par
S’ = {1, 3, 4}

Sous-graphe couvrant: Un sous-graphe G’ = (S’ , A’ ) d’un graphe G = (S, A) est


couvrant si il contient tous les sommets de G c’est-à-dire S ’ = S.

Graphe valué: Un graphe (orienté ou non) G = (S, A) est valué si il est muni d’une
application
v:A→R
(x, y) → v(x, y)
qui sera appelée valuation. On peut étendre la valuation en une fonction
S × S → R ∪ {+∞} en posant v(x, y) = +∞ si (x, y) n’appartient pas à A.

Graphe probabiliste: un graphe probabiliste est un graphe orienté et pondéré tel


que :
- Les sommets du graphe sont les issues possibles d’une expérience aléatoire
;
- Le poids d’une arête orientée partant du sommet i et allant vers le sommet j
est la probabilité
conditionnelle d’obtenir l’issue j à l’étape n+1 sachant que l’on a obtenu i
précédente (à l’étape n).

3
Exemple:

2. Types de graphes
D’une manière générale, on distingue deux grands types de graphes:
● Les graphes orientés G=(S,A)
○ S étant l’ensemble de tous les sommets du graphe
○ A l’ensemble des arcs (Un arc est la donnée d’un couple (x,y) de sommets de
G ayant une origine et une extrémité et étant matérialisée par une flèche allant
de l’origine vers l’extrémité).
Exemple:

● Les graphes non orientés G=(S,A)


○ S étant l’ensemble de tous les sommets du graphe
○ A l’ensemble des arêtes

4
Exemple: Reprenons l’exemple précédent en construisant le graphe non orienté
correspondant

On distingue également d’autres types de graphes:


➢ les graphes arborescents ou hiérarchiques: ils ont des noeuds parents et des noeuds
enfants et un enfant ne peut avoir qu’un seul parent.
➢ Les graphes cycliques: ils comprennent certains chemins circulaires
➢ Les graphes polaires ou multipolaires: de nombreux noeuds sont rattachés à d’autres
noeuds appelés pôles
➢ Les graphes réguliers: les sommets et les arêtes produisent un schéma régulier
➢ Les multigraphes: il peuvent contenir plusieurs arcs ayant les mêmes extrémités
➢ Les graphes non-structurés: sans topologie remarquable

3. Représentation des graphes

On peut représenter un graphe de 3 manières différentes à savoir :


● La représentation sagittale
● Le dictionnaire d’un graphe
● Matrices d’adjacence

a. Représentation sagittale

C’est la représentation d’un graphe sous forme de dessin. C’est la plus intuitive.

5
b. Dictionnaire d’un graphe

Encore appelée liste d’adjacence, elle est très utile lorsqu’on souhaite représenter un
graphe en machine sous forme de structure de données. Elle consiste à donner l’ensemble des
sommets du graphe, et pour chaque sommet la liste de ses successeurs.
Exemple : En utilisant l’exemple précédent, on a :
𝑆 = {1, 2, 3, 4}
𝐺(1) = { 2}, 𝐺(2) = {1, 4}, 𝐺(3) = {3, 4} , 𝐺(4) = { }

c. Matrice d’adjacence

Si on considère un graphe 𝐺 = (𝑆, 𝐴) un graphe dont les sommets sont numérotés de 1


à n. La matrice d’adjacence de G est la matrice carrée 𝑀 = 𝑚𝑖𝑗 , de taille 𝑛 × 𝑛, définie par
:

En prenant notre exemple, on a :

6
II. Connexité d’un graphe
a) Chemin
Soit G = (S, A) un graphe orienté. Un chemin C est une suite (x0, x1, . . ., xn-1, xn) de sommets
de G tel que deux sommets consécutifs quelconques xi et xi+1 sont reliés par un arc de G :
∀ i, 0 ≤ i ≤ n - 2, (xi, xi+1) ∈ A Les sommets x0 et xn sont respectivement l’origine
et l’extrémité du chemin C. Le chemin C est formé de n + 1 sommets et de n arcs mis bout à
bout, sa longueur est n. Un chemin peut comporter un seul sommet et être de longueur 0.
Exemple :
(3, 1, 5) est un chemin, (1, 3, 4) n’est pas un chemin, (2) est un chemin, (4, 1, 2, 5) n’est pas un
chemin, (2, 1, 5, 2, 1, 3, 1, 3) est un chemin, (4, 4, 4, 4, 4, 4) est un chemin.
b) Circuit
On appelle circuit un chemin de longueur non nulle et dont l’origine et l’extrémité sont
identiques. Un chemin est dit :
• simple si il ne passe pas deux fois par le même arc
• élémentaire s' il ne passe pas deux fois par le même sommet (à l’exception de l’origine
et l’extrémité pour un circuit).
Remarque : élémentaire ⇒ simple

c) graphes connexes et composantes connexes


Un graphe non orienté est connexe si pour tout couple de sommets x, y il existe une chaîne
reliant x à y. Un graphe orienté est connexe si le graphe non orienté associé est connexe.
Exemple
Une composante connexe C d’un graphe G = (S, A) est un sous-ensemble
maximal de sommets tels que deux quelconques d’entre eux soient
reliés par une chaîne : si x ∈ C, alors ∀ y ∈ C, il existe une chaîne
reliant x à y, ∀ z ∈ S \ C, il n’existe pas de chaîne reliant x à z.
Les composantes connexes d’un graphe G = (S, A) forment une partition de S.
Un graphe est connexe si et seulement s' il a une seule composante connexe.
Le sous-graphe induit par une composante connexe C est connexe.
La composante connexe C qui contient un sommet x ∈ S est C = {y ∈
S | il existe une chaîne reliant x à y}
Exemple

Ce graphe a deux composantes connexes : {a, c, e} et {b, d, f }.

Ce graphe a quatre composantes connexes : {}, {2, 6}, {3, 5, 7}, et {4}.

Un graphe orienté est fortement connexe si pour tout couple de sommets x, y il existe un
chemin reliant x à y.
Remarque : la définition implique que si x et y sont deux sommets d’un graphe fortement
connexe, alors il existe un chemin de x à y et un chemin de y à x.
Exemples :
Théorème
Un graphe orienté fortement connexe est connexe.
Théorème

7
Un graphe est fortement connexe si et seulement si pour tout couple de sommets x, y il existe
un circuit passant par x et y.
Une composante fortement connexe C d’un graphe G = (S, A) est un sous
ensemble maximal de sommets tels que deux quelconques d’entre eux
soient reliés par un chemin : si x ∈ C, alors ∀ y ∈ C, il existe un
circuit passant par x et y, ∀ z ∈ S \ C, il n’existe pas de circuit
passant par x et z.
Les composantes fortement connexes d’un graphe G = (S, A) forment une partition de S.
Un graphe est fortement connexe si et seulement si il a une seule composante fortement
connexe.
Le sous-graphe induit par une composante fortement connexe C est fortement connexe.
La composante fortement connexe C contenant un sommet x est :
{y ∈ S | il existe un chemin reliant x à y et un chemin reliant y à x}
Exemple

Ce graphe a deux composantes fortement connexes : {a, b} et {c}.

Ce graphe a trois composantes fortement connexes :{1, 7}, {2, 3, 5, 6} et {4}.

d) Cycles (resp circuits) eulériens


Au 18e siècle un casse-tête est populaire chez les habitants de Konigsberg : est-il possible de
se promener dans la ville en ne passant qu’une seule fois par chacun des sept ponts de
Konigsberg? C’est le célèbre mathématicien Euler qui montre le premier que ce problème n’a
pas de solution, en utilisant pour la première fois la notion de graphe.

Soit G un graphe non orienté. Une chaîne (respectivement un cycle) eulérienne est une chaîne
(resp. un cycle) qui passe une et une seule fois par toutes les arêtes de G. On définit les mêmes
notions pour un graphe orienté G : un chemin ou un circuit eulérien est un chemin ou un circuit
passant une et une seule fois par tous les arcs de G.
Ce graphe admet un cycle eulérien.
Conditions nécessaires et suffisantes
Les conditions précédentes sont en fait suffisantes.
Théorème
Un graphe G =(S, A) admet un cycle (cas non orienté) ou un circuit (cas orienté) eulérien si et
seulement si les deux conditions suivantes sont vérifiées :
• le graphe G est connexe
• ∀ x ∈ S, d(x) est pair (cas non orienté), ∀ x ∈ S, d+(x) = d-
(x) (cas orienté)
Théorème
Un graphe G =(S, A) admet une chaîne (cas non orienté) ou un chemin (cas orienté) eulérien(ne)
si et seulement si les deux conditions suivantes sont vérifiées :
• graphe G est connexe
• Pour tous les sommets x sauf éventuellement deux, d(x) est pair (cas non orienté),
pour tous les sommets x sauf éventuellement deux, d+(x) = d-(x), les deux derniers vérifiant
d+(x) = d-(x) ± 1 (cas orienté)

8
e) Cycles hamiltoniens
Soit G un graphe non orienté. Un cycle (respectivement une chaîne) hamiltonien est un cycle
(resp. une chaîne) qui passe une et une seule fois par tous les sommets de G. On définit les
mêmes notions pour un graphe orienté G : un circuit ou un chemin hamiltonien est un circuit
ou un chemin passant une et une seule fois par tous les sommets de G.
Conditions nécessaires et suffisantes
Question : comment déterminer si un graphe admet des cycles (circuits) hamiltoniens ?
Contrairement au cas des cycles eulériens, il n’existe pas de réponses
simples : ce problème est algorithmiquement difficile.
f) Graphes valués
Un graphe (orienté ou non) G = (S, A) est valué si il est muni d’une application
v:A→R
(x, y) → v(x, y) qui sera appelée valuation. On peut étendre la valuation en une fonction
S × S → R ∪ {+∞} en posant v(x, y) = +∞ si (x, y) n’appartient pas A.

g) Théorème d' Euler

Le théorème d'Euler, appelé aussi théorème d'Euler-Hierholzer, se décline en deux


caractérisations :
- Un graphe connexe admet un parcours eulérien si et seulement si ses sommets sont tous
de degré pair sauf au plus deux.
- Un graphe connexe admet un circuit eulérien si et seulement si tous ses sommets sont
de degré pair.

h) Théorème de Hamilton

Un graphe est hamiltonien si et seulement si sa fermeture est hamiltonienne. En particulier, si


la fermeture d'un graphe est le graphe complet, qui est hamiltonien, on est sûr que le graphe
de départ est hamiltonien.

III. Algorithmes du plus court chemin entre 2 sommets

A. Définition
● Un chemin est une suite de sommets consécutifs. On peut encore le définir comme une suite
d’arcs aux sommets consécutifs.
● La valuation d’un chemin est la somme des valuations des arcs du chemin.
● Le plus court chemin entre 2 sommets est le chemin qui possède la plus petite valuation.
● Dans un graphe, on peut avoir plusieurs chemins entre 02 sommets donnés. Un problème auquel
on est très souvent confronté est la recherche du plus court chemin:
○ La recherche du plus petit itinéraire dans une carte
○ La recherche du plan le moins coûteux.
● Il existe plusieurs algorithmes de recherche du plus court chemin parmi lesquels:
○ L’algorithme de Dijkstra
○ L’algorithme de Bellman-Ford

9
B. L’algorithme de Bellman-Ford
C’est un algorithme qui permet de résoudre le problème du plus court chemin dans un graphe à
origine unique avec des arcs pouvant avoir des valuations négatives. Cette algorithme permet de
déterminer le plus court chemin vers tous les autres nœuds, de plus
S’il existe un circuit absorbant entre 2 nœuds, alors il n’existe pas de chemin minimal entre ces 2
nœuds.
L’algorithme de Bellman-Ford a 2 variantes: algorithme de Bellman-Ford et algorithme de Bellman-
Ford améliorer.
- Algorithme de Bellman-Ford:
l’algorithme de Bellman-Ford consiste à déterminer itérer sur l’ensemble des nœuds
du graphes en mettant à jour les distances de ces nœuds, du nœud de départ et ceci tant
qu'aucun nœud n’a été mis à jour.

Algorithme

Initialisation:
d(x0) = 0
P(x0) = null
Pour s dans S faire
d(s) = +∞
P(s) = null

fin = faux
tantque fin = faux faire
fin = vrai
Pour x dans S faire
Pour y dans G(x) faire
si d(x) + v(x, y) < d(y) alors
d(y) = d(x) + v(x, y)
P(x) = y
fin = faux
finsi
finpour
finpour
fintantque

- Algorithme de Bellman-Ford améliore:


L’algorithme de Bellman-Ford consiste à exécuter l'algorithme de Bellman-Ford en
introduisant une liste L qui contient tous les nœuds qui ont été mis a jour après une itération et
ces nœuds qui seront parcourus aux itérations qui suivent. Initialement, L ne contient que le
nœud de départ.

10
Algorithme

Initialisation:
d(x0) = 0
P(x0) = null
Pour s dans S faire
d(s) = +∞
P(s) = null

L = {x0}
tantque L non vide faire
choisis x dans L
L = L\{x}
Pour y dans G(x) faire
si d(x) + v(x, y) < d(y) alors
d(y) = d(x) + v(x, y)
P(x) = y
L = L ∪{y}
finsi
finpour
fintantque

Exemple

11
C. L’algorithme de Dijkstra
1. Principe
L’algorithme de Dijkstra est un algorithme plus efficace que l’algorithme de Bellman-Ford,
mais dont l’hypothèse de départ est que toutes les valuations des arcs sont positives.
Principe:
● On construit petit à petit, à partir de {𝑥0 } un ensemble 𝑀 de sommets marqués. Pour
tout sommet marqué 𝑠, l’estimation 𝑑(𝑠) = 𝑑(𝑥0 , 𝑠).
● A chaque étape, on sélectionne un sommet non marqué 𝑥 dont la distance estimée 𝑑(𝑥)
est la plus petite parmi tous les sommets non marqués.
● On marque alors 𝑥 (on ajoute 𝑥 à 𝑀), puis on met à jour à partir de 𝑥 les distances
estimées des successeurs non marqués de 𝑥.
● On recommence, jusqu’à épuisement des sommets non marqués .

2. Algorithme

12
3. Exemple

13
IV. Arbres

1. Définition des concepts


● Un graphe G est dit connexe s’il existe un chemin reliant chaque pair de sommets de G.

● Une composante connexe d’un graphe G est un sous-graphe connexe maximal de G.

● Arbre : est un graphe non orienté, connexe, sans cycle.

● Forêt est un graphe non orienté sans cycle (chacune de ses composantes connexes est un arbre).

NB: Ici, on ne privilégie aucun sommet en particulier. Les arbres classiquement étudiés en
algorithmique sont des arbres enracinés, que l’on verra plus loin.

● Un arbre enraciné est un graphe non orienté connexe sans cycle ayant un unique sommet
sans prédécesseur (la racine),tous ses autres sommets ont exactement un prédécesseur. Il est
souvent muni d’une orientation naturelle : on oriente chaque arête de telle sorte qu’il existe
un chemin de la racine à tout autre sommet.
➔ Exemple 1:

14
➔ Exemple 2:

est un arbre enraciné en C.


● Arbre couvrant est un sous-graphe de G(G un graphe valué non orienté connexe) couvrant
(i.e. contenant tous les sommets), connexe et sans cycle. Son poids est la somme des
valuations de ses arêtes.
● Arbre couvrant de poids minimal: est un arbre couvrant dont le poids est le plus petit possible
parmi les arbres couvrants de G. L'arbre couvrant minimum peut s'interpréter de différentes
manières selon ce que représente le graphe. De manière générale si on considère un réseau où
un ensemble d'objets doivent être reliés entre eux (par exemple un réseau électrique et des
habitations), l'arbre couvrant minimum est la façon de construire un tel réseau en minimisant
un coût représenté par le poids des arêtes (par exemple la longueur totale de câble utilisée pour
construire un réseau électrique).

NB: Si toutes les arêtes ont des valuations positives, son poids est le plus petit possible parmi tous les
sous-graphes connexes couvrants de G.

15
2. Algorithme de Recherche des arbre couvrant de poids minimum

a. Description du problème :

On considère un graphe connexe non-orienté et pondéré : chaque arête possède un poids qui est un nombre
qui représente le coût de cette arête. Dans un tel graphe, un arbre couvrant est un sous-graphe connexe sans
cycle qui contient tous les sommets du graphe. Le poids d'un tel arbre est la somme des poids des arêtes qui
le compose. Un arbre couvrant minimum est un arbre couvrant dont le poids est inférieur ou égal à celui de
tous les autres arbres couvrants du graphe. L'objectif de l'algorithme de Kruskal est de calculer un tel arbre
couvrant minimum.
Ce problème a de nombreuses applications, par exemple simplifier un câblage ou supprimer les liaisons
maritimes les moins rentables en préservant l'accessibilité aux différents ports.

3. Algorithme de PRIME
a. Historique :
L'algorithme a été développé en 1930 par le mathématicien tchèque Vojtech Jarnik, puis a été redécouvert
et publié par Robert C. Prim2 et Edsger W. Dijkstra en 1959. Ainsi, il est parfois appelé DJP algorithm,
Jarník's algorithm, Prim–Jarník algorithm, ou Prim–Dijkstra algorithm.

b. Principe :
On construit un sous-graphe en ajoutant arêtes et sommets les un après les autres. A chaque étape, on
cherche l’arête sortante de plus petite valuation. Une arête est sortante si elle joint un sommet du sous-
graphe à un sommet qui n’est pas dans le sous-graphe. On ajoute alors l’arête et le sommet qu’elle joint
au sous-graphe. On termine dès que l’on a sélectionné n − 1 arêtes.

c. Algorithme :

Algorithme 1 : Algorithme de PRIM


Entrées: (S, A) ensemble des sommets et arêtes du graphe
Sorties: L’arbre couvrant de poids minimum

1: Initialisation
2: A = ensemble des arêtes du graphe G.
3: F = 0 (ensemble des arêtes de l’arbre couvrant)
4: M = {xo} (on marque un sommet quelconque de G).

4: Tant qu’il existe des arêtes sortant de M répéter


5: Chercher l’arête sortante e=(x,y) de plus petite valuation
6: (e sortante : x dans M et y n’est pas dans M)
7: M ← M + {Y}
8. F ← F + {e}
9: Fin tant que
10: return F

16
➔ Commentaires sur l’algorithme :
● A chaque étape de l’algorithme, on obtient un sous-graphe partiel qui est
un arbre, et qui grossit jusqu’à devenir couvrant.
● Si le graphe G est bien connexe, le choix du sommet initial n’est pas important : tous les
sommets finissent par être visités par l’algorithme.
● Si le graphe G n’est pas connexe, l’algorithme donne un arbre couvrant de poids minimum sur
la composante connexe de G contenant le sommet initial.

Exemple: Considérons le graphe ci dessous et construisont le arbre couvrant de poid minimal en utilisatn
l’algorithme de Prime

On choisit le noeud initial et on applique l’algorithme décrit plus haut

1) 2)

On détermine les arrêts sortant

3) 4)

On détermine une fois de plus les arrêts


sortant et on choisit l’arrêt avec le poid
On choisit l’arrêt avec le poid minimal minimal

5) 6)

17
7) 8)

9) 10)

11) 12)

13) 14)

18
15) 16)

17)

4. Algorithme de KRUSKAL
a. Historique :
En informatique, l'algorithme de Kruskal est un algorithme de recherche d'arbre recouvrant de poids
minimum (ARPM) ou arbre couvrant minimum (ACM) dans un graphe connexe non-orienté et pondéré. Il
a été conçu en 1956 par Joseph Kruskal.

b. Principe :
On construit un sous-graphe en ajoutant des arêtes une par une. A chaque étape, on cherche l’arête de
plus petite valuation parmi celles que l’on n’a pas déjà explorées. Si elle ne crée pas un cycle, on l’ajoute
au sous-graphe, sinon on la laisse de côté. On termine dès que l’on a sélectionné n – 1 arêtes, ou qu’il
ne reste plus d’arêtes ne créant pas de cycles.

c. Algorithme :

19
Algorithme 1 : Algorithme de KRUSKAL
Entrées: (S, A) ensemble des sommets et arêtes du graphe
Sorties: Arbre couvrant de poid minimum

1: Initialisation
2: A = ensemble des arêtes du graphe G.
3: F = 0 (ensemble des arêtes de l’arbre couvrant)

4: Trier l’ensemble A des arêtes de G par valuation croissante

5: Pour tout e dans A (parcouru dans l’ordre croissant) répéter


6: si F + {e} est acyclique alors:
7: F ← F + {e}
8: Fin pour

9: return F

➔ Commentaires sur l’algorithme :


● A la ligne 3, le 0 représente l’ensemble vide
● Aux lignes 6 et 7, le + représente l’opération UNION d’ensemble
● A chaque étape de l’algorithme, on obtient une forêt couvrante (i.e. un sous graphe
couvrant sans cycle), qui grossit jusqu’à devenir un arbre
● Si le graphe G n’est pas connexe, l’algorithme donne un arbre couvrant de poids minimum
sur chaque composante connexe de G
● La partie la plus coûteuse de l’algorithme de KRUSKAL est en fait le tri initial des arêtes

➔ Exemple : considérons le graphe ci-dessous et construisons l’arbre de poids minimal issu de


ce dernier.

● On considère les sommets du graphe

20
● on considère les arrêts de poids minimal

● On choisit un arrêt aléatoirement de façon à ne pas former un cycle qu’on met en rouge.
On utilise tous les arrêts ayant le poids minimal puis on choisit de nouveau le poids
minimal et on recommence le processus.

21
...

● On obtient un arbre recouvrant de poids 14.

22
V. Heuristique
1. Définitions
Une heuristique h est une fonction d’estimation du coût restant entre entre un nœud quelconque d’un
graphe et le but(le nœud à atteindre).

Un algorithme admissible est un algorithme qui garantit toujours de trouver le chemin le plus court
pour atteindre un but. Lorsqu’elle utilise une heuristique qui la rend admissible, l’heuristique elle-même
est qualifiée d’heuristique admissible.

2. Algorithme Best-First

La recherche best-first (littéralement : le meilleur en premier) est un algorithme de recherche


qui parcourt un graphe en explorant le nœud le plus "prometteur" selon une règle spécifique. La
recherche best-first est décrite comme l’estimation de qualité d’un noeud n par une fonction heuristique
d'évaluation h(n) qui, en général, peut dépendre de la description de n, de l'état d'arrivée, des
informations amassées par l'algorithme au moment de l'évaluation et, surtout, de connaissances
supplémentaires à propos du problème.

a) Algorithme
L’algorithme est le suivant :

b) Exemple :

23
Initialisation : OUVERT {A,B}, FERME {S}
1- OUVERT {A}, FERME {S,B}
2- OUVERT {E,F,A}, FERME {S,B}
3- OUVERT {E,A}, FERME {S,B,F}
4- OUVERT {I,G,E,A}, FERME{S,B,F}
5- OUVERT {I,E,A}, FERME{S,B,F,G}
Le chemin optimal pour arriver au point G est donc : SBFG

24
3. Algorithme de recherche Greedy Best first
L’algorithme Greedy Best-first (meilleur d’abord glouton) est un cas particulier de l’algorithme
Best-First où la fonction d’évaluation est choisie comme étant la fonction heuristique : f(n) = h(n). Par
conséquent, BFS gourmand essaie d'étendre le nœud qui est considéré comme le plus proche de
l'objectif, sans prendre en compte les connaissances précédemment collectées (c'est-à-dire g(n)).

a) Principe
Le principe est le même que celui de Best-First search à la différence qu’à chaque étape, on choisit le
nœud pour lequel la fonction heuristique est minimale.

b) Exemple :

Itération Open Closed

1. (a, 9, void) vide

2. (b, 5, a), (c, 2, a), (d, 2, a) (a, 9, void)

3. (f, 3, c), (b, 5, a), (d, 2, a) (a, 9, void), (c, 2, a)

4. (g, 0, f), (b, 5, a), (d, 2, a) (a, 9, void), (c, 2, a), (f, 3, c)

5. return (g, f, c, a)

25
c) Caractéristiques
L’algorithme greedy best-first search a les caractéristiques suivantes:
● Complétude : non complet
● Optimal : non optimal
● Complexité en temps : O(b^m)
● Complexité en espace : O(b^m)

4. Algorithme A et A*

a) Présentation
Dans cette partie nous présenterons l’algorithme de parcours général d’un graphe

b) Principe

● soit la fonction d'évaluation f(n)


f(n) = g(n) + h(n)

● Best-First + f(n) comme fonction d’évaluation = Algorithme A


● Si en plus f(n) est telle que :
➔ g(n) = coût du chemin jusqu’à n
➔ h(n) = une fonction heuristique admissible

Alors l'algorithme “greedy search” avec la fonction f(n) est appelé algorithme A*

26
c) Exemple: Recherche d’un chemin entre deux villes (Algorithme A*)

★ no ville de départ
★ n6 destination
★ h distance à vol d'oiseau
★ c distance réelle entre deux villes

Contenu de Open à chaque itération (état, f, parent): Contenu de closed à chaque itération

1. (n0, 9, null) 1. vide

2. (n1, 5, n0); (n2, 6, n0); (n3,7,n0) 2. (n0, 9 , null)

3. (n2, 6, n0); (n3,7,n0); (n5, 12, n1); 3. (n0, 9, null); (n1, 5, n0)

4. (n3,7,n0);(n4,9,n2);(n5, 12, n1); 4. (n0, 9, null); (n1, 5, n0);(n2, 6, n0)

5. (n2,5,n3);(n4,6,n3);(n5, 12, n1); 5. (n0, 9, null); (n1, 5, n0);(n3,7,n0)

6. (n4,6,n3);(n5, 12, n1); 6. (n0, 9, null); (n1, 5, n0);(n3,7,n0);(n2,5,n3)

7. (n6,7,n4);(n5, 12, n1); 7. (n0, 9, null); (n1, 5, n0);(n3,7,n0);(n2,5,n3); (n4,6,n3)

Solution: n0,n3,n4,n6

27
c) caractéristiques

● A ∗ utilise une heuristique admissible


★ h(n) ≤ h ∗(n) o`u h ∗(n) est le coût réel pour aller de n jusqu'à
l'état final
★ Une heuristique admissible ne surestime jamais le coût réel pour atteindre le but. Elle
est optimiste

● Si h(n) = 0 pour tout n, alors A∗ est équivalent à l'algorithme de Dijkstra de calcul du plus
court chemin
● Théorème : A ∗ est optimale

● Complétude : Oui, sauf s’il y a une infinit´e de nœuds tels que f ≤ f (G)
● Temps : exponentielle selon la longueur de la solution
● Espace : exponentielle (garde tous les nœuds en m´emoire) Habituellement, on manque
d’espace bien avant de manquer de temps
● Optimale : Oui

Bibliographie
[1]« 17_TES_lecon_grapheproba.pdf ». Consulté le: oct. 29, 2021. [En ligne].
Disponible sur:
https://lewebpedagogique.com/valiblog2/files/2018/01/17_TES_lecon_grapheproba.p
df
[2]« Formation ISN - Qu’est-ce qu’un graphe ? » http://math.univ-
lyon1.fr/irem/Formation_ISN/formation_parcours_graphes/graphe/1_notion_graphe.ht
ml (consulté le oct. 29, 2021).
[3] Best first search algorithm in AI
https://www.mygreatlearning.com/blog/best-first-search-bfs/

[4] Intelligence Artificielle Heuristique


http://helios.mi.parisdescartes.fr/~bouzy/Doc/IAL3/03_IA_heuristique_BB.pdf

28

Vous aimerez peut-être aussi