Vous êtes sur la page 1sur 42

Techniques algorithmiques avancées

Plan du cours :

Introduction
Rappel : les graphes
Résolution de problèmes
Les algorithmes de recherche
Recherche aveugle
Recherche heuristique
Algorithme minimax
Algorithme alphabéta
Introduction


Modélisation des problèmes avec des graphes.
Introduction

Le problème des ponts de Koenigsberg dont voici l’énoncé :
“ Peut-on arranger son parcours de telle sorte que l’on passe sur chaque
pont, et que l’on ne puisse y passer qu’une seule fois ? ”

En 1736, le mathématicien suisse Leonhard Euler trouva la réponse.
Rappel : Les graphes


Définitions :

Un graphe non orienté est défini par un couple (S, A) tel que S est un ensemble de sommets et A ⊆ S × S S × S
est un ensemble d’arêtes

La relation binaire est symétrique : (si, sj) ∈ A implique (sj, si) ∈ A . A implique (sj, si) ∈ A implique (sj, si) ∈ A . A .

Chaîne = Séquence de sommets < s0, s1, s2, ..., sk > (notée s0 ∼ sk ) telle que ∀i ∈ [1, k], {si−1, si} ∈ A sk ) telle que ∀i ∈ [1, k], {si−1, si} ∈ Ai ∈ A implique (sj, si) ∈ A . [1, k], {si−1, si} ∈ A implique (sj, si) ∈ A . A

Longueur d’une chaîne = Nombre d’arêtes dans la chaîne

Chaîne élémentaire = Chaîne dont tous les sommets sont distincts

Cycle = Chaîne commençant et terminant par un même sommet

Boucle = Cycle de longueur 1

G = (S, A) est connexe si ∀i ∈ [1, k], {si−1, si} ∈ A(si, sj) ∈ A implique (sj, si) ∈ A . S2 , si ∼ sk ) telle que ∀i ∈ [1, k], {si−1, si} ∈ A sj

Composante connexe de G = sous-graphe de G connexe et maximal
Rappel : Les graphes


Définitions :

Un graphe orienté est défini par un couple (S, A) tel que S est un ensemble de sommets et A ⊆ S × S S × S est un
ensemble d’arcs.

La relation binaire non symétrique : (si, sj) ∈ A implique (sj, si) ∈ A . A n’implique pas (sj, si) ∈ A implique (sj, si) ∈ A . A

Chemin = Séquence de sommets < s0, s1, s2, ..., sk > (notée s0→sk ) telle que ∀i ∈ [1, k], {si−1, si} ∈ Ai ∈ A implique (sj, si) ∈ A . [1, k],(si−1, si) ∈ A implique (sj, si) ∈ A . A

Longueur d’un chemin = Nombre d’arcs dans le chemin

Chemin élémentaire = Chemin dont tous les sommets sont distincts

Circuit = Chemin commençant et terminant par un même sommet

Boucle = Circuit de longueur 1

G = (S, A) est fortement connexe si ∀i ∈ [1, k], {si−1, si} ∈ A(si, sj) ∈ A implique (sj, si) ∈ A . S2, si → sj

Composante fortement connexe = sous-graphe fortement connexe maximal
Rappel : Les graphes


Définitions :
Un arbre est Graphe non orienté G = (S, A) vérifiant les 6 propriétés suivantes :

– G est connexe et sans cycle


– G est sans cycle et possède S − 1 arêtes
– G est connexe et admet S − 1 arêtes
– G est sans cycle, et en ajoutant une arête, on crée un cycle élémentaire
– G est connexe, et en supprimant une arête, il n’est plus connexe
– ∀i ∈ [1, k], {si−1, si} ∈ A(si, sj) ∈ A implique (sj, si) ∈ A . S × S, il existe exactement une chaîne entre si et sj

