Aller au contenu

Corrigé — TP Choixpeau Magique et KNN


Partie 1 : Modéliser un élève

Question 1 — Modélisation d'Anthony

anthony = {"nom": "Anthony", "courage": 2, "loyauté": 8, "sagesse": 8, "malice": 3, "maison": "Serdaigle"}

Question 3 — Distance entre Hermione et Adrian

  • Hermione : courage=8, loyauté=6, sagesse=6, malice=6
  • Adrian : courage=9, loyauté=4, sagesse=7, malice=10
distance = |8-9| + |6-4| + |6-7| + |6-10|
         =   1   +   2   +   1   +   4
         = 8 ✓

Question 4 — Distance entre Arthur et Drago

  • Arthur : courage=10, loyauté=4, sagesse=2, malice=5
  • Drago : courage=6, loyauté=6, sagesse=5, malice=8
distance = |10-6| + |4-6| + |2-5| + |5-8|
         =    4   +   2   +   3   +   3
         = 12

Question 5 — Fonction distance

def distance(eleve1, eleve2):
    return (abs(eleve1["courage"] - eleve2["courage"]) +
            abs(eleve1["loyauté"] - eleve2["loyauté"]) +
            abs(eleve1["sagesse"] - eleve2["sagesse"]) +
            abs(eleve1["malice"]  - eleve2["malice"]))

Partie 2 : Charger les données en table

Question 1 — Type de eleve[0]

eleve[0] est de type str. csv.reader retourne toutes les valeurs sous forme de chaînes de caractères.

Question 2 — Pourquoi int() ?

int(eleve[1]) est de type int. On a besoin de la conversion car csv.reader renvoie tout en str, et on a besoin de valeurs numériques pour calculer des distances.

Question 3 — Type de poudlard

poudlard est de type list (une liste de dictionnaires).


Partie 3 : Trouver la maison majoritaire

def maison_majoritaire(table):
    frequences = frequence_des_maisons(table)
    maison_max = None
    max_freq = 0
    for maison, freq in frequences.items():
        if freq > max_freq:
            max_freq = freq
            maison_max = maison
    return maison_max

Partie 4 : Sept plus proches voisins

Question 1 — Pseudo-code

Algorithme sept_voisins(table, nouveau) :
  Données :
    - table : liste d'élèves avec leur maison
    - nouveau : élève sans maison
  Résultat : les 7 élèves de table les plus proches de nouveau

  Pour chaque élève de table :
    Calculer la distance entre cet élève et nouveau
    Stocker (distance, élève)
  Trier la liste par distance croissante
  Retourner les 7 premiers éléments

Question 2 — Implémentation Python

def sept_voisins(table, nouveau):
    distances = []
    for eleve in table:
        d = distance(eleve, nouveau)
        distances.append((d, eleve))
    distances.sort(key=lambda x: x[0])
    return [eleve for d, eleve in distances[:7]]

Partie 5 : Attribuer une maison

def attribuer_maison(table, nouveau):
    voisins = sept_voisins(table, nouveau)
    return maison_majoritaire(voisins)

Application aux quatre élèves

poudlard = charger_table("choixpeauMagique.csv")

hermione = {"nom": "Hermione", "courage": 8, "loyauté": 6, "sagesse": 6, "malice": 6}
drago    = {"nom": "Drago",    "courage": 6, "loyauté": 6, "sagesse": 5, "malice": 8}
cho      = {"nom": "Cho",      "courage": 7, "loyauté": 6, "sagesse": 9, "malice": 6}
cedric   = {"nom": "Cédric",   "courage": 7, "loyauté": 10, "sagesse": 5, "malice": 6}

for eleve in [hermione, drago, cho, cedric]:
    maison = attribuer_maison(poudlard, eleve)
    print(f"{eleve['nom']}{maison}")

Résultats attendus

Hermione → Gryffondor
Drago    → Serpentard
Cho      → Serdaigle
Cédric   → Poufsouffle

Détail des 7 voisins et du vote pour chaque élève :

Élève 7 plus proches voisins (distance) Vote majoritaire
Hermione Cormac (4), Milicent (5), Neville (5), Padma (5), Susan (5), Angelina (6), Colin (6) Gryffondor 4/7 ✓
Drago Padma (2), Susan (4), Angelina (5), Gregory (5), Harper (5), Bole (6), Marcus (6) Serpentard 4/7 ✓
Cho Terry (5), Gilderoy (6), Lavande (6), Saemus (6), Eddie (7), Marcus (7), Padma (7) Serdaigle 4/7 ✓
Cédric Dean (6), Gregory (6), Hannah (6), Norbert (6), Pomona (6), Susan (7), Térence (7) Poufsouffle 4/7 ✓

Ces résultats sont cohérents avec les personnages du roman : Hermione et Drago sont bien placés dans leurs maisons respectives, Cho Chang est à Serdaigle et Cédric Diggory à Poufsouffle.


Auteur : Florian Mathieu — Licence CC BY NC


Dernière mise à jour : 07/07/2026