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
Les résultats dépendent du hasard. Pour comparer deux exécutions, placer random.seed(42) avant la simulation.
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
- Dans
__init__, à quoi sertself? Que se passerait-il avecage = ageau lieu deself.age = age? evolutionrenvoie un couple. Comment récupérez-vous ses deux valeurs en une ligne ?- Dans
evolution, pourquoinb_proiesest-il mis à jour à chaque tour de boucle, coccinelle par coccinelle ?
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.
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
- Pourquoi une boucle
for jour in range(1, 31)alors que la simulation peut s'arrêter avant ? Quandwhileserait-il plus naturel ? - La fonction renvoie un triplet. Comment récupérer ses trois valeurs séparément à l'appel ?
- Comment tester qu'une liste est vide sans utiliser
len?
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.
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
proies_par_cocci = nb_proies / nb_coccinellesutilise/et non//. Quelle différence pour les comparaisons avec 20 et 10 ?- Que se passerait-il sans la ligne
consomme = min(consomme, nb_proies)? Donnez un cas où les pucerons deviendraient négatifs.
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.
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
- Pourquoi
reproductionremet-elleniv_nutritionà 0 après une naissance ? Que modélise ce choix ? - Vous testez
random.random() < 1 / 3. Quel est le type de1 / 3? Que vaudrait1 // 3, et pourquoi serait-ce un bug ? a_survecurenvoieself.age < self.esperance_de_vie. Quel est le type de cette expression ? Pourquoi peut-on la renvoyer directement ?
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.