Introduction à l’Intelligence Artificielle et à la Théorie des Jeux
Ahmed Bouajjani
abou@irif.fr
Résoudre un problème par une recherche
Recherche informée
Description Formelle d’un Problème
- Etat initial par où l’agent devra commencer
- Ensemble d’actions possibles (chacune applicable à un ensemble d’états)
- Fonction de transition : état s, action a —> s’ obtenu en appliquant a à s
- Fonction de coût : transition s -a-> s’ —> c(s, a, s’) — distance, temps, …
- Test de l’état but où l’agent devra arriver
Description Formelle d’un Problème
- Etat initial par où l’agent devra commencer
- Ensemble d’actions possibles (chacune applicable à un ensemble d’états)
- Fonction de transition : état s, action a —> s’ obtenu en appliquant a à s
- Fonction de coût : transition s -a-> s’ —> c(s, a, s’) — distance, temps, …
- Test de l’état but où l’agent devra arriver
=> Ensemble des états + transitions = graphe dirigé (étiqueté)
=> Trouver une solution = recherche dans un graphe
JEUX DU TAKIN
1 3 2
4 6 5
7 8
1 2
4 5 6
7 8
3
Etat initial
suite d'actions
Etat final
-
Etats : description des positions des pièces, ex: (1,3,2,7,B,4,8,5,6); (1,2,3,4,5,6,B,7,8) …-
Etat initial : peut être n’importe quel état, ex: (1,3,2,7,B,4,8,5,6)-
Actions : Mouvements de B vers Haut, Bas, Gauche, Droite-
Transitions : Pour chaque état et action, associe l’effet de l’application de l’action, ex:-
Coût : chaque transition coûte 1, càd on mesure le nombre d’étapes pour atteindre le but-
Test de fin : Etat est un but, càd ici = (1,2,3,4,5,6,B,7,8)(1,3,2,7,B,4,8,5,6) — Droite —> (1,3,2, 7,4,B,8,5,6)
PROBLÈME DES HUITS DAMES
État initial : échiquier vide / 8 dames dans des positions quelconques Action : ajouter une dame sur une position vide / déplace une dame
Placer 8 Dames sur l’échiquier de manière
à ce qu’aucune ne puisse attaquer l’autre
Autres Problèmes plus Réalistes
- Routage dans les réseaux
- Navigation (trajectoire, itinéraire …), convoi, robot, missile, …
- Planning (séquence d’actions pour effectuer une tâche)
- Problèmes de conception de circuits
- Analyse de programmes
- …
Résoudre un problème
- Recherche dans un graphe, schéma générique
- Différentes instances
- Recherche non informée
- Recherche informée (guidée lors de l’exploration de l’espace d’états)
Résoudre un problème
- Recherche dans un graphe, schéma générique
- Différentes instances
- Recherche non informée
- Recherche informée (guidée lors de l’exploration de l’espace d’états)
ALGORITHME GÉNÉRIQUE - TREE-SEARCH
fonction tree-search(problème) retourne solution ou échec n = new noeud(état_init); frontière = { n };
loop do
si frontière vide retourner échec
n = élément de la frontière; supprimer n de la frontière;
si n.état est un état but alors retourner solution pour chaque action a faire
nouvel_état = transition(n.état, a) m = new noeud(nouvel_état)
ajouter m dans la frontière fait
end loop
-
On déplie le graphe en un arbre, éventuellement infini-
On ne mémorise pas les sommets traités-
On maintient une Frontière : feuilles de l’arbres = noeuds non traitésALGORITHME GÉNÉRIQUE — GRAPHE-SEARCH
fonction graph-search(problème) retourne solution ou échec n = créer_noeud_initial(état_init);
FRONTIERE = { n }; FERMES = {};
loop do
si frontière vide retourner échec n = élément de la FRONTIERE
supprimer n de la FRONTIERE
if n.état est un état but alors retourner solution ajouter n dans FERMES
pour chaque action a faire
nouvel_état = transition(n.état, a)
si nouvel_état dans un noeud de FRONTIERE
ou dans un noeud de FERMES alors continue m = new noeud(nouvel_état)
ajouter m dans FRONTIERE fait
end loop
-
FRONTIERE = noeuds à traiter-
FERMES = noeuds traités (tous les successeurs ont été découverts)Instances
- Recherche en largeur (BFS) — frontière = file d’attente (FIFO)
- Recherche en profondeur (DFS) — frontière = pile (LIFO)
- Recherche coût uniforme — frontière = file avec priorité (coût vers la racine)
- DFS borné
- DFS borné itéré
RECHERCHE INFORMÉE
• Appelée BEST_FIRST_SEARCH
• Guidée par une évaluation qui inclut une estimation du coût min vers le but
RECHERCHE INFORMÉE
• Appelée BEST_FIRST_SEARCH
• Guidée par une évaluation qui inclut une estimation du coût min vers le but
• heuristique h(n) : le coût estimé du chemin le plus court de n au but
RECHERCHE INFORMÉE
• Appelée BEST_FIRST_SEARCH
• Guidée par une évaluation qui inclut une estimation du coût min vers le but
• heuristique h(n) : le coût estimé du chemin le plus court de n au but
• g(n) : le coût du chemin courant (calculé) du sommet initial à n
RECHERCHE INFORMÉE
• Appelée BEST_FIRST_SEARCH
• Guidée par une évaluation qui inclut une estimation du coût min vers le but
• heuristique h(n) : le coût estimé du chemin le plus court de n au but
• g(n) : le coût du chemin courant (calculé) du sommet initial à n
• f(n) : la fonction d'évaluation, à chaque itération on cherche dans la frontière le sommet n avec f(n) minimal — est une combinaison de g(n) et de h(n)
ALGO COÛT UNIFORME
• si f(n)=g(n), c'est-à-dire on n'utilise pas l’heuristique, on obtient alors la recherche à coût uniforme (non informée, déjà étudiée)
HEURISTIQUE ?
Exemple :
Pour le problème du plus court chemin entre les villes
h(n) - la distance à vol d'oiseau de la ville n à la ville destination
- Qui donne une « bonne » estimation du coût réel
- Facile à calculer
=> Que veut dire « bonne » estimation ?
=> Comment définir une heuristique ?
HEURISTIQUE ?
Exemple :
Pour le problème du plus court chemin entre les villes
h(n) - la distance à vol d'oiseau de la ville n à la ville destination
- Qui donne une « bonne » estimation du coût réel
- Facile à calculer
RECHERCHE GLOUTONNE (GREEDY BEST-FIRST SEARCH)
• on prend f(n) = h(n)
• le coût du chemin de sommet source vers n n'est donc pas pris en compte
RECHERCHE GLOUTONNE (GREEDY BEST-FIRST SEARCH)
• on prend f(n) = h(n)
• le coût du chemin de sommet source vers n n'est donc pas pris en compte
• la version tree-like de l'algorithme complète ?
RECHERCHE GLOUTONNE (GREEDY BEST-FIRST SEARCH)
• on prend f(n) = h(n)
• le coût du chemin de sommet source vers n n'est donc pas pris en compte
RECHERCHE GLOUTONNE (GREEDY BEST-FIRST SEARCH)
• on prend f(n) = h(n)
• le coût du chemin de sommet source vers n n'est donc pas pris en compte
• la version « en arbre » de l'algorithme est-elle complète ?
RECHERCHE GLOUTONNE (GREEDY BEST-FIRST SEARCH)
• on prend f(n) = h(n)
• le coût du chemin de sommet source vers n n'est donc pas pris en compte
• la version « en arbre » de l'algorithme est-elle complète ?
-
h(n) = coût réel entre n et le but (= infini si but n’est pas atteignable)RECHERCHE GLOUTONNE (GREEDY BEST-FIRST SEARCH)
• on prend f(n) = h(n)
• le coût du chemin de sommet source vers n n'est donc pas pris en compte
• la version « en arbre » de l'algorithme est-elle complète ?
-
h(n) = coût réel entre n et le but (= infini si but n’est pas atteignable)=> Complet dans ce cas, mais calcul h(n) pratiquement infaisable
RECHERCHE GLOUTONNE (GREEDY BEST-FIRST SEARCH)
• on prend f(n) = h(n)
• le coût du chemin de sommet source vers n n'est donc pas pris en compte
• la version « en arbre » de l'algorithme est-elle complète ?
-
h(n) = coût réel entre n et le but (= infini si but n’est pas atteignable)-
h(n) = 0 pour tout n=> Complet dans ce cas, mais calcul h(n) pratiquement infaisable
RECHERCHE GLOUTONNE (GREEDY BEST-FIRST SEARCH)
• on prend f(n) = h(n)
• le coût du chemin de sommet source vers n n'est donc pas pris en compte
• la version « en arbre » de l'algorithme est-elle complète ?
-
h(n) = coût réel entre n et le but (= infini si but n’est pas atteignable)-
h(n) = 0 pour tout n=> Complet dans ce cas, mais calcul h(n) pratiquement infaisable
=> Incomplet dans ce cas, donc incomplet en général
RECHERCHE GLOUTONNE (GREEDY BEST-FIRST SEARCH)
• on prend f(n) = h(n)
• le coût du chemin de sommet source vers n n'est donc pas pris en compte
• la version « en arbre » de l'algorithme est-elle complète ?
• la version « en arbre » de l’algorithme est-elle optimale ?
-
h(n) = coût réel entre n et le but (= infini si but n’est pas atteignable)-
h(n) = 0 pour tout n=> Complet dans ce cas, mais calcul h(n) pratiquement infaisable
=> Incomplet dans ce cas, donc incomplet en général
RECHERCHE GLOUTONNE (GREEDY BEST-FIRST SEARCH)
• on prend f(n) = h(n)
• le coût du chemin de sommet source vers n n'est donc pas pris en compte
• la version « en arbre » de l'algorithme est-elle complète ?
• la version « en arbre » de l’algorithme est-elle optimale ?
-
h(n) = coût réel entre n et le but (= infini si but n’est pas atteignable)-
h(n) = 0 pour tout n=> Complet dans ce cas, mais calcul h(n) pratiquement infaisable
=> Incomplet dans ce cas, donc incomplet en général
1
1 3
H = 0
H = 1
RECHERCHE GLOUTONNE (GREEDY BEST-FIRST SEARCH)
• on prend f(n) = h(n)
• le coût du chemin de sommet source vers n n'est donc pas pris en compte
• la version « en arbre » de l'algorithme est-elle complète ?
• la version « en arbre » de l’algorithme est-elle optimale ?
-
h(n) = coût réel entre n et le but (= infini si but n’est pas atteignable)-
h(n) = 0 pour tout n=> Complet dans ce cas, mais calcul h(n) pratiquement infaisable
=> Incomplet dans ce cas, donc incomplet en général
1
1 3
H = 0
H = 1
RECHERCHE GLOUTONNE (GREEDY BEST-FIRST SEARCH)
• on prend f(n) = h(n)
• le coût du chemin de sommet source vers n n'est donc pas pris en compte
• la version « en arbre » de l'algorithme est-elle complète ?
• la version « en arbre » de l’algorithme est-elle optimale ?
-
h(n) = coût réel entre n et le but (= infini si but n’est pas atteignable)-
h(n) = 0 pour tout n=> Complet dans ce cas, mais calcul h(n) pratiquement infaisable
=> Incomplet dans ce cas, donc incomplet en général
1
1 3
H = 0
H = 1
=> Non optimale
RECHERCHE GLOUTONNE (GREEDY BEST-FIRST SEARCH)
• on prend f(n) = h(n)
• le coût du chemin de sommet source vers n n'est donc pas pris en compte
• la version « en graphe » de l'algorithme est-elle complète ?
RECHERCHE GLOUTONNE (GREEDY BEST-FIRST SEARCH)
• on prend f(n) = h(n)
• le coût du chemin de sommet source vers n n'est donc pas pris en compte
• la version « en graphe » de l'algorithme est-elle complète ?
OUI, pour toute heuristique
RECHERCHE GLOUTONNE (GREEDY BEST-FIRST SEARCH)
• on prend f(n) = h(n)
• le coût du chemin de sommet source vers n n'est donc pas pris en compte
• la version « en graphe » de l'algorithme est-elle complète ?
• la version « en graphe » de l’algorithme est-elle optimale ?
1
1 3
H = 0
H = 1
NON
OUI, pour toute heuristique
RECHERCHE GLOUTONNE (GREEDY BEST-FIRST SEARCH)
• on prend f(n) = h(n)
• le coût du chemin de sommet source vers n n'est donc pas pris en compte
• la version « en graphe » de l'algorithme est-elle complète ?
• la version « en graphe » de l’algorithme est-elle optimale ?
1
1 3
H = 0
H = 1
NON
OUI, pour toute heuristique
L’algorithme ignor
e les coûts réels observés
ALGORITHME A* - MINIMISER LE COÛT TOTAL
• dans chaque noeud n on stocke g(n) et f(n)=g(n)+h(n)
• à chaque étape on choisit un noeud avec f(n) minimal
ALGORITHME A* (VERSION PARCOURS EN ARBRE)
1. mettre le sommet initial s dans FRONTIERE, g(s)=0, f(s)=h(s) 2. Si FRONTIERE vide, sortir avec échec
3. retirer de FRONTIERE le noeud n pour lequel f(n) est minimal
4. si n est le but alors terminer et retracer la solution, le chemin de s à n
5. développer n pour engendrer tous ses successeurs. Pour tout successeur m de n : A. Calculer f(m)=g(m)+h(m), où g(m)=g(n)+coût(n, m)
B. Insérer m dans FRONTIERE 6. aller à 2
ALGORITHME A* (VERSION PARCOURS EN GRAPHE)
1. mettre le sommet initial s dans FRONTIERE, g(s)=0, f(s)=h(s) 2. Si FRONTIERE vide, sortir avec échec
3. retirer de FRONTIERE et mettre dans FERMES le noeud n pour lequel f(n) est minimal
4. si n est le but alors terminer et retracer la solution, le chemin de s à n
5. développer n pour engendrer tous ses successeurs. Pour tout successeur m de n : A. Si m.état n'est pas dans un noeud de FERMES alors calculer f(m)=g(m)+h(m), où
g(m)=g(n)+coût(n, m)
B. Insérer m dans FRONTIERE 6. aller à 2
INFRASTRUCTURE POUR L'ALGORITHME A^*
• n.état — état du noed
• n.parent — le parent du noeud
• n.action — l'action qui appliquée au parent donne l'état du nouer
• n.coût — le coût du chemin de la racine jusqu'au noeud, c'est g(n)
• n.f — la valeur f(n), la file de priorité selon les valeur n.f
fonction créer_noeud(Noeud parent, Action action) retourne Noeud n = new noeud()
n.état = transition(parent.état, action) n.action = action
n.coût = parent.coût + coût(parent.état,action) n.parent = parent
n.f = n.coût + h(n.état)
Algorithme A* (en arbre) — Exemple
A
B C
D E
3 1
1
1
1
5 7
0
1 4
3
0
A
B C
D E
3 1
1
1
1
5 7
0
1 4
3
0
A
1 3
B
f = 1+3 = 4 C f = 3+0 = 3
Algorithme A* (en arbre) — Exemple
A
B C
D E
3 1
1
1
1
5 7
0
1 4
3
0
A
1 3
B
f = 1+3 = 4 C f = 3+0 = 3
Algorithme A* (en arbre) — Exemple
A
B C
D E
3 1
1
1
1
5 7
0
1 4
3
0
A
1 3
B
f = 1+3 = 4 C
D E
7 1
f = 3+0 = 3
f = 4+1 = 5 f = 10+0 = 10
Algorithme A* (en arbre) — Exemple
A
B C
D E
3 1
1
1
1
5 7
0
1 4
3
0
A
1 3
B
f = 1+3 = 4 C
D E
7 1
f = 3+0 = 3
f = 4+1 = 5 f = 10+0 = 10
Algorithme A* (en arbre) — Exemple
A
B C
D E
3 1
1
1
1
5 7
0
1 4
3
0
A
1 3
B
D C
5 1
f = 1+3 = 4 C
D E
7 1
f = 3+0 = 3
f = 4+1 = 5 f = 10+0 = 10
f = 2+0 = 2 f = 6+0 = 6
Algorithme A* (en arbre) — Exemple
A
B C
D E
3 1
1
1
1
5 7
0
1 4
3
0
A
1 3
B
D C
5 1
f = 1+3 = 4 C
D E
7 1
f = 3+0 = 3
f = 4+1 = 5 f = 10+0 = 10
f = 2+0 = 2 f = 6+0 = 6
Algorithme A* (en arbre) — Exemple
A
B C
D E
3 1
1
1
1
5 7
0
1 4
3
0
A
1 3
B
D C
D E
5 1
7 1
f = 1+3 = 4 C
D E
7 1
f = 3+0 = 3
f = 4+1 = 5 f = 10+0 = 10
f = 2+0 = 2
f = 3+1 = 4 f = 6+0 = 6
f = 9+0 = 9
Algorithme A* (en arbre) — Exemple
A
B C
D E
3 1
1
1
1
5 7
0
1 4
3
0
A
1 3
B
D C
D E
5 1
7 1
f = 1+3 = 4 C
D E
7 1
f = 3+0 = 3
f = 4+1 = 5 f = 10+0 = 10
f = 2+0 = 2
f = 3+1 = 4 f = 6+0 = 6
f = 9+0 = 9
Algorithme A* (en arbre) — Exemple
A
B C
D E
3 1
1
1
1
5 7
0
1 4
3
0
A
1 3
B
D C
D E
D
5 1
7 1
1
f = 1+3 = 4 C
D E
7 1
f = 3+0 = 3
f = 4+1 = 5 f = 10+0 = 10
f = 2+0 = 2
f = 3+1 = 4 f = 6+0 = 6
f = 9+0 = 9
f = 4+0 = 4
Algorithme A* (en arbre) — Exemple
A
B C
D E
3 1
1
1
1
5 7
0
1 4
3
0
A
1 3
B
D C
D E
D
5 1
7 1
1
f = 1+3 = 4 C
D E
7 1
f = 3+0 = 3
f = 4+1 = 5 f = 10+0 = 10
f = 2+0 = 2
f = 3+1 = 4 f = 6+0 = 6
f = 9+0 = 9
f = 4+0 = 4
Algorithme A* (en arbre) — Exemple
A
B C
D E
3 1
1
1
1
5 7
0
1 4
3
0
A
1 3
B
D C
D E
D
5 1
7 1
1
f = 1+3 = 4 C
D E
7 1
f = 3+0 = 3
f = 4+1 = 5 f = 10+0 = 10
f = 2+0 = 2
f = 3+1 = 4 f = 6+0 = 6
f = 9+0 = 9
f = 4+0 = 4
= BUT
Algorithme A* (en arbre) — Exemple
Algorithme A* parcours en arbre — Optimalité ?
A
B C
D E
3 1
1
1
1
5 7
5
1 4
3
0
A
1 3
B
f = 1+3 = 4 C f = 3+5 = 8
Algorithme A* parcours en arbre — Optimalité ?
A
B C
D E
3 1
1
1
1
5 7
5
1 4
3
0
A
1 3
B
f = 1+3 = 4 C f = 3+5 = 8
Algorithme A* parcours en arbre — Optimalité ?
A
B C
D E
3 1
1
1
1
5 7
5
1 4
3
0
A
1 3
B
D C
5 1
f = 1+3 = 4 C f = 3+5 = 8
f = 2+5 = 7 f = 6+0 = 6
Algorithme A* parcours en arbre — Optimalité ?
A
B C
D E
3 1
1
1
1
5 7
5
1 4
3
0
A
1 3
B
D C
5 1
f = 1+3 = 4 C
f = 2+5 = 7 f = 6+0 = 6
= BUT
f = 3+5 = 8
Algorithme A*parcours en arbre — Optimalité ?
A
B C
D E
3 1
1
1
1
5 7
5
1 4
3
0
A
1 3
B
D C
5 1
f = 1+3 = 4 C
f = 2+5 = 7 f = 6+0 = 6
= BUT
NON OPTIMA L !!
=> Quelle heuristique utiliser pour garantir l’optimalité ?
f = 3+5 = 8
Algorithme A* parcours en arbre — Optimalité ?
HEURISTIQUE ADMISSIBLE
la fonction heuristique h est admissible si pour chaque sommet n h(n) <= coût réel du chemin le plus court de n vers un état but
donc une heuristique admissible ne surestime jamais le coût réel.
Si l’heuristique est admissible alors A*
version parcours en arbre est optimal
Algorithme A* parcours en arbre — Optimalité ?
B
B’
A
f(A) = g(A) + h(A) <= g(A) + c
c
Admissibilité
g(A) + c < g(B) Optimalité
g(A) + c < g(B) + h(B) = f(B) Admissibilité : h(B)=0
=> f(A) < f(B)
Contradiction avec f(B) <= f(A) f(B) <= f(A)
Si l’heuristique est admissible alors A*
version parcours en arbre est optimal
Algorithme A* parcours en arbre — Optimalité ?
A
B C
D E
3 1
1
1
1
5 7
0
1 4
3
0
Algorithme A* parcours en graphe — Optimalité ?
A
B C
D E
3 1
1
1
1
5 7
0
1 4
3
0
A
1 3
B
f = 1+3 = 4 C f = 3+0 = 3
Algorithme A* parcours en graphe — Optimalité ?
A
B C
D E
3 1
1
1
1
5 7
0
1 4
3
0
A
1 3
B
f = 1+3 = 4 C f = 3+0 = 3
Algorithme A* parcours en graphe — Optimalité ?
A
B C
D E
3 1
1
1
1
5 7
0
1 4
3
0
A
1 3
B
f = 1+3 = 4 C
D E
7 1
f = 3+0 = 3
f = 4+1 = 5 f = 10+0 = 10
Algorithme A* parcours en graphe — Optimalité ?
A
B C
D E
3 1
1
1
1
5 7
0
1 4
3
0
A
1 3
B
f = 1+3 = 4 C
D E
7 1
f = 3+0 = 3
f = 4+1 = 5 f = 10+0 = 10
Algorithme A* parcours en graphe — Optimalité ?
A
B C
D E
3 1
1
1
1
5 7
0
1 4
3
0
A
1 3
B
D C
5 1
f = 1+3 = 4 C
D E
7 1
f = 3+0 = 3
f = 4+1 = 5 f = 10+0 = 10
f = 6+0 = 6
Algorithme A* parcours en graphe — Optimalité ?
C est dans FERMES
A
B C
D E
3 1
1
1
1
5 7
0
1 4
3
0
A
1 3
B
D C
5 1
f = 1+3 = 4 C
D E
7 1
f = 3+0 = 3
f = 4+1 = 5 f = 10+0 = 10
f = 6+0 = 6
Algorithme A* parcours en graphe — Optimalité ?
C est dans FERMES
=> L’algorithme rate le chemin optimal !!
A
B C
D E
3 1
1
1
1
5 7
0
1 4
3
0
A
1 3
B
D C
5 1
f = 1+3 = 4 C
D E
7 1
f = 3+0 = 3
f = 4+1 = 5 f = 10+0 = 10
f = 6+0 = 6
Algorithme A* parcours en graphe — Optimalité ?
C est dans FERMES
Admissibilité n’est pas suffisante dans ce cas Quelle autre condition ?
=> L’algorithme rate le chemin optimal !!
HEURISTIQUE CONSISTANTE
Une heuristique est consistante (ou cohérente) si h(but) =0 et elle satisfait l'inégalité de triangle:
pour chaque couple de sommets n et m et toute action a telle que m=transition(n,a) , on a :
h(n) <= coût(n,a,m) + h(m)
coût(n,a,m) - coût de l'action a
destination n
a m
HEURISTIQUE CONSISTANTE
heuristique h
si h consistante alors h admissible
HEURISTIQUE CONSISTANTE
heuristique h
si h consistante alors h admissible
Preuve laissée en exer
cice
OPTIMALITÉ DE A*
A. Si la heuristique h est admissible alors la version tree- search de l'algorithme A* est optimale.
B. Si la heuristique h est consistante alors la version graph- search de l'algorithme A* est optimale.