Une arborescence est un graphe orienté sans circuit admettant une racine s0 ∈ A implique (sj, si) ∈ A . S telle que, pour tout
autre sommet si ∈ A implique (sj, si) ∈ A . S, il existe un chemin unique allant de s0 vers si.
Les graphes


Structures de données pour représenter un graphe :
1-Matrice d’adjacence :

Matrice d’adjacence d’un graphe G = (S, A):est une matrice M telle que
M[si][sj] = 1 si (si, sj) ∈ A, A,

M[si][sj] = 0 sinon

2-Liste d’adjacence :

Tableau Successeur tel que Successeur[si] = liste chaînée des successeurs de si
Parcours d’un graphe


Parcours d’un graphe :
Visite de tous les sommets accessibles depuis un sommet de départ donné S0.

Comment ?

Marquage des sommets par des couleurs :
– Blanc = Sommet pas encore visité
– Gris = Sommet en cours d’exploration
– Noir = Sommet que l’on a fini d’explorer

Au début, le sommet de départ est gris et tous les autres sont blancs

A chaque étape, un sommet gris est sélectionné (Boucle)
– Si tous ses voisins sont déjà gris ou noirs, alors il est colorié en noir
– Sinon, il colorie un (ou plusieurs) de ses voisins blancs en gris
– Jusqu’à ce que tous les sommets soient noirs ou blancs
Parcours d’un graphe
Parcours d’un graphe :
Fonction Parcours(g, s0)
Entrée : Un graphe g et un sommet s0 de g
Sortie : Arborescence ARB du parcours de g à partir de s0


Arborescence associée à un parcours :
si est le père de sj, si c’est sj a été découvert à partir de si
si est racine si, si = s0

Tableau ARB :
ARB[si] = null si, si est racine,
et ARB[sj] = si avec si est le père de sj sinon
Parcours d’un graphe
Parcours en largeur :

Structure : On utilise une file (FIFO) pour stocker des sommets gris.

Fonction Parcours_largeur(g, s0) : Retourne une arborescence ARB de g à partir de s0

Soit f une file (FIFO) initialisée à vide

Pour chaque sommet si de g faire

ARB[si] ← null
– Couleur[si] ← blanc

Enfiler s0 dans f et colorier s0 en gris

Tant que f n’est pas vide faire


Soit si le sommet le plus ancien dans f
Pour chaque sk ∈ A implique (sj, si) ∈ A . succ(si ) faire
Si sk est blanc alors
Enfiler sk dans la file f et colorier sk en gris
ARB[si] ← sk
Défiler si de f et colorier si en noir

Retourne ARB
Parcours d’un graphe

Parcours en largeur :
Complexité temporelle pour un graphe ayant n sommets et m arcs :

O(n + m) (sous réserve d’une implémentation par listes d’adjacence)


Parcours d’un graphe
Parcours en profondeur(préfixe) :
Structure : On utilise une pile (LIFO) pour stocker des sommets gris.
Fonction ParcoursProfondeur(g, s0) : Retourne une arborescence ARB de g à partir de s0
Soit p une pile (LIFO) initialisée à vide
pour tout sommet si ∈ A, S faire
ARB[si] ← null
Couleur[si] ←blanc
Empiler s0 dans p et colorier s0 en gris
Tant que la pile p n’est pas vide faire
Soit si le dernier sommet entré dans p
Dépiler si de p et colorier si en noir
Pour chaque sk ∈ A, succ(si ) faire
Si sk est blanc alors
Empiler sk dans p et colorier sk en gris
ARB[sk] ← si
RetourneARB
Parcours d’un graphe
Parcours en profondeur(postfixe) :
Structure : On utilise la récursivité
procédure ParcoursProfondeur(g, s0) : Retourne une arborescence ARB de g à partir de s0
pour tout sommet si de g faire
ARB[si] ← null
Couleur[si] ←blanc
colorier s0 en gris
Pour tout sk ∈ A, succ(so)
Si sk est blanc alors
ARB[sk ] ← s0
ParcoursProfondeur(g, sk)
colorier s0 en noir
RetourneARB
Parcours d’un graphe

