Sujet n° 11 · Session 2026 · 1 heure
Où peut vivre le renard ?
Pour surveiller les populations de renards, on prédit si une zone peut les accueillir en la comparant à 1 001 zones connues. Distance euclidienne, liste de tuples, tri par clé, puis un bug d'indexation dans la décision finale.
- k plus proches voisins
- Distance euclidienne
- Tuples
- Tri avec clé
- Débogage
Mise en situationLes zones connues
Chaque zone est décrite par quatre caractéristiques notées de 1 à 10 : la végétation, la proximité de l'eau, la densité urbaine et la disponibilité de proies. Pour les zones connues, une caractéristique supplémentaire indique par un booléen la présence d'un renard. Le fichier donnees_habitats.py contient la liste zones_connues, par exemple :
{'vegetation': 9, 'proximite_eau': 6, 'densite_urbaine': 0,
'disponibilite_proies': 4, 'presence_renard': True}
Pour évaluer une zone inconnue, on utilise la méthode des k plus proches voisins en la comparant aux zones connues.
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.
Question 1La distance entre deux habitats
Si h est un habitat de végétation v, de proximité de l'eau p, de densité urbaine u et de disponibilité des proies d, et h′ un habitat de caractéristiques v′, p′, u′, d′, on définit la distance δ entre h et h′ par la formule :
Écrire le code de la fonction distance qui prend en paramètres deux habitats sous la forme de dictionnaires contenant au moins les clés 'vegetation', 'proximite_eau', 'densite_urbaine', 'disponibilite_proies' et qui renvoie la distance entre ces deux habitats selon la formule présentée au-dessus. On rappelle que la racine carrée peut être calculée avec la fonction sqrt du module math.
Appel professeur
À demander au candidat
- Quel est le type des paramètres
habitat_1ethabitat_2? Quel est le type de la valeur renvoyée ? - Pourquoi
** 2et pas* 2? Que vaut3 ** 2? - Si l'on ajoutait une clé
'altitude'aux habitats, quelle seule fonction faudrait-il modifier ?
Ne pas inclure 'presence_renard' dans le calcul : la zone à évaluer n'a pas cette clé.
Résultats attendus
nouveauet la première zone- 7,211
Question 2Les distances à toutes les zones
Écrire le code de la fonction distance_d_un_habitat qui prend en paramètres un habitat sous la forme de dictionnaire et une liste d'habitats sous la forme de liste de dictionnaires. La fonction doit renvoyer une liste de tuples où chaque tuple contient :
- la distance entre l'habitat fourni et un habitat de la liste donnée ;
- le dictionnaire représentant l'habitat.
Appel professeur
À demander au candidat
- Pourquoi
resultat.append((d, h))plutôt queresultat = resultat + [(d, h)]? Quelle différence sur 1 001 zones ? - Comment vérifier dans la console que le premier élément renvoyé est un tuple dont la première composante est un flottant ?
Chaque élément est un tuple (distance, habitat) : la distance d'abord, le dictionnaire ensuite.
Question 3Un premier test
Tester la fonction distance_d_un_habitat avec l'habitat nouveau et la liste d'habitats fournis, en affichant les 3 premiers tuples de la liste. Les résultats attendus sont :
(7.211102550927978, {'vegetation': 9, 'proximite_eau': 6, 'densite_urbaine': 0, 'disponibilite_proies': 4, 'presence_renard': True})
(8.660254037844387, {'vegetation': 10, 'proximite_eau': 5, 'densite_urbaine': 9, 'disponibilite_proies': 10, 'presence_renard': False})
(5.196152422706632, {'vegetation': 8, 'proximite_eau': 5, 'densite_urbaine': 1, 'disponibilite_proies': 6, 'presence_renard': False})
Appel professeur
Résultats attendus
- 1re zone
- 7,211
- 2e zone
- 8,660
- 3e zone
- 5,196
Question 4Une erreur de tuple
La fonction presence_renard renvoie True s'il y a un renard qui habite dans plus de la moitié des k habitats traités, False sinon.
La fonction presence_renard contient une erreur de traitement des tuples. Corriger la fonction presence_renard.
Appel professeur
À demander au candidat
- Pourquoi la ligne
if distance['presence_renard']provoque-t-elle une erreur ? Quel est le type dedistanceà cet endroit ? - La variable de boucle
habitatporte le même nom qu'un paramètre. Qu'est-ce que cela change, et pourquoi est-ce une mauvaise pratique ? premiere_composanteest passée enkeyàsort. Que se passerait-il avecdistances.sort()sans clé si deux distances sont égales ?
Le tuple est (distance, caracteristiques) : c'est caracteristiques['presence_renard'] qu'il faut tester.
Ici distance masque aussi la fonction du même nom à l'intérieur de presence_renard.
Résultats attendus
- Erreur du code fourni
TypeError: un flottant n'est pas indexable
Question 5Conclure
L'habitat nouveau proposé est-il susceptible ou non de contenir une population de renards ? Expliquer en utilisant la fonction précédente avec plusieurs valeurs pour k.
Appel professeur
À demander au candidat
- Pour k = 4 avec exactement 2 voisins habités, que renvoie la fonction ? Est-ce cohérent avec l'idée de majorité ?
- Retracez
presence_renard(1, nouveau, zones_connues): quel voisin est retenu, et pourquoi celui-là alors que trois zones sont à la même distance ?
Les trois zones les plus proches sont à égalité (√3) ; le tri stable garde l'ordre du fichier, ce qui décide du résultat pour k = 1.
Résultats attendus
- k = 1, 2
False- k = 3 à 51
True
Dès que k ≥ 3, la majorité des voisins abrite un renard : la zone est susceptible d'en accueillir.
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 prediction_habitat.py à ouvrir dans votre éditeur habituel.