CAPES informatique externe 2025, épreuve 1Sujet et rapport du jury
Capes externe section NSI - Sujet de la première épreuve écrite de la session 2025
- Programmation Python : listes et dictionnaires
- Langage SQL : jointures et tri
- Conception d'algorithmes et complexité
- Recherche exhaustive (force brute)
- Algorithmes gloutons
- Graphes
- Séparation et évaluation
- Terminaison et correction : variant et invariant de boucle
Téléchargements
- Corrigé : pas encore disponible
Présentation du sujet
DifficileLe problème de la couverture par ensembles : force brute, algorithme glouton et séparation et évaluation en Python et SQLAfficher ou masquer la section
Présentation du sujet
DifficileL'épreuve disciplinaire du CAPES NSI 2025 étudie le problème algorithmique de la couverture par ensembles. Après un exemple concret et une modélisation en Python, elle compare deux variantes de recherche par force brute, un algorithme glouton, puis une méthode par séparation et évaluation s'appuyant sur des solutions partielles et un graphe associé. Les langages utilisés sont Python et SQL.
- 1Partie 1 : un problème concretSituation introductive qui fixe les idées sur la couverture par ensembles.
- 2Partie 2 : modélisation en PythonReprésentation des instances du problème et de leurs solutions en Python.
- 3Partie 3 : force bruteDeux variantes d'un algorithme de recherche exhaustive.
- 4Partie 4 : algorithme gloutonConstruction d'une solution par choix gloutons.
- 5Partie 5 : solutions partiellesIntroduction de la notion de solution partielle, sans question.
- 6Partie 6 : graphe d'une solution partielleGraphe associé à une solution partielle.
- 7Partie 7 : séparation et évaluationNouvelle résolution du problème par le paradigme de séparation et évaluation, en réutilisant les résultats précédents.
Difficile. Plus de 85 % des candidats échouent à la question de conception d'algorithme Q9 et plus de 90 % n'abordent pas ou ne réussissent pas les preuves de terminaison et de correction Q27 et Q28.
Ce qu'a observé le jury
5 erreurs relevéesConcevoir un algorithme sans code de départ · Manque de recul sur l'écriture d'un algorithme · Variant et invariant de boucle délaissésAfficher ou masquer la section
Ce qu'a observé le jury
5 erreurs relevéesL'épreuve mobilisait surtout l'algorithmique et la programmation Python, avec une bonne maîtrise attendue de SQL et une attention particulière aux dictionnaires et aux preuves de terminaison et de correction. Le jury constate une bonne maîtrise des langages Python et SQL et des efforts pour commenter le code. En revanche, les codes manquent souvent de clarté et les candidats peinent dès qu'il faut concevoir un algorithme conséquent ou raisonner sur des notions théoriques.
Les erreurs les plus sanctionnées
- 1Concevoir un algorithme sans code de départQ9
La question demandait un pseudocode court appelant une fonction donnée le moins de fois possible ; un seul appel suffisait. La grande liberté laissée par l'énoncé a déstabilisé la plupart des candidats.
« Plus de 85% des candidats ont été incapables de répondre correctement, même partiellement, à la question. »
- 2Manque de recul sur l'écriture d'un algorithmeQ9
Le jury observe une difficulté générale à concevoir un algorithme lorsque aucune base de code n'est fournie.
« Beaucoup de candidats montrent une réelle difficulté à conceptualiser un algorithme si un code initial ne leur est pas fourni. »
- 3Variant et invariant de boucle délaissésQ27, Q28
Les preuves de terminaison et de correction d'un algorithme glouton, placées dans le dernier quart du sujet, sont presque toujours absentes ou fausses.
« la faiblesse de la grande majorité des candidats dès qu’il est question de notions plus théoriques comme les invariants de boucle »
- 4Abandon de parties entièresQ14, Q18
Beaucoup de candidats renoncent à une partie alors que certaines questions pouvaient être traitées sans avoir résolu les précédentes.
« Il est regrettable que beaucoup de candidats semblent se décourager sur certaines parties »
- 5Code peu lisible
Le jury regrette une écriture de code parfois brouillonne et un manque de clarté, y compris en SQL, alors que l'énoncé insistait sur la qualité de rédaction.
« un manque de clarté et un manque de recul pouvaient parfois être relevés »
Ce qui a été bien réussi
- La requête SQL de Q3, avec JOIN et ORDER BY, a été réussie par plus de 60 % des candidats.
- La fonction Python de Q14, précisément spécifiée, est majoritairement bien écrite par ceux qui ont abordé cette partie.
- Les candidats qui ont traité Q18, sur la manipulation de dictionnaires, s'en sont plutôt bien sortis.
- Beaucoup de candidats commentent le code qu'ils proposent.
Conseils du jury
- Maîtriser les programmes de SNT et de NSI avec un recul de niveau M1.
- S'entraîner à concevoir des algorithmes à partir d'une spécification libre, sans code initial.
- Travailler les preuves de terminaison et de correction (variant, invariant) ainsi que la complexité.
- Soigner la lisibilité du code Python et SQL et le commenter.
- Parcourir tout le sujet pour repérer les questions abordables indépendamment des précédentes.
- Lire le rapport de la session et ceux des sessions précédentes.
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.
Description
Sujet officiel CAPES externe en informatique, session 2025.
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
Egalité
Fraternité
Concours externe - Troisième concours
NUMÉRIQUE ET SCIENCES INFORMATIQUES
Le sujet est constitué d'un ou plusieurs problèmes. L'épreuve consiste en leur analyse et leur résolution. Cette épreuve évalue la maîtrise des savoirs académiques.
Elle sollicite également les capacités de raisonnement et d'argumentation du candidat.
Le fait de rendre une copie blanche est éliminatoire.
INFORMATION AUX CANDIDATS
CAPES EXTERNE NUMÉRIQUE ET SCIENCES INFORMATIQUES
- -Concours externe du CAPES de l'enseignement public :
Concours Section/option Epreuve Matière E|B|E 6|2|0|0|E 1|0|19/3/1/1 - -Troisième concours du CAPES de l'enseignement public :
Concours Section/option Epreuve Matière E|B|V 6|2|0|0|E 1|0|19/3/1/1 - -Concours externe du CAFEP/CAPES de l'enseignement privé :
Concours Section/option Epreuve Matière E|B|F6 0 0 1 0 9 3/ 1
Autour du problème de la couverture par ensembles
Il est tout à fait possible de sauter des questions ou des parties du sujet, il est toutefois nécessaire de lire toutes les questions et définitions pour comprendre les questions suivantes.
Le sujet est complété de deux annexes (page 17). L'annexe A précise les quelques notations mathématiques utilisées dans le sujet. L'annexe B fournit une description succincte de la libraire Python typing utilisée tout au long du sujet pour les annotations de type.
On rappelle que les réponses aux questions de programmation doivent être compréhensibles. Une réponse même correcte risque de ne rapporter aucun point si le style ne permet pas une compréhension aisée de la solution proposée. Pour rendre vos programmes compréhensibles vous pouvez utiliser des noms de variables pertinents, des fonctions auxiliaires et des commentaires. Chaque fonction auxiliaire (comprendre, non explicitement demandée par l'énoncé) doit être accompagnée d'une description rapide de son comportement et du sens attaché à ses arguments. Si la correction de votre programme ou de votre algorithme repose sur une idée non triviale, il faut donner cette idée en français avant le code.
Lorsqu'il vous est demandé de fournir la complexité algorithmique pire cas d'une fonction, vous devez fournir le résultat sous la forme d'un
1. Un exemple introductif
- -La table ProgrammeCapes qui liste les thèmes au programme du CAPES de NSI. Cette table contient un seul champ Theme.
- -La table Enonce qui liste les énoncés disponibles. Cette table contient cinq champs : Id, Concours, Discipline, Annee et Epreuve.
- -La table Balise qui associe aux énoncés des mots-clés. Cette table a deux champs Id et MotCle. On suppose que tous les identifiants Id apparaissant dans cette table sont des identifiants d'énoncés de la table Enonce.
- -La table Ancrage qui associe à un mot-clé le thème du programme auquel il se rapporte. Cette table a deux champs MotCle et Theme. On suppose que tous les thèmes apparaissant dans cette table sont des thèmes au programme figurant dans la table ProgrammeCapes.
| Theme |
| Algorithmique |
| Types et valeurs de base |
| Types construits |
| Id | Concours | Discipline | Annee | Epreuve |
| 1 | CAPES | NSI | 2020 | écrit 1 |
| 4 | CAPES | NSI | 2021 | écrit 2 |
| 9 | CAPES | NSI | 2025 | écrit 1 |
| 10 | Agrégation | Informatique | 2023 | composition |
| Id | MotCle |
| 9 | SQL |
| 9 | algorithmes gloutons |
| 9 | graphe |
| 9 | dictionnaire |
| MotCle | Theme |
| dictionnaire | Types construits |
| SQL | Bases de données |
| fichier csv | Traitement de données en table |
| arbres | Structures de données |
| terminaison | Algorithmique |
- Q.1 Quelle requête SQL permet d'obtenir la liste des thèmes au programme du CAPES ?
- Q.2 Quelle requête donne le nombre d'années d'épreuve de CAPES présentes dans la base? Le résultat de la requête doit être réduit à ce nombre.
- Q.3 Quelle requête SQL permet d'obtenir la liste, triée par ordre alphabétique, des mots-clés associés au thème Algorithmique qui apparaissent dans au moins un énoncé de la base?
- Q.4 Quelle requête SQL permet d'obtenir la liste des thèmes couverts par les énoncés de la base de données?
- Q.5 Quelle requête SQL permet de lister les thèmes au programme qui ne sont pas couverts par au moins un énoncé de la base de données?
- Q.6 Quelle requête SQL permet d'obtenir la liste qui associe aux identifiants d'énoncés du CAPES les thèmes qu'ils couvrent? On veillera à éviter les doublons dans la liste résultat, par exemple si un énoncé couvre le thème Algorithmique parce qu'il est à la fois annoté par le mot-clé glouton et le mot-clé programmation dynamique, l'association de ce sujet au thème Algorithmique ne doit apparaître qu'une seule fois dans le résultat.
2. Présentation du problème

- -Pour le problème CouvEns sur l'instance
(X_e, F_e) , une solution peut être l'ensemble{P_2, P_3, P_4} qui est bien une couverture de cardinal minimal. C'est en fait la seule solution possible. - -Pour le problème CouvEnsTaille sur l'instance
(X_e, ℱ_e) , l'unique solution est 3. - -Pour le problème CouvEnsSeuil sur l'instance
(X_e, ℱ_e, 4) , l'unique solution est vrai (True) tandis que sur l'instance(X_e, F_e, 2) , l'unique solution est faux (False).
\item[Q.] 7 On considère l'instance
-
Q_0 = {0, 1, 3, 4, 6, 7} , -
Q_2 = {7, 8} , -
Q_4 = {0, 1, 3, 4, 5} . -
Q_1 = {1, 2, 4, 5, 7} , -
Q_3 = {6, 8} ,
Donner des sorties pour les problèmes CouvEns et CouvEnsTaille sur l'entrée(X, ℱ) ainsi que pour CouvEnsSeuil sur l'entrée(X, F, 2) .
\end{itemize}
2.1. Manipulation des problèmes
- Q.8 On suppose fourni, pour cette question seulement, un algorithme couv_ens_taille résolvant CouvEnsTaille, c'est-à-dire, prenant en arguments un ensemble
X et un ensembleF de parties deX et renvoyant le cardinal d'une couverture deX de cardinal minimal. Proposer le pseudo-code d'un algorithme utilisant couv_ens_taille et résolvant CouvEnsSeuil. Donner le nombre d'appels à couv_ens_taille effectués en fonction des valeurs d'entréesX, F etK . - Q.9 On suppose fourni, pour cette question seulement, un algorithme couv_ens_seuil résolvant CouvEnsSeuil, c'est-à-dire prenant en arguments un ensemble
X , un ensembleF de parties deX et un entierK et renvoyant un booléen indiquant s'il existe une couverture deX parF de cardinal⩽ K .- a)Proposer le pseudo-code d'un algorithme utilisant couv_ens_seuil, résolvant le problème CouvEnsTaille. Cet algorithme devra effectuer un nombre le plus faible possible d'appels à couv_ens_seuil.
- b)Donner, sans justifier, en fonction de
X etF , un ordre de grandeur du nombre d'appels à couv_ens_seuil effectués par cet algorithme. - c)Proposer un invariant de boucle, qui justifierait la correction de cet algorithme.
2.2. Représentation en machine
- -Étant donné que l'on se restreint au cas où
X = [ [0, n − 1] ] pour un certainn , l'entréeX sera représentée par un entier n. - -Une partie de
X sera représentée par la liste de ses éléments. Bien que dans tous les exemples les éléments d'une partieP ∈ F soient listés dans l'ordre croissant, ceci n'est pas requis. On n'utilisera pas cette hypothèse par la suite. L'ensembleF des parties deX autorisées pour la couverture sera alors représenté par la liste de ses éléments, de type List[List[int]]. Aussi dans la suite, on suppose défini le type ci-dessous.Parties = List[List[int]]Ainsi les donnéesX_e etℱ_e de l'exemple seront représentées en Python par les valeurs n_ex et f_ex du code ci-dessous.p0_ex = [6, 7, 8, 9, 10, 11] p1_ex = [4, 5, 7, 8] p2_ex = [0, 3, 6, 9] p3_ex = [1, 3, 4, 7, 10] p4_ex = [2, 5, 8, 11]
p5_ex = [0, 1]
f_ex = [p0_ex, p1_ex, p2_ex, p3_ex, p4_ex, p5_ex]
n_ex = 12
- -Pour manipuler les couvertures, on s'autorisera deux encodages :
- -Un sous-ensemble
C def = [P_0, P_1, …, P_(m − 1)] pourra être représenté au moyen d'une liste des indices dans la listeF des parties présentes dansC . Un tel objet est alors de type List[int]. On dira alors queC est représenté par liste d'indices. Par exemple le sous-ensembleC_1 = {P_0, P_3, P_4, P_2} de l'exemple pourra être représenté par la liste [0, 4, 3, 2] ou encore [2, 3, 4, 0]. - -Un sous-ensemble
C def = [P_0, P_1, …, P_(m − 1)] pourra aussi être représenté par un tableau de booléens t, de taillem = |F| , indiquant dans chaque case d'indicei siP_i est présent ou non dansC . Un tel objet est alors de type List[bool]. On dira alors queC est représenté par sa fonction indicatrice. Par exemple le sous-ensembleC_1 = {P_0, P_3, P_4, P_2} de l'exemple sera représenté par le tableau [True, False, True, True, True, False].
- -Un sous-ensemble
- Q.10 Définir une fonction card1 prenant en argument un sous-ensemble
, représenté par liste d'indices, et renvoyant son cardinal.card1(c: List[int]) -> int - Q.11 Définir une fonction card2 prenant en argument un sous-ensemble
C , représenté par fonction indicatrice, et renvoyant son cardinal.card2(c: List[bool]) -> int
2.3. Vérification des solutions
- Q.12 Définir une fonction verification1 prenant en arguments n et f représentant une instance
(X, F) et c représentant un sous-ensembleC deF par liste d'indices, et renvoyant siC est une couverture deX parF .verification1(n: int, f: Parties, c: List[int]) -> bool - Q.13 En utilisant les notations
X = [ [0, n − 1] ], F = {P_0, P_1, …P_(m − 1)} , pour touti ∈ [ [0, m − 1] ], n_i = |P_i|, l = ∑_(i = 0)^(m − 1)n_i , et finalementq = |C| , donner la complexité algorithmique pire cas de la fonction verification1 proposée à la question précédente (Q. 12). On attend une justification succincte. - Q.14 Définir une fonction verification2 prenant en arguments n et f représentant une instance
(X, F) et c représentant un sous-ensembleC deF par sa fonction indicatrice, et renvoyant siC est une couverture deX parF .verification2(n: int, f: Parties, c: List[bool]) -> bool - Q.15 En utilisant les notations de la Q. 13 donner la complexité algorithmique pire cas de la fonction verification2 (Q. 14). On attend une justification succincte.
- Q.16 Définir une fonction est_couvrable prenant en arguments n et f représentant une instance
(X, ℱ) et testant siX est couvrable parF .est_couvrable(n: int, f: Parties) -> bool
2.4. Obtenir des instances en Python
assoc_id_theme.csv
9,Algorithmique
3,Algorithmique
5,Algorithmique
9,Bases de données
oeufs.csv
brouillés, au plat, au plat, miroir
bénédicte, au plat, coque, parfait, mollet
>>> import csv
>>> with open('oeufs.csv', newline='') as csvfile:
... filereader = csv.reader(csvfile, delimiter=',')
... for row in filereader:
... for i in range(len(row)):
... print(row[i], end=" / ")
... print()
brouillés / au plat / au plat / miroir /
bénédicte / au plat / coque / parfait / mollet /
De manière similaire on pourrait extraire du fichier assoc_id_theme.csv un dictionnaire nommé num_theme de type Dict[str, int] qui associe à chaque thème un numéro unique entre 0 et
Q. 18 Définir une fonction cree_instance prenant en arguments dico un dictionnaire qui associe aux identifiants d'énoncés la liste des thèmes qu'ils couvrent et num un dictionnaire numérotant les thèmes apparaissant dans dico et renvoyant le couple (n, f) où n est le nombre de thèmes à couvrir et où f est une liste de listes de thèmes couverts par un même énoncé. Dans f, les thèmes doivent être représentés par leur numéro, soit un entier entre 0 et n-1.
cree_instance (dico: Dict[int, List[str]], num: Dict[str, int]) ->
→ Tuple[int, Parties]
3. Un algorithme par brute force
3.1. Version naïve
- Q.19 Définir une fonction suivant prenant en argument un tableau de
m booléens représentant la décomposition en base 2 d'un entiere de[ [0, 2^m − 1] ] (les bits de poids faibles sont à droite), et modifiant le tableau pour :- -qu'il contienne la décomposition en base 2 de l'entier
e + 1 , dans le cas oùe < 2^m − 1 ; - -qu'il contienne uniquement des False sinon.
- -qu'il contienne la décomposition en base 2 de l'entier
suivant(cand: List[bool]) -> bool
- Q.20 Définir une fonction couv_ens_naif prenant en arguments n et f représentant une instance
(X, F) et renvoyant un couple (q, c) tel que c est la représentation par fonction indicatrice d'une couverture de cardinal minimal deX parF et q est le cardinal de cette couverture.couv_ens_naif(n: int, f: Parties) -> Tuple[int, List[bool]]
3.2. Énumération par cardinal croissant
On rappelle que le nombre de sous-ensembles de cardinal
- Q.21 Définir une fonction binomiaux prenant en argument un entier
m et renvoyant une matriceb , indicée par les entiers[ [0, m] ] × [ [0, m] ] , telle que pour toutp ∈ [ [0, m] ] et toutk ∈ [ [0, m] ] , b[p] [k ] contient le coefficient(p/k) . On précisera, sans la justifier, la complexité algorithmique pire cas de la fonction implémentée.binomiaux(m: int) -> List[List[int]]
- a)former un ensemble à
k − 1 éléments de{0, 1, …, m − 2} et y ajouter l'élémentm − 1 ; - b)ou bien former un ensemble à
k éléments de{0, 1, …, m − 2} .
Le but de la question suivante est d'utiliser les remarques précédentes pour construire une fonction ensemble_num_i qui, pour trois entiers