Parcours en profondeur :

Complexité temporelle du parcours en profondeur pour un graphe ayant n sommets et m arcs :

O(n + m) (sous réserve d’une implémentation par listes d’adjacence)


Résolution de problèmes

Les concepts caractérisant le système de résolution de problèmes:


Formulation du problème :
État-transition, Espace de Recherche, Ensemble de règles de transition, État
initial, État but.
Algorithmes de recherche :
Exploration de l’espace de Recherche, Stratégie de recherche, Ordonnancement
des d’actions permettant de passer de l’état initial à l’état but.
Résolution de problèmes
Définitions :
L’état d’un problème est l’ensemble des valeurs prises par les variables à un instant
donnée.
L’espace d’état d’un problème est l’ensemble de tous les états possibles de ce
problème.
Un problème peut se formaliser par les éléments suivants :
– I = état initial
– F = état final
– A = ensemble d'actions qui permettent de changer d'état
– Une fonction successeur, associant à chaque action le nœud résultant
– Une fonction de coût, associant à chaque action un nombre non négative
(le coût de l’action)
Résolution de problèmes
Exemple de problème : voyager d’une ville A vers une ville E le plus rapidement
possible.

Espace d’états : Description (abstraction) du monde réel par la liste des villes reliant
le réseau routiers A, B , C , D, E, F

But : atteindre la ville E

Action : se déplacer d’une ville à une autre

Fonction successeur : se déplacer de A vers B → être dans B

Solution du problème : la liste d’actions menant de l’état initial(A) à l’état final(E).
Résolution de problèmes
Représentation par un graphe d’états :
• On représente l’ensemble des états du problème par un graphe étiqueté

Les sommets sont les états du problème

Il existe un arc (u,v) si une action transforme l’état u en état v,

L'espace d'états c‘est l'ensemble des états possibles obtenus par application
des actions

• Recherche d’une solution = recherche d’un chemin entre le nœud initial et un


nœud but
• Solution = séquence des actions étiquetant les arcs de ce chemin
Résolution de problèmes

Exemple du choux, brebis et le loup :
Algorithmes de recherche
Algorithmes de recherche :

Exploration de l’espace d’états en générant des successeurs d’états déjà
générés : Génération d’un arbre de recherche

On s’arrête lorsqu’on a choisi de développer un nœud qui représente l’état but.

Algorithme de base :
Démarrer la recherche avec une liste contenant l’état initial du problème
Tant que la liste n’est pas vide faire :
Choisir (à l’aide d’une stratégie) un état e à traiter
Si e est un état final alors retourner recherche positive
Sinon, rajouter les successeurs de e à la liste (ou une partie d’entre eux)
Si la liste est vide, retourner recherche négative
Algorithmes de recherche
Stratégie de recherche :


Une stratégie de recherche est définie par l’ordre dans lequel les nœuds sont
développés,

Développement d’état : à chaque étape, l’état choisi sera
– complètement développé
– partiellement développé
Algorithmes de recherche
Stratégie de recherche :

Une stratégie s’évalue en fonction de 4 dimensions :



La complétude : est ce que cette stratégie trouve toujours une solution si
elle existe.

La complexité en temps : durée de la recherche (le nombre de nœuds
générés).

La complexité en mémoire : espace mémoire occupée (le nombre maximum
de nœuds en mémoire).

L’optimalité : est ce que la stratégie trouve toujours la solution la moins
coûteuse.
Algorithmes de recherche
Stratégie de recherche non-informée (aveugle) :


Les stratégies de recherche non-informées utilisent seulement les informations
disponibles dans le problème.

