Application web interactive permettant de modéliser un réseau de collecte sous forme de graphe, de calculer les trajets optimaux entre points (Dijkstra) et d'assigner des équipes par zones via coloration de graphe.
- Ă propos
- Fonctionnalités
- Installation
- Utilisation
- API REST
- Algorithmes
- Technologies
- Structure du projet
- Auteur
- Licence
CollectGraph est un projet académique de théorie des graphes appliquée à un problÚme concret : l'optimisation des tournées de collecte de déchets en milieu urbain. L'application combine la modélisation visuelle d'un réseau de routes (graphe pondéré) avec deux algorithmes classiques :
- đŁïž Dijkstra pour trouver le chemin le plus court entre deux points
- đš Coloration gloutonne pour rĂ©partir les zones de collecte entre Ă©quipes ou jours de la semaine
L'interface est entiÚrement interactive : on dessine le graphe à la souris sur un Canvas HTML5, on visualise les résultats en temps réel, et les données sont persistées dans une base PostgreSQL.
- đșïž Visualisation interactive du graphe sur Canvas HTML5
- âïž Ădition dynamique : ajout/suppression de nĆuds et arĂȘtes Ă la souris
- âïž ArĂȘtes pondĂ©rĂ©es (distance/temps)
- đŁïž Algorithme de Dijkstra : chemin optimal entre deux nĆuds
- đš Coloration de graphe : assignation automatique d'Ă©quipes/jours
- đŸ Persistance PostgreSQL : les modifications sont sauvegardĂ©es
- đ API REST complĂšte : intĂ©gration possible avec d'autres systĂšmes
- Python 3.8 ou supérieur
- PostgreSQL 12 ou supérieur
- pip
git clone https://github.com/SALLAH-JP/TG.git
cd TGpython -m venv venv
# Windows
venv\Scripts\activate
# Linux / macOS
source venv/bin/activatepip install flask flask-cors psycopg2-binaryCréer la base et importer le schéma :
# Créer la base
createdb TG
# Importer le schéma (à la racine du repo)
psql -d TG -f TG.sqlSchéma simplifié :
CREATE TABLE nodes (
id SERIAL PRIMARY KEY,
name VARCHAR(50) UNIQUE NOT NULL,
x FLOAT NOT NULL,
y FLOAT NOT NULL
);
CREATE TABLE edges (
id SERIAL PRIMARY KEY,
from_node VARCHAR(50) NOT NULL,
to_node VARCHAR(50) NOT NULL,
weight INT NOT NULL,
undirected BOOLEAN DEFAULT FALSE,
FOREIGN KEY (from_node) REFERENCES nodes(name) ON DELETE CASCADE,
FOREIGN KEY (to_node) REFERENCES nodes(name) ON DELETE CASCADE
);Modifier les identifiants PostgreSQL dans server.py :
def get_connection():
return psycopg2.connect(
dbname="TG",
user="postgres",
password="VOTRE_MOT_DE_PASSE",
host="localhost",
port=5432
)python server.pyL'application est accessible sur http://localhost:5000
- Canvas central : visualisation du graphe (nĆuds + arĂȘtes pondĂ©rĂ©es)
- Barre d'outils : sélection de l'action en cours, choix source/destination
- Panneau latéral : légende des équipes et résultats des calculs
- SĂ©lectionner « Ajouter un nĆud » dans le menu
- Cliquer OK
- Cliquer sur le canvas pour le placer
- Entrer un nom (auto-incrémenté si vide) puis Entrée
- SĂ©lectionner « Supprimer un nĆud » â OK
- Cliquer sur le nĆud Ă supprimer
- Les arĂȘtes liĂ©es sont supprimĂ©es en cascade
- SĂ©lectionner « Ajouter une arĂȘte » â OK
- Cliquer sur le nĆud source
- Cliquer sur le nĆud destination
- Entrer le poids (distance/temps) â EntrĂ©e
- SĂ©lectionner « Supprimer une arĂȘte » â OK
- Cliquer sur l'arĂȘte
- Choisir la source et la destination dans les menus déroulants
- Cliquer Rechercher (Dijkstra)
- Le chemin est surligné sur le canvas et la distance affichée
- Cliquer Colorier (jours/équipes)
- Les nĆuds sont automatiquement colorĂ©s selon leur assignation
- La lĂ©gende affiche la correspondance couleur â Ă©quipe
Retourne le graphe complet.
{
"nodes": [
{"name": "N1", "x": 100, "y": 150},
{"name": "N2", "x": 300, "y": 250}
],
"edges": [
{"from": "N1", "to": "N2", "weight": 50, "undirected": false}
]
}Ajoute un nĆud.
{ "name": "N3", "x": 400, "y": 300 }Supprime un nĆud (et ses arĂȘtes en cascade).
{ "name": "N3" }Ajoute une arĂȘte pondĂ©rĂ©e.
{ "from": "N1", "to": "N2", "weight": 50 }Supprime une arĂȘte.
{ "from": "N1", "to": "N2" }Calcule le plus court chemin.
{
"path": ["N1", "N3", "N2"],
"distance": 150
}Coloration du graphe (assignation d'équipes).
{
"N1": 1,
"N2": 2,
"N3": 1
}Calcule le plus court chemin entre deux nĆuds dans un graphe pondĂ©rĂ© non-nĂ©gatif.
- Complexité : O((V + E) log V) avec file de priorité
- Implémentation :
logic.py - Usage : optimisation des trajets de collecte entre deux points
Assigne des couleurs (= Ă©quipes ou jours) aux nĆuds de façon Ă ce que deux nĆuds adjacents n'aient jamais la mĂȘme couleur.
- StratĂ©gie : tri des nĆuds par degrĂ© dĂ©croissant puis affectation gloutonne
- Objectif : minimiser le nombre d'équipes/jours nécessaires pour couvrir toute la ville
- Application : planification hebdomadaire des tournées
- Flask â micro-framework web Python
- Flask-CORS â gestion des requĂȘtes cross-origin
- psycopg2 â driver PostgreSQL
- HTML5 / CSS3 â structure et styles
- Canvas API â rendu 2D interactif du graphe
- JavaScript vanilla â logique frontend, pas de framework
- Fetch API â communication avec le backend
- PostgreSQL â stockage des nĆuds, arĂȘtes et mĂ©tadonnĂ©es
.
âââ server.py # Backend Flask + routes API
âââ logic.py # Algorithmes (Dijkstra, coloration)
âââ TG.sql # SchĂ©ma SQL de la base
âââ public/ # Frontend
â âââ index.html # Page principale
â âââ app.js # Logique Canvas + appels API
â âââ style.css # Styles
âââ projet final tg.docx # Rapport du projet
âââ LICENSE
Scénario : Optimiser la collecte des déchets dans une ville de 30 quartiers.
- ModĂ©lisation â CrĂ©er un nĆud par quartier, des arĂȘtes pour chaque route (poids = distance ou temps de parcours)
- RĂ©partition â Lancer la coloration : la ville est divisĂ©e en zones distinctes, chacune attribuĂ©e Ă une Ă©quipe diffĂ©rente
- Optimisation â Pour chaque zone, utiliser Dijkstra pour planifier le trajet le plus rapide entre le dĂ©pĂŽt et chaque point
- Persistance â Le rĂ©seau est sauvegardĂ© en base, modifiable en temps rĂ©el par les opĂ©rateurs
psycopg2.OperationalError: could not connect to server
â PostgreSQL n'est pas dĂ©marrĂ©, ou les identifiants dans server.py sont incorrects.
Canvas vide au démarrage
â La base est vide. Ajouter des nĆuds manuellement via l'interface, ou importer un jeu de donnĂ©es initial dans TG.sql.
ArĂȘte impossible Ă ajouter â VĂ©rifier que les deux nĆuds existent et que l'arĂȘte n'existe pas dĂ©jĂ entre eux.
- RequĂȘtes paramĂ©trĂ©es : protection contre les injections SQL
- CORS configuré pour limiter les origines autorisées
- Gestion des erreurs cÎté serveur
Ce projet a été réalisé dans le cadre du cours de Théorie des Graphes de la Licence Informatique Appliquée à l'Université des Mascareignes. Le rapport complet est disponible dans le dépÎt (projet final tg.docx).
SALLAH Assiongbon ThĂ©odore Jean-Paul Ătudiant en 3Ăšme annĂ©e â Licence Informatique AppliquĂ©e đ UniversitĂ© des Mascareignes (Maurice)
Ce projet est distribuĂ© sous licence MIT â voir le fichier LICENSE.
Si ce projet vous a plu, n'hĂ©sitez pas Ă laisser une â !