Épreuve pratique NSI

Sujet n° 7 · Session 2026 · 1 heure

Coccinelles contre pucerons

Un maraîcher lâche des coccinelles dans sa serre pour lutter contre les pucerons. Le candidat fait tourner une simulation objet, l'automatise, la documente, puis la rend plus réaliste en ajoutant maturité sexuelle et mort par famine.

  • Programmation objet
  • Simulation
  • Module random
  • Tuples
  • Documentation

Mise en situationLe modèle

La classe Coccinelle possède quatre attributs : age (en jours), esperance_de_vie (en jours), sexe ("male" ou "femelle") et niv_nutrition (nombre de jours consécutifs durant lesquels la coccinelle s'est suffisamment nourrie). La fonction evolution(population, nb_proies) simule l'écosystème sur une journée.

Rappel : random.randint(a, b) renvoie un entier aléatoire compris entre a et b inclus ; random.random() renvoie un flottant aléatoire entre 0 inclus et 1 exclu.

Toutes les cellules de cette page partagent le même Python, comme un notebook : une fonction écrite à une question sert aux suivantes. Maj + Entrée exécute la cellule.

Pour l'examinateur

Repère

Les résultats dépendent du hasard. Pour comparer deux exécutions, placer random.seed(42) avant la simulation.

1

Question 1Cinq jours dans la serre

Le fichier coccinelles.py contient la classe Coccinelle et la fonction evolution. Les méthodes à modifier aux questions 3 et 4 se trouvent dans cette cellule.

On souhaite observer le comportement du modèle sur une courte période. Créer une population initiale contenant 3 coccinelles (2 femelles et 1 mâle), toutes âgées de 10 jours et ayant un niveau de nutrition de 2. Le nombre initial de pucerons est fixé à 200.

Écrire une séquence d'instructions (utilisant une boucle) permettant de simuler l'évolution de ce petit écosystème sur 5 jours consécutifs, en appelant la fonction evolution. Afficher le nombre de coccinelles et de pucerons à la fin de chaque journée.

Appel professeur

À demander au candidat

  1. Dans __init__, à quoi sert self ? Que se passerait-il avec age = age au lieu de self.age = age ?
  2. evolution renvoie un couple. Comment récupérez-vous ses deux valeurs en une ligne ?
  3. Dans evolution, pourquoi nb_proies est-il mis à jour à chaque tour de boucle, coccinelle par coccinelle ?
Point de vigilance

Il faut réaffecter les deux variables à chaque jour : population, nb_proies = evolution(population, nb_proies).

Résultats attendus
Avec random.seed(42), coccinelles
7, 7, 11, 11, 11
Pucerons
184, 122, 67, 16, 0

Valeurs obtenues avec le modèle de départ. Après la question 4, la même graine donne 3 coccinelles chaque jour.

2

Question 2Automatiser la simulation

Écrire une fonction simulation_simple(population, nb_proies) qui automatise ce processus sur une durée maximale de 30 jours.

Cette fonction doit s'interrompre prématurément si la population de coccinelles ou de pucerons tombe à zéro. Elle doit renvoyer un triplet (tuple) contenant : le nombre final de coccinelles, le nombre final de pucerons, et le nombre de jours effectivement simulés.

Tester cette fonction en créant une population initiale identique à la question précédente face à 1000 pucerons.

Appel professeur

À demander au candidat

  1. Pourquoi une boucle for jour in range(1, 31) alors que la simulation peut s'arrêter avant ? Quand while serait-il plus naturel ?
  2. La fonction renvoie un triplet. Comment récupérer ses trois valeurs séparément à l'appel ?
  3. Comment tester qu'une liste est vide sans utiliser len ?
Point de vigilance

Le test d'arrêt porte sur les coccinelles OU les pucerons, et se fait à l'intérieur de la boucle, après l'appel à evolution.

Résultats attendus
Avec random.seed(42), 1 000 pucerons
(63, 0, 10)

Modèle de départ. Après la question 4, la même graine donne (51, 128449, 30) : les pucerons prolifèrent.

3

Question 3Documenter la chasse

Écrire la documentation et les commentaires de la méthode chasser. Elle se trouve dans la classe, à la question 1.

Appel professeur

À demander au candidat

  1. proies_par_cocci = nb_proies / nb_coccinelles utilise / et non //. Quelle différence pour les comparaisons avec 20 et 10 ?
  2. Que se passerait-il sans la ligne consomme = min(consomme, nb_proies) ? Donnez un cas où les pucerons deviendraient négatifs.
Point de vigilance

Une docstring complète décrit les deux paramètres, les trois paliers de consommation, le plafonnement, la mise à jour de niv_nutrition et la valeur renvoyée.

4

Question 4Un modèle plus réaliste

Après une première analyse des résultats, le producteur se rend compte que le modèle actuel ne tient pas compte de deux phénomènes :

  • le modèle suppose que les coccinelles peuvent se reproduire dès leur naissance, alors qu'en réalité, la reproduction n'est possible qu'à partir de 20 jours de vie ;
  • le modèle ne tient pas compte des conséquences mortelles d'un manque de nourriture. Lorsqu'une coccinelle atteint un niveau de nutrition de 0, elle a en réalité 1 chance sur 3 (environ 33 % de probabilité) de ne pas survivre à la journée.

Modifier les méthodes reproduction et a_survecu de la classe Coccinelle afin d'y intégrer ces deux nouvelles règles biologiques. Tester à nouveau la simulation globale pour observer les changements.

Appel professeur

À demander au candidat

  1. Pourquoi reproduction remet-elle niv_nutrition à 0 après une naissance ? Que modélise ce choix ?
  2. Vous testez random.random() < 1 / 3. Quel est le type de 1 / 3 ? Que vaudrait 1 // 3, et pourquoi serait-ce un bug ?
  3. a_survecu renvoie self.age < self.esperance_de_vie. Quel est le type de cette expression ? Pourquoi peut-on la renvoyer directement ?
Point de vigilance

La condition d'âge s'ajoute au même if que la nutrition, avec and.

Dans a_survecu, l'âge doit être incrémenté avant les deux tests de mort.

Résultats attendus
Mort par famine, sur 3 000 tirages
environ 34 %

Le fichier du candidat

Le jour de l'épreuve, le candidat travaille dans un seul fichier. Ce bouton rassemble vos cellules dans l'ordre, telles qu'elles sont à l'écran, en un coccinelles.py à ouvrir dans votre éditeur habituel.

Chargement de Python…