Il existe plusieurs stratégies :
1-Recherche en largeur d’abord.
2-Recherche en coût uniforme.
3-Recherche en profondeur d’abord.
4-Recherche en profondeur limitée.
5-Recherche itérative en profondeur.
Algorithmes de recherche
1-Recherche en largeur d’abord (Breadth First Search / BFS):
Cette méthode de recherche explore les états d’un problème en étendant toujours
le nœud le moins profond.
Algorithmes de recherche
1-Recherche en largeur d’abord: Exemple
Algorithmes de recherche
1- Recherche en largeur d’abord: Exemple
Algorithmes de recherche
1-Recherche en largeur d’abord (Breadth First Search / BFS):
Fonction BFS(problème) retourne solution ou echec
nœud ← avec ETAT=problème.ETAT-INIT ,...
Si problème.BUT-TEST(noeud.ETAT) alors retourner SOLUTION(noeud)
Sinon
frontière ← Liste FIFO
ajouter(noeud, frontière)
visités ← vide
Boucle
Si vide(frontière) alors retourner échec
Sinon nœud← extraire-premier(frontière)
ajouter noeud.ETAT à visités
Pour chaque action dans problème.ACTIONS(noeud.ETAT) faire
fils ← NOEUD-FILS(nœud, action)
Si fils.ETAT n’est pas dans frontière ni dans visités alors
Si problème.BUT-TEST(fils.ETAT) alors
retourner SOLUTION(fils)
Sinon ajouter(fils,frontière)
Fin boucle.
Algorithmes de recherche
1-Recherche en largeur d’abord (Breadth First Search / BFS):

Analyse de l’algorithme de recherche en largeur :

Complétude : oui pour les espaces d’états finis.


Complexité en temps : O(bd)
où d est la profondeur de la solution et b est le facteur de branchement
Complexité en espace : O(bd)
Optimalité : non en général
Algorithmes de recherche
2- Recherche en coût uniforme (Uniform Cost Search):

Le coût d’étapes (d’action) est variable.

Le nœud avec le coût de chemin le plus faible est développé en premier.
Algorithmes de recherche
2- Recherche en coût uniforme (Uniform Cost Search):
Fonction UCS(problème) retourner une solution ou échec
nœud ← avec nœud.ETAT = problème.ETAT-INITIAL et noeud.COÛT-CHEMIN = 0
frontière ← file de priorité triée selon le COÛT-CHEMIN
ajouter( nœud , frontière)
visités ← ensemble vide
Boucle
Si vide(frontière) retourner échec
Sinon nœud← extraire-premier(frontière)
Si problème.BUT_TEST(nœud.ETAT) alors retourner solution(nœud)
Sinon ajouter nœud.ETAT à visités
Pour chaque action dans problème.ACTIONS(nœud.ETAT) faire
fils← FILS-NŒUD(nœud, action)
Si fils.ETAT n’est ni dans frontière ni dans visités alors
ajouter(fils, frontière)
SinonSi frontière contient un nœud n tel que
n.ETAT=fils.ETAT et n.COÛT-CHEMIN > fils.COÛT-CHEMIN
alors remplacer n par fils dans la frontière
Fin boucle
Algorithmes de recherche
2- Recherche en coût uniforme (Uniform Cost Search):

Analyse de l’algorithme de recherche en coût uniforme :

Complétude : oui pour les espaces d’états finis


Complexité en temps / en espace : nombre de nœuds ayant le coût inférieur au coût
de la solution optimale

Optimalité : oui, les nœuds sont développés selon leurs coûts.


Algorithmes de recherche
3-Recherche en profondeur d’abord (Depth First Search):
Algorithmes de recherche
3-Recherche en profondeur d’abord (Depth First Search):
Algorithmes de recherche
3-Recherche en profondeur d’abord (Depth First Search):
Fonction DFS(problème) retourne solution ou echec
nœud ← avec ETATinitialisé à problème.ETAT-INIT , ...
Si problème.BUT-TEST(noeud.ETAT) alors retourner SOLUTION(noeud)
Sinon
frontière ← Liste LIFO
Empiler(nœud ,frontière)

