Mines Informatique Commune MP PC PSI 2021Sujet, corrigé et rapport du jury
Marchons, marchons, marchons...
- Bases de données et SQL
- Manipulation de listes en Python
- Lecture de fichiers texte
- Méthode d'Euler
- Complexité temporelle
- Algorithmes de tri
Téléchargements
Présentation du sujet
Difficulté moyenneMarches : randonnée, mouvement brownien et chemins auto-évitantsAfficher ou masquer la section
Présentation du sujet
Difficulté moyenneLe sujet comporte trois parties indépendantes consacrées chacune à un type de marche. La première exploite une base de données de randonnées puis calcule en Python l'altitude maximale, les dénivelés et la distance parcourue. La deuxième simule le mouvement brownien d'une particule par la méthode d'Euler, et la troisième génère des chemins auto-évitants dans Z², d'abord naïvement puis par rotations autour d'un pivot.
- 1Partie I : randonnéeRequêtes SQL sur des tables de randonnées et de participants, lecture d'un fichier texte, calcul du point le plus haut, des dénivelés et de la distance totale (Q1 à Q9).
- 2Partie II : mouvement brownien d'une petite particuleOpérations sur des vecteurs représentés par des listes, force aléatoire et résolution par la méthode d'Euler (Q10 à Q12).
- 3Partie III : marche auto-évitanteGénération naïve de chemins auto-évitants, complexité, vérification par tri, puis méthode du pivot par rotations (Q13 à Q23).
Difficulté moyenne. Le jury juge la longueur et la difficulté du sujet tout à fait adaptées à l'épreuve, avec des copies allant de presque vides à quasi parfaites.
L'épreuve en chiffres
Moyenne 9,68 / 20 · écart-type 4,14 · 3 330 présents · où vous situez-vous ?Afficher ou masquer la section
L'épreuve en chiffres
- Moyenne
- 9,68/ 20
- Écart-type
- 4,14
- Présents
- 3 330
- Coefficient
- 2
- Durée
- 2 h
Votre note sur 20 à ce sujet, en conditions de concours.
Source : document officiel du concours, épreuve du 29 avril 2021. 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
6 erreurs relevéesRequêtes SQL mal construites · Initialisation d'un maximum · Indices et signe du déniveléAfficher ou masquer la section
Ce qu'a observé le jury
6 erreurs relevéesLe sujet couvrait un large éventail de notions des deux années et a bien permis de classer les candidats. Le jury insiste sur la lisibilité des codes, la maîtrise des listes Python sans syntaxe propre à numpy, l'importation correcte des bibliothèques et le bon sens des affectations. La complexité et les tris restent des points faibles.
Les erreurs les plus sanctionnées
- 1Requêtes SQL mal construitesQ1 à Q4
Le SELECT est oublié avec une fonction d'agrégation, un encadrement du type 1998 < ne < 2004 est écrit tel quel, et des jointures sont faites sur des clés sans rapport.
« montrant ainsi un manque de compréhension de cette notion. »
- 2Initialisation d'un maximumQ6
Initialiser le maximum courant à 0 fausse la recherche du point le plus haut.
« Lors d’une recherche de maximum dans une liste, l’initialisation du maximum courant à 0 est erronée. »
- 3Indices et signe du déniveléQ7
Les dépassements d'indices dans la boucle et le signe du dénivelé négatif sont souvent mal gérés, alors que le canevas en fin d'énoncé levait le doute.
« Beaucoup de candidats ont également commis une erreur de signe concernant le dénivelé négatif »
- 4Syntaxe numpy appliquée à des listesQ10
Additionner deux listes avec + ou multiplier une liste par un scalaire ne fait pas une opération terme à terme, et L[i, j] ne fonctionne pas sur une liste de listes.
- 5Méthode d'Euler et tirages aléatoiresQ11, Q12
Les fonctions uniform ou gauss donnent une valeur différente à chaque appel, ce qui fausse le code si elles sont rappelées. Le principe d'Euler n'est pas toujours maîtrisé.
« Le principe de la méthode d’Euler n’est pas toujours maîtrisé. »
- 6Complexité et trisQ16, Q18
Beaucoup confondent nombre de boucles et complexité, au lieu de sommer les coûts des fonctions appelées. Les complexités du tri rapide et du tri fusion sont mal connues.
« Comme souvent, la détermination rigoureuse de la complexité (dans le cas le pire) d’une fonction a beaucoup posé problème. »
Ce qui a été bien réussi
- Q9 est plutôt réussie, hormis une erreur fréquente sur le type d'un point de passage.
- Q13 : le principe a globalement été compris.
- Q19 : l'idée de trier la liste du chemin a été plutôt bien comprise et la question assez réussie.
- Les questions Q21 à Q23 ont permis aux meilleurs candidats de montrer leur recul et leur maîtrise des listes.
- Des progrès ont été notés dans la gestion des fichiers texte.
Conseils du jury
- Construire une liste à partir d'une liste vide avec append plutôt qu'avec L = L + [elt].
- Se souvenir que L1 = L2 ne crée pas de copie indépendante et que modifier la variable de boucle ne modifie pas la liste.
- Appeler les fonctions d'une bibliothèque selon la syntaxe d'importation choisie.
- Stocker une valeur calculée au lieu de rappeler plusieurs fois la même fonction.
- Limiter les ratures pour que le code reste lisible.
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
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
ÉCOLE DES PONTS PARISTECH, ISAE-SUPAERO, ENSTA PARIS, TÉLÉCOM PARIS, MINES PARIS, MINES SAINT-ÉTIENNE, MINES NANCY, IMT ATLANTIQUE, ENSAE PARIS, CHIMIE PARISTECH - PSL.
Concours Mines-Télécom, Concours Centrale-Supélec (Cycle International).
CONCOURS 2021
ÉPREUVE D'INFORMATIQUE COMMUNE
Durée de l'épreuve : 2 heures
Les candidats sont priés de mentionner de façon apparente
sur la première page de la copie :
INFORMATIQUE COMMUNE
L'énoncé de cette épreuve comporte 10 pages de texte.
Marchons, marchons, marchons...
- une marche concrète (partie I - Randonnée)
- une marche stochastique (partie II - Mouvement brownien d'une petite particule)
- une marche auto-évitante (partie III - Marche auto-évitante)
Partie I. Randonnée
- la table Rando décrit les randonnées possibles - la clef primaire entière rid, son nom, le niveau de difficulté du parcours (entier entre 1 et 5 ), le dénivelé (en mètres), la durée moyenne (en minutes) :
| rid | rnom | diff | deniv | duree |
| 1 | La belle des champs | 1 | 20 | 30 |
| 2 | Lac de Castellane | 4 | 650 | 150 |
| 3 | Le tour du mont | 2 | 200 | 120 |
| 4 | Les crêtes de la mort | 5 | 1200 | 360 |
| 5 | Yukon Ho
|
3 | 700 | 210 |
|
|
|
|
|
|
- la table Participant décrit les randonneurs - la clef primaire entière pid, le nom du randonneur, son année de naissance, le niveau de difficulté maximum de ses randonnées :
| pid | pnom | ne | diff_max |
| 1 | Calvin | 2014 | 2 |
| 2 | Hobbes | 2015 | 2 |
| 3 | Susie | 2014 | 2 |
| 4 | Rosalyn | 2001 | 4 |
|
|
|
|
|
Q4-Extraire les clés primaires des randonnées qui ont un ou des homonymes (nom identique et clé primaire distincte), sans redondance.
L'accompagnatrice a activé le suivi d'une randonnée par géolocalisation satellitaire et souhaite obtenir quelques propriétés de cette randonnée une fois celle-ci effectuée. Elle a exporté les données au format texte CSV (comma-separated values - valeurs séparées par des virgules) dans un fichier nommé suivi_rando.csv : la première ligne annonce le format, les suivantes donnent les positions dans l'ordre chronologique.
lat( }\mp@subsup{}{}{\circ}),\mathrm{ long (}\mp@subsup{(}{}{\circ}),\mathrm{ height (m),time(s)
45.461516,6.44461,1315.221,1597496965
45.461448,6.444426,1315.702,1597496980
45.461383,6.444239,1316.182,1597496995
45.461641,6.444035,1316.663,1597496710
45.461534,6.443879,1317.144,1597496725
45.461595,6.4437,1317.634,1597496740
45.461562,6.443521,1318.105,1597496755
fichier = open(nom_fichier, mode) ouvre le fichier, en lecture si mode est "r".
ligne = fichier.readline() récupère la ligne suivante de fichier ouvert en lecture avec open.
lignes = fichier.readlines() donne la liste des lignes suivantes.
fichier.close() ferme fichier, ouvert avec open, après son utilisation.
ligne.split(sep) découpe la chaîne de caractères ligne selon le séparateur sep : si ligne vaut "42,43,44",
alors ligne.split(",") renvoie la liste ["42", "43", "44"].
À partir du canevas fourni en annexe et en ajoutant les import nécessaires :
Q5 - Implémenter la fonction importe_rando(nom_fichier) qui réalise cette importation en retournant la liste souhaitée, par exemple en utilisant certaines des fonctions ci-dessus.
Partie II. Mouvement brownien d'une petite particule
- une force de frottement fluide
f_F^(→−) = − αv⃗ ; - une force
f_B^(→−) aléatoire simulant l'action désordonnée des molécules d'eau sur la particule.
Le module math fournit enfin les fonctions cos et
Q11 - Implémenter la fonction derive(E) qui renvoie la dérivée du vecteur d'état passé en paramètre d'après l'équation différentielle décrite en introduction de la partie.

Partie III. Marche auto-évitante
-
∀i ‖P_(i + 1) − P_i‖ = 1 -
∀(i, j) i ≠ j ⇒ P_i ≠ P_j
.jpg)
- Le premier point est choisi à l'origine :
P_0 = (0, 0) . - En chaque position atteinte par le chemin, on recense les positions voisines accessibles pour le pas suivant et on en sélectionne une au hasard. En l'absence de positions accessibles l'algorithme échoue.
- On itère l'étape 2 jusqu'à ce que le chemin possède la longueur désirée ou échoue.
Q13 - Implémenter la fonction positions_possibles(p, atteints) qui construit la liste des positions suivantes possibles à partir du point p . La liste atteints contient les points déjà atteints par le chemin.
Q16 - Évaluer avec soin la complexité temporelle asymptotique dans le pire des cas de la fonction genere_chemin_naif(n) en fonction de n, en supposant que la fonction ne renvoie pas None.
from chemin import genere_chemin_naif
N, M, L, P = 10000, 351, [], []
for n in range(1, M):
nb = 0
for i in range(N):
chemin = genere_chemin_naif(n)
if chemin is None:
nb += 1
L.append(n)
P.append(nb / N)
import matplotlib.pyplot as plt
plt.plot(L, P)
plt.grid()
plt.show()

Afin d'éviter les inconvénients de la méthode précédente, on s'intéresse à une solution différente nommée méthode du pivot, proposée par Moti Lal en 1969. Son principe est le suivant :
- On part d'un chemin auto-évitant arbitraire de longueur
n . Ici, on choisira une initialisation très simple, le chemin droit[[0, 0], [1, 0], [2, 0], …, [n, 0]] . - On sélectionne au hasard un point, nommé pivot, entre le second et l'avant-dernier point du chemin, et un angle aléatoire de rotation parmi
π, π/2 et− π/2 . - On laisse les points avant le pivot inchangés et on fait subir à l'ensemble des points situés strictement après le pivot une rotation ayant pour centre le pivot et pour angle, l'angle choisi à l'étape 2 ci-dessus.
- Si le chemin ainsi obtenu est auto-évitant, on le garde. Sinon, on reprend à l'étape 2 la sélection d'un pivot et d'un angle, jusqu'à en trouver une paire qui conviennent.
- On répète les étapes 2 à 4 un certain nombre de fois. Le choix du nombre minimal de rotations à effectuer pour obtenir un chemin non corrélé au chemin initial est laissé de côté dans ce sujet.
.jpg)
Q19 - Implémenter la fonction est_CAE(chemin) qui vérifie si un chemin est auto-évitant en se basant sur sorted et renvoie un résultat booléen. Elle devra ne pas être de complexité temporelle asymptotique dans le pire des cas supérieure à la fonction sorted : vous prouverez ce dernier point.
Annexe : canevas de codes Python
- Partie I : Randonnée
# import Python à compléter...
# importation du fichier d'une randonnée
def importe_rando(nom_fichier):
# À compléter...
coords = importe_rando("suivi_rando.csv")
# donne le point (latitude, longitude) le plus haut de la randonnée
def plus_haut(coords):
# À compléter...
print("point le plus haut", plus_haut(coords))
# exemple : point le plus haut [45.461451, 6.443064]
# calcul des dénivelés positif et négatif de la randonnée
def deniveles(coords):
# À compléter...
print("dénivelés", deniveles(coords))
# exemple : denivelés [4.059999999999945, -1.1759999999999309]
RT = 6371 # rayon moyen volumétrique de la Terre en km
# distance entre deux points
def distance(c1, c2):
# À compléter...
print("premier intervalle", distance(coords[0], coords[1]), "m")
# exemple : premier intervalle 16.230964254992816 m
# distance totale de la randonnée
def distance_totale(coords):
# À compléter...
print("distance parcourue", distance_totale(coords), "m")
# exemple : distance parcourue 187.9700904658368 m
# import Python à compléter...
# paramètres physiques
MU = 0.0 # N
SIGMA = 1E-8 # N
M = 1E-6 # kg
ALPHA = 1E-5 # kg/s
# vérification des hypothèses sur les paramètres
assert MU >= 0 and SIGMA > 0 and M > 0 and ALPHA > 0
# multiplication-addition vectorielle
def vma(v1, a, v2):
# À compléter...
# dérivée du vecteur d'état
def derive(E):
# À compléter...
# intégration par la méthode d'Euler
def euler(EO, dt, n):
Es = [ EO ]
# À compléter...
return Es
# simulation
DT = 0.002 # durée du pas en secondes
N = 5000 # nombre de pas
Es = euler([ 0.0, 0.0, 0.0, 0.0 ], DT, N)
print("trajectoire", Es)
- Partie III : Chemin auto-évitant - méthode naïve
# import Python à compléter...
# positions auto-évitantes suivantes possibles
def positions_possibles(p, atteints):
possibles = []
# À compléter...
return possibles
# génération gloutonne d'un chemin de longueur n
# renvoie None en cas d'échec
def genere_chemin_naif(n):
chemin = [ [ 0, 0 ] ] # on part de l'origine
# À compléter...
return chemin
N = 10
print("chemin", genere_chemin_naif(N))
# import Python à compléter...
# vérifie si un chemin est CAE
def est_CAE(chemin):
# À compléter...
# calcule la rotation de q autour de p selon a :
# Pi si a vaut 0, Pi/2 si a vaut 1, -Pi/2 si a vaut 2
def rot(p, q, a):
# À compléter...
# renvoie le chemin dont les points après i_pivot
# ont subi une rotation a codé comme précédemment
def rotation(chemin, i_pivot, a):
# À compléter...
# génère un chemin de longueur n (donc n+1 points)
def genere_chemin_pivot(n, n_rot):
# À compléter...
N, A = 1000, 2.3
print("chemin", genere_chemin_pivot(N, int( A * N )))
Questions fréquentes
4 questionsSur quoi porte le sujet d'informatique commune Mines 2021 ?Afficher ou masquer la section
Questions fréquentes
4 questionsSur quoi porte le sujet d'informatique commune Mines 2021 ?
Sur trois types de marche : une randonnée étudiée avec SQL et Python, le mouvement brownien simulé par la méthode d'Euler, et la génération de chemins auto-évitants dans Z².
Quelles erreurs le jury a-t-il le plus relevées en informatique commune Mines 2021 ?
Des requêtes SQL mal construites, une syntaxe propre à numpy utilisée sur des listes, des erreurs d'indices, des affectations écrites à l'envers et des complexités mal évaluées.
Peut-on utiliser numpy dans le sujet d'informatique commune Mines 2021 ?
Le sujet demandait explicitement de manipuler des listes, et le jury juge l'usage de numpy peu opportun. Il sanctionne les opérations terme à terme écrites avec la syntaxe des tableaux numpy.
Le sujet d'informatique commune Mines 2021 est-il long ?
Le jury estime que sa longueur et sa difficulté étaient adaptées à l'épreuve, puisque certaines copies frôlent la perfection.
Pas de description pour le moment
