☀️ Stage Pré-rentrée · dès le 24 aoûtRéserver ma place →
Majorant
📘 Fiche de cours · 1re année📐 MPSI💻 Informatique Informatique communeNiveau · Spé

Algorithme minimax

Jouer optimalement contre un adversaire optimal : l'arbre de jeu, les joueurs MAX et MIN, et l'algorithme minimax récursif qui remonte les valeurs des feuilles vers la racine — tracé sur un petit arbre, avec l'idée de l'élagage alpha-bêta et trois exercices corrigés.

Fiche rédigée par les mentors Majorant — alumni Polytechnique, CentraleSupélec et Mines Paris.

3 définitionsMis à jour le 2026-08-02

Vue d'ensemble

Comment un programme décide-t-il de son prochain coup au morpion, au puissance 4 ou aux échecs ? L'idée centrale est étonnamment simple : explorer tous les avenirs possibles de la partie et jouer en supposant que l'adversaire, lui aussi, jouera de son mieux. C'est exactement ce que formalise l'algorithme minimax. On modélise la partie par un arbre, on attribue un score aux positions finales, puis on fait « remonter » ces scores jusqu'à la position actuelle en alternant maximisation (pour nous) et minimisation (pour l'adversaire).

Cette fiche s'inscrit dans le cadre des jeux à deux joueurs, à somme nulle, à information complète et sans hasard. C'est une application directe de la récursivité sur les arbres : si tu maîtrises « une fonction qui s'appelle sur ses sous-structures », tu tiens déjà 80 % du minimax.

Au programme (informatique commune, 2e année). Modélisation d'un jeu à deux joueurs par un arbre ; algorithme minimax pour déterminer la valeur d'une position et un coup optimal ; existence de l'élagage alpha-bêta comme optimisation ; estimation de la complexité en fonction du facteur de branchement et de la profondeur. Aucune démonstration n'est exigible sur ce chapitre.

Prérequis

  • Récursivité : fonction qui s'appelle elle-même, cas de base / cas récursif, remontée des valeurs.
  • Arbres (ou piles/files) : vocabulaire nœud, arête, racine, feuille, fils, profondeur.
  • Complexité temporelle : ordre de grandeur, croissance exponentielle .
  • Bases de Python : fonctions, listes, max/min, tests isinstance.
🎯 Accompagnement Majorant

Minimax, c'est de la récursivité déguisée en stratégie. Beaucoup d'élèves calent non pas sur le jeu, mais sur « qui joue à ce niveau ». Nos mentors alumni X · Centrale · Mines te font dérouler un arbre à la main jusqu'à ce que l'alternance min/max devienne un réflexe.

Trouver un mentor →

1. Le cadre : jeux à deux joueurs à somme nulle

Tous les jeux visés ici partagent quatre propriétés. Elles garantissent que la partie est entièrement calculable, au moins en théorie.

Définition 1.1 — Jeu à somme nulle, information complète, sans hasard

On considère un jeu opposant deux joueurs qui jouent à tour de rôle, tel que :

  • Somme nulle : ce que gagne l'un, l'autre le perd. Un unique score chiffre l'issue ; l'un cherche à le rendre grand, l'autre à le rendre petit.
  • Information complète : à tout instant, chaque joueur connaît entièrement la position (aucune carte cachée).
  • Sans hasard : aucun dé, aucun tirage ; le coup joué détermine seul la position suivante.

Exemples : morpion, puissance 4, échecs, dames, go. Contre-exemples : le poker (information cachée), le backgammon (dés).

On nomme les deux joueurs d'après leur objectif sur le score :

  • MAX : le joueur qui veut maximiser le score final.
  • MIN : le joueur qui veut le minimiser.

Par convention, on chiffre les issues du point de vue de MAX. Au morpion par exemple : si MAX gagne, si MIN gagne, en cas de match nul. Rien n'interdit des scores plus fins (matériel aux échecs, différence de pions…), mais le principe reste le même.