Boucle
Si vide(frontière) alors retourner échec
Sinon
nœud← Dépiler(frontière)
Pour chaque action dans problème.ACTIONS(noeud.ETAT) faire
fils ← NOEUD-FILS(nœud, action)
Si fils.ETAT n’est ni dans frontière alors
Si problème.BUT-TEST(fils.ETAT) alors
retourner SOLUTION(fils)
Sinon
Empiler(fils,frontière)
Fin boucle
Algorithmes de recherche
3-Recherche en profondeur d’abord (Depth First Search / DFS):

Analyse de l’algorithme de recherche en profondeur :


Complétude : Non dans les espaces d’états infinis ou cyclique.
Oui dans les espaces d’états fini, et si on évite les cycles
Complexité en temps : O(bm)
Avec m la profondeur maximale et b est le facteur de
branchement

Complexité en espace : O( b *m ) « la frontière »


Optimalité : Non
Algorithmes de recherche
4-Recherche en profondeur limitée(Depth Limit Search / DLS):


Algorithme de recherche en profondeur d’abord, mais avec une limite l sur la
profondeur.

Les nœuds de profondeur l n’ont pas de successeurs.
Exemple l=2
Algorithmes de recherche
4-Recherche en profondeur limitée(Depth Limit Search / DLS):
Fonction DLS(problème, limite) retourne solution ou echec
nœud ← avec ETAT=problème .ETAT-INIT , Profondeur←0,...
Si problème.BUT-TEST(noeud.ETAT) alors retourner SOLUTION(noeud)
Sinon
frontière ← Liste LIFO
Empiler((nœud avec profondeur), frontière)

Boucle
Si vide(frontière) alors retourner échec
Sinon
(nœud avec profondeur)← Dépiler(frontière)
Si profondeur <limite alors
Pour chaque action dans problème.ACTIONS(noeud.ETAT) faire
fils ← NOEUD-ENFANT(noeud, action)
Si fils.ETAT n’est ni dans frontière alors
Si problème.BUT-TEST(fils.ETAT) alors
retourner SOLUTION(fils)
Sinon
Empiler((fils avec profondeur+1),frontière)
Fin boucle
Algorithmes de recherche
4-Recherche en profondeur limitée (Depth Limit Search / DLS)::

Analyse de l’algorithme :
Complétude : Oui si l >= d,
Non, sinon
Avec d la profondeur de la solution et l la limite maximum

Complexité en temps : O(bl)


Avec b est le facteur de branchement

Complexité en espace : O(b*l) « la frontière »


Optimalité : Non
Algorithmes de recherche
5- Recherche en profondeur itérative (Iterative Deepening Search-IDS) :


Profondeur limitée, mais en augmentant à chaque fois la profondeur: 0, 1, 2, 3, . . .

Combine les avantage de la recherche en largeur (complétude et optimalité) et du
parcours en profondeur (faible complexité en espace).
Algorithmes de recherche
5- Recherche en profondeur itérative (Iterative Deepening Search-IDS) :
Exemple :
Algorithmes de recherche
5- Recherche en profondeur itérative (Iterative Deepening Search-IDS) :

Fonction IDS (problème, limiteMax) retourne solution ou echec


l← 0
Boucle tant que (l <= LimiteMax) faire
Si LDS(problème, l) retourne échec alors incrémenter l
Sinon retourne solution
Fin si
Fin boucle
Retourner échec
Fin Fonction.
Algorithmes de recherche
5- Recherche en profondeur itérative (Iterative Deepening Search-IDS) :

Analyse de l’algorithme IDS:


Complétude : Oui, pour les espaces d’état fini

Complexité en temps : O(bd)


Avec b est le facteur de branchement
d la profondeur de la solution
Complexité en espace : O(b*d) pour la frontière
Optimalité : Non en général
Oui si le coût = 1 pour chaque action

Vous aimerez peut-être aussi