Cours 7 : Théorie des jeux
Summary
Ce cours a duré deux heures car on a commencé par faire la dernière question du précédent exercice (voir cours 6), puis on a appliqué l'algorithme de Dijkstra sur quelques exemples (voir cours 4).
Ensuite, on a parlé de Théorie des jeux.
Jeux à somme nulle
On s'intéresse uniquement aux jeux à deux joueurs, et tour à tour. On les appelle Joueur 1 et Joueur 2.
De plus, on impose que le jeu est à somme nulle. Cela signifie qu'à la fin du jeu, les joueurs ont un score opposé.
Soit
- Si
, Joueur 1 gagne et Joueur 2 perd. - Si
, Joueur 2 gagne et Joueur 1 perd. - Si
, il y a égalité.
À retenir : Le plus souvent
Exemples
Le Morpion
- Joueur 1 gagne :
- Joueur 2 gagne :
- Égalité :
Le jeu des bâtonnets de Ford Boyard
- Joueur 1 gagne :
- Joueur 2 gagne :
Représentation d'un tel jeu
Formellement, un jeu est défini par :
- Un état initial
- Un ensemble d'états possibles
(en particulier ) - Les états où c'est au Joueur 1 de jouer
- Les états où c'est au Joueur 2 de jouer
- Des transitions allant des sommets de
vers des sommets de - Des transitions allant des sommets de
vers des sommets de
C'est éxactement ce qu'on appelle un graphe orienté biparti
Enfin, les états finaux (c'est-à-dire ceux qui n'ont pas de transitions), sont annotés par le score
Si le score est positif, cela signifie que Joueur 1 gagne, s'il est négatif Joueur 1 perd et sinon il y a match nul.
Voici par exemple le graphe du jeu des bâtonnets de Ford Boyard

Stratégie
Une stratégie pour Joueur 1 est une fonction de
Une stratégie pour Joueur 1 est dite gagnante si, quelque soient les actions jouées par Joueur 2, Joueur 1 gagne.
Une stratégie pour Joueur 1 assure le nul si, quelque soient les actions jouées par Joueur 2, Joueur 1 ne perd pas.
Quelques propriétés (à utiliser sans modération)
Propriété 1 : Si il n'y a pas d'état final nul, alors :
- Soit Joueur 1 possède une stratégie gagnante
- Soit Joueur 2 possède une stratégie gagnante
Propriété 2 : Dans tous les cas :
- Soit Joueur 1 possède une stratégie qui assure le nul
- Soit Joueur 2 possède une stratégie qui assure le nul
Attracteur
Du point de vue du Joueur 1, on note:
l'ensemble des sommets finaux qui donnent la victoire à Joueur 1
On appelle cet ensemble
On peut construire similairement
Les états de
Algorithme Minimax
On s'interesse ici aux jeux à somme nulle :
- Soit je gagne et mon adversaire perd
- Soit je perd et mon adversaire gagne
- Soit la partie est nulle
On peut représenter n'importe que jeu fini à deux joueurs tour par tour pas un arbre orienté :
- Chaque nœud représente un état du jeu
- La racine c'est l'état initial du jeu
- Les feuilles sont les états finaux : ils valent soit
(victoire) soit (partie nulle) soit (défaite) - Pour un nœud donné, les arrêtes sortantes sont les actions possibles que le joueur à qui c'est le tour peut prendre.
L’algorithme Minimax permet de déterminer la stratégie optimale dans un jeu à somme nulle, en supposant que l’adversaire joue également de manière optimale.
On distingue deux types de nœuds :
- Nœud MAX → c’est mon tour → je cherche à maximiser le score
- Nœud MIN → c’est le tour de l’adversaire → il cherche à minimiser mon score
Les feuilles ont une valeur :
→ victoire → match nul → défaite
On remonte l’arbre depuis les feuilles :
- Si le nœud est MAX (Je cherche à maximiser le score) :
- Si le nœud est MIN (L'adversaire cherche à minimiser le score) :
Mais comment on fait si on ne connaît pas le score d'un des enfants ? Et bien on fait un appel récursif :
En python, l'algorithme est tout simple (soit sûre de bien le comprendre) :
def minimax(node, c_est_moi_qui_joue):
if node.est_terminal():
return node.valeur
if c_est_moi_qui_joue:
best_value = -infinity
for child in node.enfants:
value = minimax(child, False) # Appel récursif
best_value = max(best_value, value)
return best_value
else:
best_value = +infinity
for child in node.enfants:
value = minimax(child, True) # Appel récursif
best_value = min(best_value, value)
return best_value
ou
⚠️ Cela devient rapidement très coûteux (ex : échecs).
Pour les échecs, on utilise une heuristique, qui correspond à un nombre entre
- Plus on est proches de
, plus on est sûrs de gagner - Plus on est proches de
, plus on est sûrs de perdre
Au lieu de faire des appels récursifs pour toute la profondeur de l'arbre, on s'arrête avant, grâce à l'heuristique.
Attention : c'est algorithme heuristique n'est plus optimal, c'est juste un joueur pas trop mauvais.