Mini-projets algorithmique, corrigé TP KNN, news, notebooks IA
This commit is contained in:
159
knn/test_choixpeau.py
Normal file
159
knn/test_choixpeau.py
Normal file
@@ -0,0 +1,159 @@
|
||||
import csv
|
||||
import time
|
||||
|
||||
# ── Chargement des données ────────────────────────────────────────────────────
|
||||
|
||||
def charger_table(nom_fichier):
|
||||
table = []
|
||||
with open(nom_fichier, 'r', newline="", encoding="utf-8") as csvfile:
|
||||
eleve_reader = csv.reader(csvfile, delimiter=";")
|
||||
eleve_reader.__next__()
|
||||
for eleve in eleve_reader:
|
||||
table.append({
|
||||
"nom": eleve[0],
|
||||
"courage": int(eleve[1]),
|
||||
"loyauté": int(eleve[2]),
|
||||
"sagesse": int(eleve[3]),
|
||||
"malice": int(eleve[4]),
|
||||
"maison": eleve[5].strip()
|
||||
})
|
||||
return table
|
||||
|
||||
# ── Algorithme KNN ────────────────────────────────────────────────────────────
|
||||
|
||||
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"]))
|
||||
|
||||
def sept_voisins(table, nouveau):
|
||||
distances = [(distance(eleve, nouveau), eleve) for eleve in table]
|
||||
distances.sort(key=lambda x: x[0])
|
||||
return [eleve for d, eleve in distances[:7]]
|
||||
|
||||
def maison_majoritaire(voisins):
|
||||
frequences = {}
|
||||
for eleve in voisins:
|
||||
maison = eleve["maison"]
|
||||
frequences[maison] = frequences.get(maison, 0) + 1
|
||||
return max(frequences, key=frequences.get), frequences
|
||||
|
||||
# ── Affichage ─────────────────────────────────────────────────────────────────
|
||||
|
||||
MAISONS = {
|
||||
"Gryffondor": {
|
||||
"traits": "Courage, chevalerie et determination",
|
||||
"message": "Tu es du genre a te jeter dans la bataille sans trop reflechir.\nPoudlard a besoin de toi sur le terrain de Quidditch !"
|
||||
},
|
||||
"Serpentard": {
|
||||
"traits": "Malice, ambition et ressource",
|
||||
"message": "Tu sais ce que tu veux, et tu sais comment l'obtenir.\nMefie-toi quand meme de Lord Voldemort dans les couloirs."
|
||||
},
|
||||
"Serdaigle": {
|
||||
"traits": "Sagesse, creativite et esprit",
|
||||
"message": "Tu preferes comprendre avant d'agir. La bibliotheque\nde Poudlard va devenir ton deuxieme chez-toi."
|
||||
},
|
||||
"Poufsouffle": {
|
||||
"traits": "Loyaute, patience et equite",
|
||||
"message": "On peut compter sur toi. Toujours. Sans exception.\nCedric Diggory etait de Poufsouffle — ca dit tout."
|
||||
}
|
||||
}
|
||||
|
||||
def afficher_banniere(maison):
|
||||
largeur = 42
|
||||
print()
|
||||
print("=" * largeur)
|
||||
print("|" + " " * (largeur - 2) + "|")
|
||||
ligne = f" Le Choixpeau a decide : {maison.upper()}"
|
||||
print("|" + ligne.ljust(largeur - 2) + "|")
|
||||
print("|" + " " * (largeur - 2) + "|")
|
||||
infos = MAISONS.get(maison, {})
|
||||
traits = f" {infos.get('traits', '')}"
|
||||
print("|" + traits.ljust(largeur - 2) + "|")
|
||||
print("|" + " " * (largeur - 2) + "|")
|
||||
print("=" * largeur)
|
||||
print()
|
||||
print(infos.get("message", ""))
|
||||
print()
|
||||
|
||||
def afficher_voisins(voisins, moi):
|
||||
print("-" * 42)
|
||||
print(" Les 7 eleves de Poudlard qui te ressemblent le plus :")
|
||||
print()
|
||||
for v in voisins:
|
||||
d = distance(v, moi)
|
||||
print(f" {v['nom']:<12} ({v['maison']:<12}) distance : {d}")
|
||||
print("-" * 42)
|
||||
print()
|
||||
|
||||
# ── Saisie avec validation ────────────────────────────────────────────────────
|
||||
|
||||
QUESTIONS = [
|
||||
("courage", "Face au danger, tu fonces sans hesiter "),
|
||||
("loyauté", "Tu es fidele a tes amis, quoi qu'il arrive "),
|
||||
("sagesse", "Tu reflechis avant d'agir, tu observes, tu analyses "),
|
||||
("malice", "Tu sais trouver des strategies pour arriver a tes fins"),
|
||||
]
|
||||
|
||||
def poser_question(trait, description):
|
||||
while True:
|
||||
try:
|
||||
rep = input(f" {description} (1 a 10) : ").strip()
|
||||
valeur = int(rep)
|
||||
if 1 <= valeur <= 10:
|
||||
return valeur
|
||||
print(" --> Donne une valeur entre 1 et 10.")
|
||||
except ValueError:
|
||||
print(" --> Entre un nombre entier.")
|
||||
|
||||
# ── Programme principal ───────────────────────────────────────────────────────
|
||||
|
||||
def main():
|
||||
print()
|
||||
print("=" * 42)
|
||||
print("| |")
|
||||
print("| CHOIXPEAU MAGIQUE -- KNN |")
|
||||
print("| |")
|
||||
print("=" * 42)
|
||||
print()
|
||||
|
||||
try:
|
||||
poudlard = charger_table("choixpeauMagique.csv")
|
||||
except FileNotFoundError:
|
||||
print("Erreur : le fichier 'choixpeauMagique.csv' est introuvable.")
|
||||
print("Place-le dans le meme dossier que ce script.")
|
||||
return
|
||||
|
||||
prenom = input("Quel est ton prenom ? ").strip()
|
||||
if not prenom:
|
||||
prenom = "Mystere"
|
||||
|
||||
print()
|
||||
print(f"Bien, {prenom}. Reponds honnêtement à ces quatre questions.")
|
||||
print("Note-toi de 1 (pas du tout) à 10 (totalement).")
|
||||
print()
|
||||
|
||||
eleve = {"nom": prenom}
|
||||
for trait, description in QUESTIONS:
|
||||
eleve[trait] = poser_question(trait, description)
|
||||
|
||||
print()
|
||||
print("Le Choixpeau murmure quelque chose...")
|
||||
time.sleep(1)
|
||||
print("Il se tait.")
|
||||
time.sleep(1)
|
||||
print("Puis il crie :")
|
||||
time.sleep(0.8)
|
||||
|
||||
voisins = sept_voisins(poudlard, eleve)
|
||||
maison, frequences = maison_majoritaire(voisins)
|
||||
|
||||
afficher_banniere(maison)
|
||||
time.sleep(0.5)
|
||||
afficher_voisins(voisins, eleve)
|
||||
|
||||
print(f" Repartition du vote : {frequences}")
|
||||
print()
|
||||
|
||||
main()
|
||||
Reference in New Issue
Block a user