- -Comme l'indique la Figure 2, il y a
(4/2) = 6 ensembles à 3 éléments de[ [0, 4] ] qui contiennent le nombre 4. Autrement dit, en choisissant de construire un ensemble de typea ), on obtiendrait un ensemble de numéro entre (0) et (5). Aussi choisit-on de construire un ensemble de typeb ), c'est-à-dire ne contenant pas4 . On cherche donc l'ensemble de numéro8 − 6 = 2 parmi les ensembles à 3 éléments de[ [0, 3] ] . - -Comme l'indique la Figure 2, il y a
(3/2) = 3 ensembles à 3 éléments de[ [0, 3] ] qui contiennent le nombre 3. Autrement dit, en choisissant de construire un ensemble de typea ), on obtiendrait un ensemble de numéro entre 0 et 2 . Aussi choisit-on ici de construire un ensemble de typea ), c'est-à-dire contenant 3 . On cherche donc l'ensemble de numéro 2 parmi les ensembles à 2 éléments de [0, 2], sachant qu'on lui ajoutera 3.
- -Comme l'indique la Figure 2, il y a
(2/1) = 2 ensembles à 2 éléments de[ [0, 2] ] qui contiennent le nombre 2. Autrement dit, en choisissant de construire un ensemble de typea ), on obtiendrait un ensemble de numéro entre 0 et 1 . Aussi choisit-on de construire un ensemble de typeb ), c'est-à-dire ne contenant pas2 . On cherche donc l'ensemble de numéro2 − 2 = 0 parmi les ensembles à 2 éléments de[ [0, 1] ] . - -Il y a
(1/1) = 1 ensemble à 2 éléments de[ [0, 1] ] qui contient le nombre 1 . Aussi choisit-on de construire un ensemble de typea ), c'est-à-dire contenant 1 . On cherche donc l'ensemble de numéro 0 parmi les ensembles à 1 éléments de[ [0, 0] ] , sachant qu'on lui ajoutera 1. - -Il y a
(1/1) = 1 ensemble à 1 élément de[ [0, 0] ] qui contient le nombre 0. Aussi choisit-on de construire un ensemble de typea ), c'est-à-dire contenant 0 . Il reste donc à trouver l'ensemble de numéro 0 parmi les ensembles à 0 élément de[ [0, 0] ] , sachant qu'on lui ajoutera 0 . Un tel ensemble est l'ensemble vide.
Q. 22 Définir une fonction ensemble_num_i prenant en arguments :
- -trois entiers naturels
i, k etm vérifiantk ⩽ m eti ∈ [ [0, (m/k) − 1] ] et - -une matrice b suffisamment grande pour contenir les coefficients binomiaux
(r/s) pour tout couple(r, s) de[ [0, m] ]^2 .
- -trois entiers naturels
ensemble_num_i(i: int, k: int, m: int, b: List[List[int]]) -> List[int]
couv_ens_binom(n: int, f: Parties) -> Tuple[int, List[int]]
4. Un algorithme glouton
Les algorithmes de résolution du problème CouvEns considérés jusqu'ici ont des complexités algorithmiques exponentielles. On se propose ici d'étudier l'algorithme glouton suivant.
- -On initialise l'ensemble
C à l'ensemble vide. - -Tant qu'il reste des éléments de
X qui ne sont pas couverts parC : - -on choisit dans
F l'ensembleP ayant le plus d'éléments non encore couverts parC , - -on ajoute
P àC .
Algorithme 1 : Glouton
Entrée : Une instance
(X, J) .
Sortie : Calcule une couverture de
X par
F
E ← ∅ ; // La solution en cours de construction
R ← X ; //
R pour Reste à couvrir
tant que
R ≠ ∅ faire
Choisir
P ∈ F tel que
|P ∩ R| soit maximal ;
e ← {P} ∪ e ;
R ← R∖P;
renvoyer
C
4.1. Non optimalité de l'algorithme glouton
Étant donné un entier
- -l'ensemble
X_k = {0, 1, …, 2^(k + 1) − 3} ; - -les parties
E_k = {0, 2, …, 2^(k + 1) − 4} etO_k = {1, 3, …, 2^(k + 1) − 3}^o ; - -et finalement
A_k = {2^k − 2, 2^k − 1, 2^k, …, 2^(k + 1) − 3} .
|
|
0 | 2 | 4 | 6 | ⋯ |
|
|
|
⋯ |
|
|
|
|
1 | 3 | 5 | 7 | ⋯ |
|
|
|
⋯ |
|
- Q.25 a) Donner les cardinaux des ensembles
X_k, E_k, O_k etA_k .- b)Quel est le comportement de l'algorithme glouton sur l'instance (
X_k, {E_k, O_k, A_k} )?
- b)Quel est le comportement de l'algorithme glouton sur l'instance (
- Q.26 a) Proposer un ensemble
ℱ_k contenant au moinsE_k, O_k, A_k , tel que l'algorithme glouton renvoie, sur l'instance(X_k, F_k) , une solution de cardinalk . Expliciter le déroulé de l'algorithme sur l'instance proposée.- b)Conclure.
- %.
E pour Even : pair en anglais, etO pourOdd_– : impair en anglais
4.2. Correction de l'algorithme glouton
Q. 27 Démontrer, au moyen d'un variant bien choisi, la terminaison de l'algorithme glouton.
Q. 28 Démontrer, au moyen d'un invariant bien choisi, la correction de l'algorithme glouton. Il faut donc démontrer que, pour une instance
5. Notion de solution partielle
- -sélectionne-t-on
P_1 dans la solution? - -Si oui, sélectionne-t-on
P_2 dans la solution?- -Si oui, ...
- -Si non, ...
- -Si non, sélectionne-t-on
P_2 dans la solution?- -Si oui, ...
- -Si non, ...
- -
O représente l'ensemble des parties que l'on a sélectionnées dans la solution en construction, - -
n représente l'ensemble des parties que l'on a rejetées pour cette solution.
Partiel = List[Optional[bool]]
6. Graphe associé à une solution partielle
- -
S est l'ensemble des éléments deX non couverts parO (autrement dit,S = X∖⋃_(P ∈ Θ)P ) et - -
A est l'ensemble des arêtes reliant deux sommets dès lors qu'ils sont contenus dans un même ensemble encore autorisé (autrement dit,{x, y} ∈ A si et seulement s'il existeP ∈ F∖n tel quex ∈ P ety ∈ P ).

Graph = Dict[int, Set[int]]
{0: {9, 6}, 2: {8, 11, 5}, 5: {8, 2, 11},
6: {0, 9}, 8: {2, 11, 5}, 9: {0, 6}, 11: {8, 2, 5}}
- Q.29 Définir une fonction fabrique_graphe prenant en arguments une instance
(X, ℱ) du problème CouvEns et une solution partielle sol_partielle et calculant le graphe associé à cette solution partielle.fabrique_graphe(n: int, f: Parties, sol_partielle: Partiel) -> Graph
6.1. Utilisation du graphe pour la décomposition en sous-problèmes
- Q.30 Définir une fonction Python composantes_connexes prenant en argument un graphe et renvoyant la liste de ses composantes connexes. Une composante connexe sera représentée au moyen d'un ensemble.
composantes_connexes(g: Graph) -> List[Set[int]]Dans le reste de cette sous-section, on fixe une instance(X, ℱ) du problème CouvEns. On considère le grapheG = (S, A) associé à la solution partielle vide(∅, ∅) . ConnaissantX = X_1 ∪ X_2 ∪ … ∪ X_p la décomposition en composantes connexes deG , on cherche à décomposerF enℱ_1, 𝒥_2, …, 𝒥_p , de sorte que résoudre les instances (X_i, ℱ_i ) permet de résoudre l'instance initiale. - Q.31 a) Proposer une définition des
ℱ_i .- b)Justifier succinctement que les
ℱ_i sont disjoints. - c)Expliquer comment recomposer une solution
C à l'instance (X, F ) à partir des solutionsC_i aux instances(X_i, F_i) .
- b)Justifier succinctement que les
- Q.32 On s'intéresse ici à l'algorithme qui consiste à décomposer une instance comme proposé en Q. 31 et à résoudre chaque petite instance (
X_i, ℱ_i ) au moyen de l'algorithme par brute force naïf étudié précédemment. Comparer le nombre de cas que doit traiter l'algorithme par brute force appliqué directement sur l'instance initiale, au nombre de cas que doit traiter l'algorithme décrit ci-avant.
6.2. Utilisation du graphe pour l'obtention d'un minorant
- Q.33 Expliquer en quoi la recherche d'un ensemble stable du graphe associé à une solution partielle fournit un minorant sur le cardinal d'une solution compatible avec cette solution partielle. Donner le minorant obtenu par la découverte d'un ensemble stable de cardinal
p ∈ ℕ .
- Q.34 Définir une fonction choix_glouton prenant en arguments un graphe et un ensemble de sommets candidats et renvoyant un des sommets candidats qui suit le choix glouton décrit ci-avant. On devra mettre à jour l'ensemble des candidats, au vu du choix glouton effectué.
choix_glouton(g: Graph, candidats: Set[int]) -> int - Q.35 En déduire une fonction stable prenant en argument un graphe et renvoyant un ensemble stable en itérant,tant que cela est possible, le choix glouton ci-dessus.
stable(g: Graph) -> Set[int] - Q.36 a) Cet algorithme fournit-il un ensemble stable qui est de cardinal maximal (autrement dit, un ensemble stable tel qu'il n'existe aucun ensemble stable de cardinal strictement supérieur) ? On attend une justification succincte ou un contre-exemple.
- b)Cet algorithme fournit-il un ensemble stable qui est maximal pour l'inclusion (autrement dit, un ensemble stable qui n'est contenu dans aucun ensemble stable autre que luimême) ? On attend une justification succincte ou un contre-exemple.
- Q.37 Déduire des question précédentes une fonction minorant_couv_ens prenant en argument une instance du problème
(X, ℱ) et une solution partielle et renvoyant un minorant du cardinal des solutions du problème CouvEns, compatibles avec cette solution partielle.minorant_couv_ens(n: int, f: Parties, sol_partielle: Partiel) -> int
7. Séparation et évaluation
Q. 38 En s'inspirant de l'algorithme glouton de la section 4 (Algorithme 1, page 10), écrire le pseudo-code d'un algorithme fournissant une solution compatible avec une solution partielle donnée si cela est possible. Dans le cas contraire l'algorithme renverra None.
glouton_compatible(n: int, f: Parties, partiel: Partiel) -> Optional[Tuple[int,
→ List[bool]]]
Q. 39 Définir une fonction separation_et_evaluation implémentant l'algorithme décrit ci-avant.
separation_et_evaluation(n: int, f: Parties) -> Tuple[int, List[bool]]
A Notations mathématiques utilisées dans le sujet
- -
ℕ est l'ensemble des entiers naturels{0, 1, 2, …} . - -
ℤ est l'ensemble des entiers relatifs{…, − 2, − 1, 0, 1, 2, …} . - -Lorsque
a ∈ ℤ etb ∈ ℤ, [ [a, b] ] désigne l'ensemble des entiersz vérifianta ⩽ z ⩽ b , à savoir{a, a + 1, a + 2, …, b − 1, b} sia ⩽ b , et l'ensemble vide sinon. - -
∅ désigne l'ensemble vide. - -Si
X etY sont deux ensembles, alors- -
X ⊆ Y désigne le fait que l'ensembleX est inclus ou égal à l'ensembleY ; - -
X ∪ Y désigne l'ensemble union deX etY ; - -
X ∩ Y désigne l'intersection deX etY ; - -
X∖Y désigne l'ensemble des éléments deX qui ne sont pas dansY .
- -
- -Si
X est un ensemble fini, alors|X| désigne son cardinal, c'est-à-dire son nombre d'éléments. - -Si
C est un ensemble d'ensembles⋃_(X ∈ C)X désigne l'union de tous les ensemblesX deC . Ainsi siC = {X_1, X_2, …, X_p} est un ensemble fini de cardinalp > 0 , alors⋃_(X ∈ C)X = X_1 ∪ X_2 ∪ … ∪ X_p . Dans le cas particulier oùC = ∅, ⋃_(X ∈ C)X = ∅ . - -Si
(u_1, u_2, …, u_n) est une suite finie de nombres,∑_(i = 1)^n u_i désigne la sommeu_1 + u_2 + … + u_n .
B Typage Python
from typing import Dict, Set, List, Tuple, Optional
B. 1 Signature de fonction
f(x1: t1, x2: t2, ..., xn: tn) -> t
B. 2 Types prédéfinis
- -bool le type des booléens.
- -int le type des entiers relatifs. Par exemple 0, 1, -3 sont de type int.
- -float le type des nombres flottants.
- -str le type des chaînes de caractères. Par exemple "toto", "".
List
Tuple
Set
Dict
Optional
def mal_typee(y: int) -> int:
if y != 0:
return 2025 // y
def bien_typee(y: int) -> Optional[int]:
if y != 0:
return 2025 // y
B. 3 Définition de nouveaux types
NouveauType = t
Partiel = List[Optional[bool]]
- a. les thèmes dans notre exemple
◇. l'ensemble des sujets dans notre exemple, chaque sujet étant un ensemble de thèmes- une sélection de sujets couvrant tous les thèmes dans notre exemple
◇. dans notre exemple, on cherche une sélection, la plus petite possible, c'est-à-dire avec le moins de sujets possible
- une sélection de sujets couvrant tous les thèmes dans notre exemple
Questions fréquentes
4 questionsSur quoi porte la première épreuve écrite du CAPES NSI 2025 ?Afficher ou masquer la section
Questions fréquentes
4 questionsSur quoi porte la première épreuve écrite du CAPES NSI 2025 ?
Sur le problème de la couverture par ensembles, traité en Python et en SQL : modélisation, force brute, algorithme glouton, graphe d'une solution partielle et séparation et évaluation.
Quelles questions ont posé problème au CAPES NSI 2025 épreuve 1 ?
La question Q9, qui demandait de concevoir librement un algorithme court, avec plus de 85 % d'échecs, et les preuves de terminaison et de correction Q27 et Q28, non abordées ou non réussies par plus de 90 % des candidats.
Quels points ont été réussis à l'écrit 1 du CAPES informatique 2025 ?
La requête SQL de Q3 et les fonctions Python bien spécifiées (Q14 sur les listes, Q18 sur les dictionnaires) pour ceux qui les ont abordées. Le jury note une bonne maîtrise globale de Python et de SQL.
Comment préparer l'épreuve disciplinaire du CAPES NSI d'après le rapport 2025 ?
Connaître les programmes de SNT et de NSI avec un recul de niveau M1, s'entraîner à concevoir des algorithmes sans code de départ, travailler variants, invariants et complexité, et soigner la clarté du code.
Pas de description pour le moment