📅 Date de dépôt : 11/05/2025
👉 Il est recommandé de consulter les notebooks avant d’explorer les fichiers de code.
- BARKAN INES
- ABOUNAIM ELIAS
- AABADLI ADAM (Chef d'équipe)
- NDOUR FATOUMATA
Jupyter_Notebook/: contient les notebooks pour chaque TP.Code: contient le code séparé.
Ce dépôt contient notre rendu final pour les TP suivants du polycopié:
- Fichier :
HERMITE.ipynb - Contenu : Implémentation de l’algorithme de réduction en forme normale d'Hermite, tests sur plusieurs matrices, vérification des solutions symboliques.
- Fichier :
NASH.ipynb - Contenu : Modélisation avec PULP, résolution d’un jeu stratégique, calcul d’un équilibre de Nash via programmation linéaire.
- Fichier :
TSP.ipynb - Contenu : Implémentation d'une solution au TSP avec génération de graphes, algorithme exact, visualisation du parcours optimal.
- Fichier :
Reduction_base.ipynb - Contenu : Réduction de base de matrices, application au problème du vecteur le plus proche, tests sur cas simples.
conda create -n projet_algo python=3.10
conda activate projet_algopip install -r requirements.txt
scikit-learnest utilisé uniquement pour une visualisation avecKMeansdans un exemple.
Si Jupyter n’est pas installé : pip install notebook.
jupyter notebookLes fichiers .ipynb sont autoportants : ils contiennent à la fois le code, la documentation et les exemples.
Pour effectuer d'autres tests, suivez les exemples présentés à la fin de chaque notebook, ajoutez une cellule de code et exécutez-la.
- Reproduire les étapes 1 et 2 de la section 🛠️ Instructions pour tester (création/activation de l’environnement et installation des dépendances).
- Depuis la racine du projet, lancez les tests de chaque module avec :
conda activate projet_algo
python Code/<nom_du_fichier>.py Remplacez <nom_du_fichier> par le nom du script Python correspondant :
- Hermite
python Code/Hermite.py- Nash
python Code/Nash.py- Reduction_base
python Code/Reduction_base.py- Tsp
python Code/Tsp.py-
Ouvrez le script Code/<nom_du_fichier>.py dans votre éditeur.
-
À la fin du fichier, ajoutez votre bloc de test (adapté au module).
-
Sauvegardez, puis relancez la commande de test :
conda activate projet_algo
python Code/<nom_du_fichier>.py Vous trouverez ci-dessous une description détaillée des tests que vous pouvez réaliser pour chaque module du projet. Cela vous permettra de valider leur bon fonctionnement et de mieux comprendre leur comportement.
Pour valider les deux fonctions principales de Hermite.py :
-
hermite_fn(A)
- Objectif : calculer la forme normale d’Hermite
Het la matrice unimodulaireUtelles queA·U = H. - Comment tester :
- Choisir une petite matrice
A(par exemple 2×3) dont on connaît la forme normale. - Vérifier que
A @ Uproduit bien une matrice triangulaire supérieure et qu’elle coïncide avecH.
- Choisir une petite matrice
- Objectif : calculer la forme normale d’Hermite
-
solver(A, b)
- Objectif : résoudre le système entier
Ax = bou signaler qu’il n’a pas de solution. - Comment tester :
- Cas soluble : prendre un petit système
Aetbpour lequel la solution entière est évidente, puis vérifier quesolverla renvoie. - Cas non soluble : choisir un
bqui n’appartient pas à l’image deAet s’assurer que la fonction renvoieNone(ou affiche le bon message d’erreur).
- Cas soluble : prendre un petit système
- Objectif : résoudre le système entier
Pour valider les deux fonctions principales de Nash.py :
-
est_equilibre_nash(A, B, x, y)
- Objectif : vérifier qu’un couple de stratégies mixtes
(x, y)est un équilibre de Nash pour les matrices de gainsA(joueur Ligne) etB(joueur Colonne). - Comment tester :
- Choisir un petit jeu dont on connaît l’équilibre (p. ex. dilemme du prisonnier ou pierre-feuille-ciseaux).
- Fournir à la fonction la distribution
(x, y)supposée équilibrée et s’assurer qu’elle renvoie True. - Tester une paire de stratégies non optimales et vérifier qu’elle renvoie False.
- Objectif : vérifier qu’un couple de stratégies mixtes
-
probleme(A, B)
- Objectif : formuler et résoudre un MILP qui calcule un équilibre mixte du même jeu.
- Comment tester :
- Exécuter la fonction sur plusieurs jeux classiques (somme nulle, dilemme du prisonnier, pierre-feuille-ciseaux).
- Vérifier que le statut renvoyé est Optimal.
- Contrôler que les vecteurs
xetyproduits sont des distributions de probabilité (toutes les composantes ≥ 0 et somme à 1). - Pour un jeu à somme nulle, s’assurer que
M_xetM_ysont opposées.
Pour valider les principales fonctionnalités de Tsp.py :
-
generate_problem(num_clients)
- Objectif : créer une instance aléatoire du TSP/VRP avec un dépôt au centre et
num_clientsclients. - Comment tester : pour un petit
num_clients(p. ex. 3), vérifier que le dictionnaire retourné contient exactementnum_clients + 1positions (dont le dépôt) et que chaque client a bien un ID unique.
- Objectif : créer une instance aléatoire du TSP/VRP avec un dépôt au centre et
-
compute_distance_matrix(clients, num_clients)
- Objectif : construire la liste des positions et un dictionnaire des distances de Manhattan pour chaque paire.
- Comment tester : choisir un jeu de points fixe (manuellement) et comparer les distances produites à celles calculées “à la main”.
-
is_valid_solution(solution, num_clients)
- Objectif : vérifier qu’une tournée commence et finit au dépôt (0) et visite chaque client exactement une fois.
- Comment tester : fournir une tournée correcte et plusieurs incorrectes (double visite, omission, absence de retour au dépôt) et vérifier
True/False.
-
tsp_dp(positions, distance_matrix)
- Objectif : résoudre exactement le TSP par programmation dynamique.
- Comment tester : appliquer
tsp_dpsur une petite instance (3 ou 4 nœuds) dont on connaît le parcours optimal et son coût, et vérifier la correspondance.
-
solve_tsp_linear(positions, distance_matrix)
- Objectif : formuler et résoudre le TSP en MILP (Miller-Tucker-Zemlin).
- Comment tester : lancer sur la même petite instance que pour
tsp_dp, vérifier que la distance minimale est identique et que le circuit renvoyé est valide.
-
local_search_tsp(n, distance_matrix)
- Objectif : améliorer une tournée via l’heuristique 2-opt.
- Comment tester : générer une tournée aléatoire puis appeler
local_search_tsp; vérifier que la solution retournée est valide (is_valid_solution) et que son coût est inférieur ou égal à celui de la tournée initiale.
-
christofides_tsp(positions, distance_matrix)
- Objectif : exécuter l’approximation de Christofides (1.5-approximation).
- Comment tester : pour une instance connue, comparer le coût obtenu à celui de
tsp_dpet s’assurer qu’il ne dépasse pas 1.5 × coût optimal, tout en renvoyant une tournée valide.
Pour valider les fonctionnalités principales du module :
-
gener_base(n, d)
- Objectif : produire une matrice carrée aléatoire de rang plein, coefficients dans [–d, d].
- Comment tester : pour des petits paramètres (n = 3, d = 5), vérifiez que la matrice retournée est de dimension n×n et que son rang vaut bien n.
-
gener_unimodulaire(n, a, b)
- Objectif : générer une matrice unimodulaire (|det| = 1) à partir de
aopérations aléatoires et coefficients bornés parb. - Comment tester : pour n = 4, a = 5, b = 3, contrôlez que U est inversible et que son déterminant est ±1.
- Objectif : générer une matrice unimodulaire (|det| = 1) à partir de
-
LLL_reduce(B, delta=0.75)
- Objectif : appliquer l’algorithme LLL pour réduire la base B en place.
- Comment tester : prenez une base B connue (p. ex. un réseau avec un vecteur court évident), exécutez
LLL_reduce(B.copy())et vérifiez que la norme du vecteur le plus court dans la base réduite est bien inférieure ou égale à celle de la base d’origine.
-
experiment(n, d, a, b)
- Objectif : réaliser plusieurs variantes de la base (originale, réduite, modulée par U, puis réduite) et mesurer la distance au vecteur v, retournant un DataFrame des résultats.
- Comment tester : pour n = 3, d = 5, a = 5, b = 2, appelez
experimentet vérifiez que le DataFrame comporte exactement quatre lignes (« B original », « B LLL réduite », « B·U », « B·U LLL réduite ») avec des distances numériques non négatives.
Conseil : Pour tester Nash.py et Hermite.py, commencez avec des matrices 2×2 simples, puis testez des cas un peu plus grands pour couvrir toutes les branches du code.
Projet universitaire collaboratif. Les implémentations sont fournies à titre pédagogique ; leur exactitude sur tous les cas a été vérifiée dans le cadre de cette mise en ligne.