X ENS Option Informatique MP MPI 2025Sujet et rapport du jury
- Probabilités conditionnelles et raisonnement bayésien
- Structures de données arborescentes et récursivité
- Entropie de Shannon
- Preuve de programmes : invariants de boucle et récursion ouverte
- Complexité algorithmique
- Logique propositionnelle et formes normales
Téléchargements
- Corrigé : pas encore disponible
Présentation du sujet
DifficileGénération d'arbres de décision pour l'identification probabiliste des plantesAfficher ou masquer la section
Présentation du sujet
DifficileLe sujet porte sur la construction d'arbres de décision permettant d'identifier des espèces de plantes à partir de caractères morphologiques modélisés par des distributions de probabilité. Il part d'une modélisation bayésienne des espèces, propose un calcul exact de l'arbre optimal par énumération puis par une optimisation de type branch-and-bound, un algorithme glouton fondé sur l'entropie de Shannon, et enfin une extension logique permettant de représenter des observations plus complexes qu'un simple caractère.
- 1Partie I : description probabiliste des plantesModélisation bayésienne des espèces et calculs de probabilités conditionnelles, avec leur implémentation en OCaml.
- 2Partie II : arbre optimalÉnumération récursive de tous les arbres de décision possibles et sélection de celui de hauteur moyenne minimale.
- 3Partie III : algorithme gloutonConstruction d'un arbre de décision en choisissant à chaque étape le caractère minimisant l'entropie moyenne, et mise en évidence de sa non-optimalité.
- 4Partie IV : optimisation de l'algorithme naïfPreuve de correction d'une fonction à récursion ouverte puis optimisation par une approche branch-and-bound.
- 5Partie V : observations complexes et formules logiquesModèle logique pour des observations combinant plusieurs caractères, mise en forme normale disjonctive pour évaluer une formule efficacement.
Difficile. Le rapport montre que les taux de réussite complète chutent fortement au fil du sujet, par exemple 1% seulement pour la question 17 en filière MP et des pourcentages très faibles pour les questions 18 à 20 sur la preuve de programme et le branch-and-bound.
L'épreuve en chiffres
Moyenne 9,82 / 20 · écart-type 3,79 · 646 présents · où vous situez-vous ?Afficher ou masquer la section
L'épreuve en chiffres
- Moyenne
- 9,82/ 20
- Écart-type
- 3,79
- Présents
- 646
- Coefficient
- 6 à l'admissibilité, porté à 10 pour le classement (MP option informatique)
- Durée
- 4 h
Votre note sur 20 à ce sujet, en conditions de concours.
Source : document officiel du concours, épreuve du 15 avril 2025. Notes publiées par le concours (après harmonisation le cas échéant). Courbe : estimation par une loi normale.
Ce qu'a observé le jury
5 erreurs relevéesIndépendance supposée à tort · Invariants de structures de données non respectés · Énumération récursive d'arbres mal maîtriséeAfficher ou masquer la section
Ce qu'a observé le jury
5 erreurs relevéesLe sujet a été globalement bien réussi sur les premières questions de probabilités, mais la difficulté augmente nettement à partir de l'énumération récursive des arbres puis surtout dans la partie IV consacrée à la preuve de programme, restée largement intouchée. Le jury insiste sur l'importance de la présentation de la copie, en particulier pour les questions de code, et sur la nécessité de bien lire l'énoncé pour respecter les invariants des structures de données.
Les erreurs les plus sanctionnées
- 1Indépendance supposée à tortQ4
Il était tentant d'utiliser un argument d'indépendance entre deux caractères, mais ils ne sont indépendants qu'une fois conditionnés relativement à une espèce.
- 2Invariants de structures de données non respectésQ5
Les candidats ont souvent lu rapidement le sujet sans faire attention à tous les invariants liés aux structures de données, ce qui conduit à des codes faux.
- 3Énumération récursive d'arbres mal maîtriséeQ10
La principale difficulté est de combiner, pour chaque enfant, les différentes possibilités issues du choix d'une question initiale en utilisant la fonction choix_possibles.
- 4Ambiguïté de la somme sur l'entropie moyenneQ13
Il faut expliciter dans le code que la somme ne porte que sur les valeurs de probabilité non nulle, sinon le calcul de l'état mis à jour lève une exception.
- 5Partie preuve de programme peu abordéeQ17, Q18
La partie de preuve de programme, portant sur les pré-conditions et l'invariant de boucle de la fonction à récursion ouverte, est restée largement intouchée par les candidats.
Ce qui a été bien réussi
- La question 1, simple application numérique de lois classiques de probabilité, a été bien réalisée dans son ensemble.
- La question 6, simple application des questions précédentes, a été bien traitée avec 70 à 72% de réussite complète.
- La question 22 sur la complexité a été plutôt bien réussie dans l'ensemble, même si la formule exacte est rarement trouvée.
Conseils du jury
- Soigner la présentation des questions de code en expliquant chaque fonction intermédiaire.
- Lire attentivement l'énoncé pour identifier tous les invariants des structures de données avant de coder.
- Ne pas supposer l'indépendance de deux variables aléatoires sans vérifier les hypothèses de conditionnement.
- Ne pas négliger les questions de preuve de programme, qui rapportent des points même partiellement traitées.
Synthèse rédigée par WikiPrépa à partir du rapport officiel du jury (à télécharger en PDF). Les citations sont extraites du rapport.
Ces sujets peuvent vous intéresser
Pas encore de corrigé pour ce sujet : voici des sujets proches corrigés.
Lecture du sujet en ligne
L'énoncé complet, avec les formules et les figures, sans ouvrir le PDF.Afficher ou masquer la section
Lecture du sujet en ligne
ECOLE POLYTECHNIQUE ECOLES NORMALES SUPERIEURES
CONCOURS D'ADMISSION 2025
14h00-18h00
FILIERES MP-MPI - Epreuve nº 4
L'utilisation des calculatrices n'est pas autorisée pour cette épreuve
Pour la filière MP, il y a donc deux enveloppes de Sujets pour cette séance.
Arbres de classification d'arbres
Ce sujet porte sur la réalisation d'arbres d'identification des plantes basés sur des observations morphologiques. À partir d'une base de connaissance botaniste, il s'agit de réaliser un arbre dont les feuilles sont des diagnostics (typiquement des noms d'espèce) et les nœuds des caractères morphologiques (par exemple la couleur des fleurs). Un nœud a autant de fils que le caractère a de valeurs possibles (jaune, bleue, etc.).
Rappels de probabilités
Rappels d'OCaml
- List.hd [
e_1; …; e_n ] renvoiee_1 , et List.hd [] lève une exception. - List.tl [
e_1; …; e_n ] renvoie [e_2; …; e_n ], et List.tl [] lève une exception. - List. length 1 renvoie la longueur (nombre d'éléments) de la liste 1.
- List.init
nf renvoie la liste [f0; …; f(n − 1) ] pourn positif. - List.assoc
k[(k_1, v_1); …; (k_n, v_n)] renvoie le premierv_i tel quek = k_i s'il existe, et lève l'exception Not_found sinon. - List.find
f[e_1; …; e_n] renvoie le premiere_i tel quefe_i = true s'il existe, et lève l'exception Not_found sinon. - List.map
f[e_1; …; e_n] renvoie [fe_1; …; fe_n ]. - List.filter
fl renvoie la liste des éléments e del tels quefe = true, dans l'ordre. - List.concat
[l_1; …; l_n] renvoiel_1@…@l_n , la concaténation des listesl_i . - List.concatmap
fl renvoie List.concat (List.mapfl ). - List.fold_left
fa_0[e_1; …; e_n] renvoiea_n oùa_(k + 1) = fa_k e_(k + 1) pour0 ≤ k < n .
- Array. length a renvoie la longueur (nombre d'éléments) du tableau a.
- Array.init
n f renvoie le tableau [|f0; …; f(n − 1)|] pour n positif. - Array.of_list
[e_1; …; e_n] renvoie le tableau [|e_1; …; e_n|] .
Partie I : Description probabiliste des plantes
Question 2. Étant donnés un état
type caractere = int
type valeur = int
val num : int array (* num. (i) = k_i, i.e., }\mp@subsup{V}{-}{}i={0,1,\ldots,num.(i)-1}*
let caracteres : caractere list = List.init (Array.length num) (fun i -> i)
(* Nombre de valeurs possibles pour le nombre de pétales et pour leur couleur *)
let num = [|2; 2|]
(* Nombre de pétales *)
let nb_petales : caractere = 0
let quatre, cinq = 0, 1
(* Couleur *)
let couleur_petales : caractere = 1
let bleu, blanc = 0, 1
type 'x mesure = ('x * float) list
let dirac v = [(v, 1.)]
type espece = { name: string; mesures: valeur mesure array }
type etat = espece mesure
let myosotis : espece =
{ name = "myosotis";
mesures = [| dirac cinq; [(bleu, 0.8);(blanc, 0.2)] |] }
let lin : espece =
{ name = "lin";
mesures = [| dirac cinq; dirac bleu |] }
let gaillet : espece =
{ name = "gaillet";
mesures = [| dirac quatre; dirac blanc |] }
let sigma0 : etat = [(gaillet, 0.5);(myosotis, 0.3);(lin, 0.2)]
val proba_de : 'x -> 'x mesure -> float
val somme_ponderee : 'x mesure -> ('x -> float) -> float
val repondere : 'x mesure -> ('x -> float) -> 'x mesure
val proba_espece : espece -> caractere -> valeur -> float
val proba_etat : etat -> caractere -> valeur -> float
Question 7. Écrire une fonction
val reponse : etat -> caractere -> valeur -> etat
Partie II : Arbre optimal
type noeud = {caractere: caractere; enfants: (float * arbre) array}
and arbre =
| Noeud of noeud (* On pose une question sur un caractère. *)
| Feuille of etat (* On a atteint une feuille, on donne l'état. *)
| Impossible (* On a atteint une feuille impossible :
aucune espèce ne correspond aux réponses données. *)
- L'arbre
t n'est pas Impossible. - Si
t est de la forme Feuilleσ^′ , alorsσ^′ = σ et (au moins) l'une des deux conditions suivantes est satisfaite : -
σ est une distribution dirac (il n'y a plus qu'une seule espèce possible); -
C = ∅ (il n'y a plus de caractère disponible pour discriminer). - Si
t est de la forme Noeud {caractere=i;enfants=e} alors i est un élément deC , e est un tableau à num. (i) éléments, et pour chaque valeur possible0 ≤ v < num. (i), e. (v) est de la forme (P^σ(C_i = v), t^′ ) avec : - si
P^σ(C_i = v) = 0 , alorst^′ est Impossible; - sinon,
t^′ est un arbre de décision pour l'ensemble de caractèresC∖{i} et l'étatσ[i:=v] .

- Si
t est de la forme Feuilleσ ou Impossible, alorsh(t) = 0 . - Si
t est de la forme Noeud {caractere=i;enfants=e}, et si l'on note (p_v, t_v ) = e. (v ), alors :
val choix_possibles : 'x list array -> 'x array list
choix_possibles [| [1; 2]; [3; 4; 5] |] = [
[| 1; 3 |]; [| 1; 4 |]; [| 1; 5 |];
[| 2; 3 l]; [| 2; 4 l]; [| 2; 5 |];
]
val enumere : etat -> arbre list
val argmin : 'x list -> ('x -> float) -> 'x
val arbre_optimal : etat -> arbre
Partie III : Algorithme glouton
val score_caractere : etat -> caractere -> float
val glouton : etat -> arbre
Question 15. Dessiner les arbres de décision possibles pour l'état
Partie IV : Optimisation de l'algorithme naïf
val arbre_optimal : etat -> caractere list -> arbre * float
Donner sa spécification et montrer qu'elle la satisfait.
Question 20. On cherche maintenant à optimiser notre algorithme en interrompant la génération d'un arbre dès que son score dépasse celui de l'arbre_optimal courant. Pour cela, écrire une nouvelle fonction
val arbre_optimal_opt : etat -> caractere list -> float -> (arbre * float) option
qui prend un paramètre supplémentaire représentant le score à ne pas dépasser, et renvoie None si tous les arbres de décision possibles sont de hauteur moyenne supérieure au score maximal, ou bien un arbre optimal de hauteur moyenne inférieure s'il en existe un. La preuve de correction n'est pas demandée.
let arbre_optimal_avec_oracle
(oracle : etat -> caractere list -> arbre * float)
(etat : etat)
(caracteres : caractere list) : arbre * float =
if caracteres = [] then
(Feuille etat, 0.)
else
let caracteres_a_tester = ref caracteres in
let score_optimal = ref infinity in
let arbre_optimal = ref None in
while !caracteres_a_tester <> [] do
let caractere = List.hd !caracteres_a_tester in
let score_total = ref 1. in
let enfants : (float * arbre) array =
Array.init num.(caractere) (fun valeur ->
let p_valeur = proba_etat etat caractere valeur in
let sous_arbre, score_sous_arbre =
if p_valeur = 0. then Impossible,0. else
let etat' = reponse etat caractere valeur in
let caracteres_restants =
List.filter (fun c -> c <> caractere) caracteres
in
oracle etat' caracteres_restants
in
score_total := !score_total +. p_valeur *. score_sous_arbre;
(p_valeur, sous_arbre))
in
if !score_total < !score_optimal then
(arbre_optimal := Some (Noeud {caractere=caractere;enfants=enfants});
score_optimal := !score_total);
caracteres_a_tester := List.tl !caracteres_a_tester
done;
match !arbre_optimal with
| Some a -> a, !score_optimal
| None -> assert false
Partie V : Observations complexes et formules logiques
- Pour tout modèle déterministe
v⃗, v⃗⊨φ si et seulement siv⃗⊨ψ . - Pour tout modèle probabiliste
d, →P(d⃗⊨φ) = P(d⃗⊨ψ) .
type formule =
| Feuille of caractere * valeur list
| Conjonction of formule list
| Disjonction of formule list
Questions fréquentes
4 questionsSur quels chapitres porte le sujet d'informatique A MP-MPI X-ENS 2025 ?Afficher ou masquer la section
Questions fréquentes
4 questionsSur quels chapitres porte le sujet d'informatique A MP-MPI X-ENS 2025 ?
Le sujet porte sur les probabilités conditionnelles, les structures arborescentes récursives, l'entropie de Shannon, la preuve de programmes et la complexité algorithmique, à travers la construction d'arbres de décision pour identifier des plantes.
Le sujet X-ENS informatique MP-MPI 2025 sur les arbres de décision est-il difficile ?
Oui, le rapport montre une chute nette des taux de réussite après les premières questions de probabilités, la partie sur la preuve de programme et l'optimisation branch-and-bound étant restée largement intouchée.
Quelles erreurs le jury a-t-il le plus relevées sur ce sujet d'informatique X-ENS ?
Le jury relève un manque d'attention aux invariants des structures de données, une supposition erronée d'indépendance entre caractères, et une présentation du code parfois difficile à déchiffrer.
Le sujet X-ENS informatique 2025 est-il accessible en première année de prépa ?
Le sujet mobilise des notions de probabilités et d'algorithmique récursive qui demandent une bonne maîtrise du programme d'informatique, avec une difficulté croissante jusqu'à la preuve de programme en fin de sujet.
Pas de description pour le moment