📝
« Somme nulle » ne veut pas dire que le total vaut littéralement zéro : il signifie que les intérêts sont strictement opposés. Un seul nombre suffit à décrire l'issue, et les deux joueurs le tirent en sens contraires.

2. L'arbre de jeu

Pour raisonner sur toutes les suites possibles, on déplie la partie en un arbre.

Définition 2.1 — Arbre de jeu

L'arbre de jeu associé à une position de départ est l'arbre dont :

  • chaque nœud représente une position du jeu ;
  • chaque arête représente un coup légal menant à la position fille ;
  • la racine est la position à évaluer (celle où l'on doit choisir) ;
  • les feuilles sont les positions terminales (victoire, défaite ou nul), auxquelles on attribue directement un score.

Les niveaux alternent le joueur au trait : si la racine est à MAX, ses filles sont à MIN, leurs filles à MAX, et ainsi de suite.

💡
Au morpion, la racine a jusqu'à 9 filles (les cases libres), chaque fille jusqu'à 8, etc. La profondeur d'une feuille est le nombre de coups joués depuis la racine, et le facteur de branchement est le nombre moyen de coups possibles par position. Ces deux nombres pilotent entièrement le coût du calcul (section 5).
📝
On ne construit presque jamais l'arbre en entier dans une variable : il serait gigantesque. La récursion l'explore « à la volée », en engendrant les positions filles au fur et à mesure et en les oubliant une fois évaluées.

3. La valeur minimax d'une position

Le cœur de l'algorithme tient en une seule définition récursive.

Définition 3.1 — Valeur minimax

La valeur minimax d'une position est définie par :

  • si est terminale : est le score de ;
  • sinon, si c'est à MAX de jouer : ;
  • sinon, si c'est à MIN de jouer : .

Elle représente le score final que MAX peut garantir depuis , lorsque les deux joueurs jouent de façon optimale.

📐
L'hypothèse clé. Chaque joueur suppose que l'adversaire jouera le mieux possible pour lui. MAX ne compte donc jamais sur une erreur de MIN : à un nœud MIN, il retient la fille de plus petite valeur (le pire cas pour MAX). Symétriquement, MIN suppose que MAX prendra le maximum. C'est cette prudence mutuelle qui rend la valeur garantie.

Le coup optimal à la racine (à MAX) est celui qui mène à la fille dont la valeur est maximale : c'est la fille qui « réalise » le max. On obtient donc à la fois la valeur de la position et le coup à jouer.

4. Le code récursif

On représente ici un arbre de jeu par des listes imbriquées : une feuille est un entier (son score), un nœud interne est la liste de ses filles. Le booléen est_max indique si c'est à MAX de jouer dans la position courante.

def minimax(position, est_max):
    if isinstance(position, int):       # position terminale : c'est un score
        return position
    if est_max:                         # c'est a MAX de jouer
        return max(minimax(f, False) for f in position)
    else:                               # c'est a MIN de jouer
        return min(minimax(f, True) for f in position)
🔍 Décryptage ligne par ligne
def minimax(position, est_max):La fonction prend la position à évaluer et un booléen : True si MAX joue, False si MIN joue. Elle renvoie la valeur minimax de la position.
if isinstance(position, int):Cas de base de la récursion : si la position est un entier, c'est une feuille (position terminale). Le test isinstance distingue une feuille (int) d'un nœud interne (list).
return positionOn renvoie directement le score de la feuille. Sans ce cas d'arrêt, la récursion ne se terminerait jamais.
if est_max:Cas récursif, position non terminale. Si c'est à MAX de jouer, on veut la meilleure valeur possible pour MAX.
return max(minimax(f, False) for f in position)Pour chaque fille f, on calcule sa valeur minimax en passant la main à l'adversaire (est_max=False : ce sera à MIN de jouer plus bas), puis on garde le maximum. Le for f in position parcourt les filles (la liste).
else:C'est à MIN de jouer.
return min(minimax(f, True) for f in position)Même parcours des filles, mais on repasse la main à MAX (est_max=True) et on garde cette fois le minimum. C'est l'unique différence avec la branche MAX : min au lieu de max, et le booléen inversé.
📝
À chaque appel, est_max est inversé : les deux joueurs jouent à tour de rôle, donc le joueur au trait alterne à chaque descente d'un niveau. C'est cette alternance qui produit la succession min, max, min, max… en remontant.
📐
Variante « joueur = ±1 ». On code parfois le joueur par un entier : +1 pour MAX, -1 pour MIN. On passe alors -joueur à l'appel récursif (inversion) et on choisit max si joueur == +1, min sinon. C'est exactement la même logique ; seul le nom du paramètre change.

Table de trace sur un petit arbre

Prenons l'arbre binaire de profondeur 3 ci-dessous, racine à MAX. Les feuilles portent les scores. On note les nœuds par leur chemin (L = fille gauche, R = fille droite) :

# feuille = int, noeud interne = liste des filles
arbre = [
    [ [3, 5], [6, 9] ],    # L (MIN)  : filles LL et LR, toutes deux MAX
    [ [1, 2], [0, -1] ],   # R (MIN)  : filles RL et RR, toutes deux MAX
]
print(minimax(arbre, True))   # racine a MAX
🔍 Décryptage ligne par ligne
arbre = [ ... ]La racine (à MAX, profondeur 0) a deux filles L et R, chacune à MIN. Chaque fille MIN a elle-même deux filles à MAX, dont les filles sont les feuilles-scores.
[ [3, 5], [6, 9] ]La fille gauche L (MIN). Sa fille LL est le nœud MAX [3, 5], sa fille LR le nœud MAX [6, 9].
[ [1, 2], [0, -1] ]La fille droite R (MIN), avec RL = [1, 2] et RR = [0, -1].
print(minimax(arbre, True))On lance l'évaluation avec est_max=True car c'est à MAX de jouer à la racine. La valeur affichée est 5.

On évalue de bas en haut. Les nœuds MAX de profondeur 2 prennent le max de leurs deux feuilles ; les nœuds MIN de profondeur 1 prennent le min de leurs deux enfants ; la racine MAX prend le max des deux nœuds MIN.

Remontée des valeurs des feuilles vers la racine (min et max alternés)
NœudProfondeurJoueurEnfants (valeurs)OpérationValeur
LL2MAX3, 5max5
LR2MAX6, 9max9
L1MIN5, 9min5
RL2MAX1, 2max2
RR2MAX0, −1max0
R1MIN2, 0min0
Racine0MAX5, 0max5 ✓

La valeur de la position est donc . Le coup optimal de MAX à la racine est d'aller vers L (valeur ), pas vers R (valeur ). Remarque parlante : la feuille est la plus grosse de l'arbre, mais MAX ne l'obtiendra jamais, car MIN, au nœud L, choisira l'enfant de valeur plutôt que celui de valeur .

Erreur classique : croire que MAX vise la plus grande feuille de tout l'arbre. Non ! Entre MAX et cette feuille, MIN joue et coupera la route si ça l'arrange. On ne peut garantir que ce que l'adversaire nous laisse — d'où le min à son niveau.
🎯 Accompagnement Majorant

La table de trace, c'est LE geste de l'écrit. Aux concours, on te donne un arbre et on demande la valeur remontée. Nos mentors alumni X · Centrale · Mines t'entraînent à dérouler proprement le tableau min/max sous pression, sans sauter de niveau.

Trouver un mentor →

5. Élagage alpha-bêta et complexité

Complexité : exponentielle en la profondeur

Minimax visite chaque nœud de l'arbre. Si le facteur de branchement est (nombre de coups par position) et la profondeur explorée est , l'arbre possède environ feuilles, et le nombre total de nœuds est du même ordre. La complexité en temps est donc :

C'est une croissance exponentielle en la profondeur. Aux échecs, : explorer ne serait-ce que 5 demi-coups représente déjà feuilles. Explorer une partie entière est hors de portée — d'où deux réponses en pratique : limiter la profondeur (avec une heuristique d'évaluation des positions non terminales) et… élaguer.

💡
Pour un arbre de facteur de branchement et de profondeur , le nombre de feuilles est . Doubler la profondeur () le porte à : chaque niveau supplémentaire multiplie le coût par .

L'élagage alpha-bêta (à connaître d'existence)

L'élagage alpha-bêta est une optimisation de minimax qui donne exactement la même valeur, mais en évitant d'explorer des branches inutiles. L'idée : pendant le parcours, on retient deux bornes, (le meilleur score déjà garanti à MAX) et (le meilleur déjà garanti à MIN). Dès qu'on découvre qu'une branche ne pourra pas améliorer le choix d'un joueur — parce qu'elle est déjà « battue » par une valeur connue plus haut — on l'abandonne sans finir de l'explorer (une coupure).

💡
Reprends l'arbre de trace. Au nœud R (MIN), on évalue d'abord RL et on trouve . Comme la racine (MAX) a déjà garanti via L, et que R (MIN) ne pourra que faire , la racine ne choisira jamais R : on pourrait arrêter d'explorer R sans même regarder RR. C'est une coupure alpha-bêta.

Dans le meilleur cas (bon ordre d'exploration des coups), alpha-bêta fait passer la complexité de à environ : on peut explorer deux fois plus profond à coût égal. Le programme n'est pas exigible en détail ; retiens son existence, son rôle (accélérer sans changer le résultat) et son principe (couper les branches condamnées).

📝
Point capital : alpha-bêta ne modifie pas la valeur minimax ni le coup optimal. C'est une optimisation « gratuite » sur le plan du résultat — elle ne fait qu'éviter du calcul.

6. Exercices corrigés

Exo 1Remontée sur un arbre à trois branchesFacile

La racine est à MAX et a trois filles à MIN, chacune ayant pour enfants des feuilles :

A = (8, 3, 5)  ·  B = (6, 6, 6)  ·  C = (9, 1, 4). Calcule la valeur minimax de la racine et indique le coup optimal.

Voir la correction détaillée
Chaque fille est à MIN : elle prend le minimum de ses feuilles. A → ; B → ; C → .
La racine est à MAX : elle prend le maximum des filles. .
Valeur = 6, atteinte par la fille B : le coup optimal de MAX mène à B. Noter que la feuille 9 (dans C) est inaccessible : MIN y répondrait par 1.
Exo 2Trace sur un arbre binaire de profondeur 3, racine MINIntermédiaire

On évalue arbre = [[[2, 7], [8, 1]], [[9, 3], [4, 4]]] avec la fonction minimax de la fiche, mais cette fois la racine est à MIN (on appelle donc minimax(arbre, False)). Donne la valeur remontée et détaille les niveaux.

Voir la correction détaillée
Racine MIN (prof. 0) → filles MAX (prof. 1) → petites-filles MIN (prof. 2) → feuilles (prof. 3). On remonte de bas en haut.
Nœuds MIN de profondeur 2 : ; ; ; .
Nœuds MAX de profondeur 1 : (fille gauche) ; (fille droite).
Racine MIN : . La fonction renvoie 2.
Exo 3Le coup renvoyé, pas seulement la valeurDifficile

La fonction de la fiche ne renvoie que la valeur. Écris meilleur_coup(position) qui, pour une position à MAX représentée comme une liste de filles, renvoie l'indice de la fille de valeur minimax maximale (le coup à jouer). Teste-la sur l'arbre de trace de la section 4.

Voir la correction détaillée
Idée : évaluer chaque fille avec minimax(f, False) (après le coup de MAX, c'est à MIN de jouer), puis renvoyer l'indice du maximum.
def meilleur_coup(position):
    # position est a MAX et non terminale : liste de filles
    valeurs = [minimax(f, False) for f in position]
    meilleure = max(valeurs)
    return valeurs.index(meilleure)   # indice de la 1re fille optimale
Sur arbre de la section 4 : les deux filles L et R valent et . valeurs = [5, 0], le max est , index(5) = 0 : le coup optimal est la fille d'indice 0 (L), cohérent avec la valeur de racine .
Décryptage : [minimax(f, False) for f in position] évalue chaque coup possible ; max(valeurs) est la valeur minimax de la position (à MAX) ; valeurs.index(...) retrouve quel coup l'atteint.

Récap final — Ce qu'il faut absolument retenir

Minimax = récursivité sur l'arbre de jeu, avec alternance max (MAX) / min (MIN) en remontant les scores des feuilles. Vérifie chaque point avant l'épreuve.

  • Sais-tu citer les quatre propriétés du cadre (deux joueurs, somme nulle, information complète, sans hasard) et donner un contre-exemple ?
  • Sais-tu construire l'arbre de jeu : nœud = position, arête = coup, feuille = position terminale scorée ?
  • Sais-tu énoncer la définition récursive de la valeur minimax (feuille → score ; MAX → max des filles ; MIN → min des filles) ?
  • Sais-tu expliquer pourquoi chaque joueur suppose l'adversaire optimal, et pourquoi MAX ne vise pas forcément la plus grosse feuille ?
  • Sais-tu écrire la fonction récursive minimax(position, est_max) avec son cas de base et l'inversion du booléen ?
  • Sais-tu dérouler une table de trace en remontant les valeurs des feuilles jusqu'à la racine, min et max alternés ?
  • Sais-tu que l'élagage alpha-bêta donne la même valeur en explorant moins de nœuds, et qu'il n'est pas exigible dans le détail ?
  • Sais-tu estimer la complexité et expliquer pourquoi elle est exponentielle en la profondeur ?

Débloque la fiche complète

Théorèmes, démonstrations à savoir refaire, méthodes-types et pièges de concours : crée ton compte gratuit pour tout lire. Une seule fois pour toutes les fiches et ressources Majorant.

Gratuit · vos données restent confidentielles.

Valide tes acquis

Quiz — Minimax

11 questions · une à la fois · seuil de maîtrise 80 %.

Informatique commune · SpéQuiz — Algorithme minimaxQuestion 1 / 11
FacileChoix unique1 pt

Parmi ces jeux, lequel n'entre PAS dans le cadre d'application classique de minimax (deux joueurs, somme nulle, information complète, sans hasard) ?

Sélectionne une réponse pour valider.

Fiches associées

📐 MPSI·Informatique

Recherche par dichotomie

La recherche dichotomique dans un tableau trié, expliquée ligne par ligne : code Python commenté, exécution pas à pas, preuve de terminaison et de correction (variant \(d-g\), invariant de boucle), version récursive et complexité \(O(\log n)\).

📐 MPSI·Informatique

Variables, types et affectations

Les briques de base de Python pour bien démarrer la prépa : affectation, types int/float/bool/str, conversions, opérateurs (/ // %), f-strings — avec les pièges classiques et deux exercices corrigés.

📐 MPSI·Informatique

Conditions et booléens

Faire choisir un programme : booléens, comparaisons, if / elif / else, rôle de l'indentation, et combinaison de conditions avec and / or / not — avec pièges et exercices corrigés.

📐 MPSI·Informatique

Boucles for et while

Répéter une action : boucle for avec range, boucle while qui termine, et le motif de l'accumulateur (somme, compteur) — avec table de trace, pièges et exercices corrigés.

📐 MPSI·Informatique

Fonctions : paramètres et valeurs de retour

Définir et appeler une fonction, comprendre paramètres et valeur de retour, et surtout ne jamais confondre return (renvoie) et print (affiche) — avec pièges et exercices corrigés.

📐 MPSI·Informatique

Listes et chaînes de caractères

Créer, indexer, parcourir et découper des listes et des chaînes ; comprendre qu'une liste est modifiable et une chaîne non — avec les pièges d'indices et deux exercices corrigés.

Tu veux aller plus loin sur ce chapitre ?

Nos mentors alumni de Polytechnique, CentraleSupélec et Mines Paris t'accompagnent en cours particuliers — démonstrations détaillées, exos type concours, oraux blancs.

Trouver un mentor →