Maths & NSI

Baccalauréat — Épreuve pratique — 2026 — NSI

Épreuve pratique NSI 2026 — Sujet 11 : habitats du renard et k plus proches voisins

Sujet

Épreuve pratique de NSI, session 2026 — sujet n°11 de la banque nationale. Durée : 1 heure, sur ordinateur. Le candidat dispose de l'énoncé et de fichiers de code et de données ; il agit en autonomie et, aux « appels professeur » indiqués, présente son travail à l'examinateur ou le sollicite en cas de difficulté.

Habitats du renard

Le renard est un animal qui peut habiter dans plusieurs types d'habitats pouvant être des plaines, des montagnes, des environnements ruraux, périurbains, voire urbains. La loi Biodiversité de 2016 ainsi que l'arrêté du 3 août 2023 prévoient que le renard n'est plus un animal « nuisible » mais « susceptible d'être nuisible ».

Malgré la loi, le renard est souvent chassé des zones où il pourrait normalement évoluer et réguler la faune. Pour éviter certaines dérives, il est recommandé de surveiller la population de renards dans les zones concernées et donc de prédire si un renard peut habiter cette zone.

Pour la prédiction des zones habitables d'un renard, on considère les caractéristiques suivantes : la végétation, la proximité de l'eau, la densité urbaine et la disponibilité de proies. Ces caractéristiques sont toutes mesurées sur une échelle de 1 à 10. De plus, on dispose pour les zones connues d'une caractéristique supplémentaire indiquant, par un booléen, la présence d'un renard.

Pour évaluer la possibilité qu'un renard puisse habiter une zone non encore connue, on va utiliser la méthode des kk plus proches voisins en la comparant aux zones connues.

Le jeu de données est fourni dans le fichier donnees_habitats.py, dont une partie du contenu est ci-après :

zones_connues = [
    {'vegetation': 9, 'proximite_eau': 6, 'densite_urbaine': 0,
     'disponibilite_proies': 4, 'presence_renard': True},
    {'vegetation': 10, 'proximite_eau': 5, 'densite_urbaine': 9,
     'disponibilite_proies': 10, 'presence_renard': False}
]

Le fichier prediction_habitat.py contient des fonctions qui seront nécessaires à l'évaluation de ces zones et qui devront être complétées, modifiées ou implémentées.

Si hh est un habitat de végétation vv, de proximité de l'eau pp, de densité urbaine uu et de disponibilité des proies dd, et h′h' un habitat ayant, de même, les caractéristiques v′v', p′p', u′u', d′d', on définit la distance δ\delta entre hh et h′h' par la formule :

δ=(v−v′)2+(p−p′)2+(u−u′)2+(d−d′)2\delta = \sqrt{(v - v')^2 + (p - p')^2 + (u - u')^2 + (d - d')^2}

Question 1. É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.

Question 2. É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 — Appeler le professeur pour lui présenter votre réponse ou en cas de difficulté.

Question 3. 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 indiqués ci-dessous.

(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 — Appeler le professeur pour lui présenter votre réponse ou en cas de difficulté.

La fonction presence_renard renvoie True s'il y a un renard qui habite dans plus de la moitié des kk habitats traités, False sinon.

Question 4. La fonction presence_renard contient une erreur de traitement des tuples. Corriger la fonction presence_renard.

Question 5. 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 kk.

Appel professeur — Appeler le professeur pour lui présenter votre réponse ou en cas de difficulté.

Fichiers fournis

Le dossier comporte une version PDF de l'énoncé, le code source de départ prediction_habitat.py et le jeu de données donnees_habitats.py (1 001 zones connues), qui doit être importé.

prediction_habitat.py

from math import sqrt
from donnees_habitats import zones_connues
 
nouveau = {'vegetation': 5, 'proximite_eau': 2,
           'densite_urbaine': 4, 'disponibilite_proies': 6}
 
 
def distance(habitat_1, habitat_2):
    '''
    Calcule la distance euclidienne entre deux habitats.
    entrée : 
        - habitat_1 : dictionnaire représentant un habitat.
        - habitat_2 : dictionnaire représentant un autre habitat.
    sortie : 
        - float : distance euclidienne entre habitat_1 et habitat_2.
    '''
    pass  # à remplacer par votre code
 
 
def distance_d_un_habitat(habitat, habitats):
    '''
    Calcule la distance entre un habitat et chaque habitat de la liste.
    entrée : 
        - habitat : dictionnaire représentant un habitat.
        - habitats : liste de dictionnaires représentant des habitats.
    sortie : 
        - list[tuple] : liste de tuples (distance, habitat) où distance est la distance entre habitat et chaque habitat de la liste.
    '''
    pass  # à remplacer par votre code
 
 
def premiere_composante(c):
    '''Fonction utilitaire renvoyant la première composante d'un tuple'''
    return c[0]
 
 
def k_plus_proches(k, habitat, habitats):
    '''
    Calcule les k habitats les plus proches de l'habitat donné.
    entrée : 
        - k : entier représentant le nombre d'habitats à retourner.
        - habitat : dictionnaire représentant un habitat.
        - habitats : liste de dictionnaires représentant des habitats.
    sortie : 
        - list[tuple] : liste de tuples (distance, habitat) l'élément à l'indice 0 est la distance euclidienne entre habitat 
                        et chaque habitat de la liste et l'élément à l'indice 1 est le dictionnaire correspondant à l'habitat correspondant.
    '''
    # On calcule les distances
    distances = distance_d_un_habitat(habitat, habitats)
    # On cherche à trier les distances en fonction de la distance euclidienne.
    distances.sort(key=premiere_composante)
    # renvoie les distances jusque la borne k non comprise
    return distances[:k]
 
 
def presence_renard(k, habitat, habitats):
    '''
    Vérifie si l'habitat donné a plus de k/2 voisins avec des renards.
    entrée : 
        - k : entier représentant le nombre d'habitats à considérer.
        - habitat : dictionnaire représentant un habitat.
        - habitats : liste de dictionnaires représentant des habitats.
    sortie : 
        - bool : True si l'habitat a plus de k/2 voisins avec des renards, False sinon.
    '''
    habitats = k_plus_proches(k, habitat, habitats)
    n_renards = 0
    for habitat in habitats:
        distance = habitat[0]
        caracteristiques = habitat[1]
        if distance['presence_renard']:
            n_renards += 1
    return n_renards > k/2

Corrigé

Corrigé réservé aux abonnés Premium.

Créez un compte gratuit : votre première correction est offerte.

Sujet officiel de la banque nationale de sujets 2026 de l'épreuve pratique de NSI (ministère de l'Éducation nationale, sujets.examens-concours.gouv.fr). Corrigé rédigé pour ce site.