Documentation Complète du Projet
Modélisation Mathématique et Algorithmique d'un Système de Navigation
Comment modéliser mathématiquement un système de navigation GPS et implémenter des algorithmes efficaces pour calculer le plus court chemin en milieu urbain ?
Représenter une ville comme un graphe pondéré
Implémenter Dijkstra, A* et Bellman-Ford
Modèle de temps urbain réaliste
Application interactive
Une ville est modélisée par un graphe pondéré non orienté :
Où :
Trouver un chemin \(P = (v_0, v_1, ..., v_k)\) tel que :
Sous contraintes :
$$v_0 = s \quad \text{(départ)}$$ $$v_k = t \quad \text{(arrivée)}$$ $$(v_i, v_{i+1}) \in E \quad \forall i$$Distance euclidienne entre deux sommets :
Si les coordonnées sont en degrés (latitude/longitude), 1° ≈ 111 km.
Voici un exemple de graphe représentant un réseau urbain avec 100 intersections :
Figure 1 : Graphe d'une ville avec 100 intersections (sommets) et leurs routes (arêtes)
Exploration exhaustive du graphe par distances croissantes.
Avec \(n = |V|\) sommets et \(m = |E|\) arêtes
def dijkstra(G, s, t):
distances[v] ← ∞ pour tout v ∈ V
distances[s] ← 0
Q ← file de priorité avec tous les sommets
tant que Q n'est pas vide:
u ← extraire_min(Q)
si u = t: retourner chemin
pour chaque voisin v de u:
nouvelle_distance ← distances[u] + w(u, v)
si nouvelle_distance < distances[v]:
distances[v] ← nouvelle_distance
parent[v] ← u
Utilise une heuristique pour guider la recherche vers la cible.
Où :
$$g(n) = \text{coût réel depuis le départ}$$ $$h(n) = \text{heuristique (estimation du coût restant)}$$Cette heuristique est admissible car :
$$h(n) \leq \text{coût réel restant}$$
(La distance en ligne droite est toujours ≤ distance par routes)
Algorithme qui peut gérer les poids négatifs et détecte les cycles négatifs.
Note importante : Dans ce projet, tous les poids sont positifs (distances euclidiennes). La capacité de Bellman-Ford à gérer les poids négatifs n'est donc pas utilisée ici, mais reste disponible pour d'autres applications.
Relaxe toutes les arêtes, n-1 fois :
Après n-1 itérations, si on peut encore relaxer une arête, il y a un cycle négatif.
Où n = sommets, m = arêtes
Avantages :
Inconvénient :
Voici une comparaison sur une grille 10×10 :
Dijkstra - Exploration exhaustive
A* - Exploration guidée
Note : Sur une grille régulière avec poids égaux, A* et Dijkstra visitent souvent le même nombre de sommets car l'heuristique euclidienne n'est pas très informative. Sur des graphes irréguliers (villes réelles), A* est beaucoup plus efficace.
| Critère | Dijkstra | A* | Bellman-Ford |
|---|---|---|---|
| Complexité | \(O((n+m) \log n)\) | \(O((n+m) \log n)\) | \(O(n \cdot m)\) |
| Optimalité | Oui | Oui (si h admissible) | Oui |
| Sommets visités | Plus nombreux | 30-75% de moins (selon graphe) | Tous les sommets (relaxation n-1 fois) |
| Vitesse pratique | Standard | 1-2× plus rapide (selon graphe) | 100-200× plus lent |
| Heuristique | Non | Oui | Non |
| Poids négatifs | Non | Non | Oui |
Figure 3 : Comparaison Dijkstra vs A* - Sommets visités et temps d'exécution
Figure 4 : Chemin optimal calculé par A* sur le réseau urbain
Le modèle naïf est incorrect en milieu urbain :
❌ FAUX en milieu urbain
Car il ignore :
Où :
| Moyen | \(v\) (km/h) | \(t_0\) (s) | Justification |
|---|---|---|---|
| 🚗 Voiture | 50 | 15 | Démarrage + 1 feu + arrêt |
| 🚴 Vélo | 15 | 8 | Plus agile (moins de feux) |
| 🚶 À pied | 5 | 5 | Démarrage très rapide |
✅ Le temps croît linéairement avec la distance
✅ Même pour \(d \to 0\), il y a un temps minimum réaliste
Données :
Calcul :
Réaliste !
ProjetS5_maths/
├── 🧠 src/ # Cœur mathématique
│ ├── graph.py # Classes Vertex, Edge, Graph
│ ├── algorithms.py # Dijkstra, A*, Bellman-Ford
│ ├── generators.py # Génération de graphes
│ ├── utils.py # Utilitaires
│ └── visualizer.py # Visualisations
│
├── 🌐 webapp_demo.py # Interface web Streamlit
├── 🧪 experiments/ # Expériences scientifiques
├── ✅ tests/ # Tests unitaires (25 tests)
└── 📚 docs/ # Documentation
Demande un trajet
webapp_demo.py
src/algorithms.py
Chemin optimal
| Principe | Implémentation |
|---|---|
| Séparation des responsabilités | Logique (src/) ≠ Interface (webapp/) |
| Réutilisabilité | Même code pour webapp, expériences, tests |
| Testabilité | Code pur sans dépendances UI |
| Maintenabilité | 1 bug corrigé = tout est corrigé |
25/25 tests passés
Dijkstra = A*
A* 30-50% plus rapide
O(n log n) vérifié
Figure 5 : Validation empirique de la complexité O((n+m) log n)
Figure 6 : Carte thermique montrant l'exploration des sommets par A*
Lorsque vous lancez une démonstration ou une expérience, voici ce qui s'affiche dans la console et comment l'interpréter :
======================================================================
EXPÉRIENCE 2 : GRAPHE URBAIN ALÉATOIRE
======================================================================
Graphe : Non-orienté
----------------------------------------
Nombre de sommets (n) : 200
Nombre d'arêtes (m) : 591
Degré moyen : 5.91
Densité : 0.0297
Connexe : Oui
Recherche du plus court chemin : 2 → 177
############################################################
COMPARAISON DES ALGORITHMES
############################################################
Graphe : 200 sommets, 591 arêtes
Algorithme Coût Sommets Temps (ms) Speedup
------------------------------------------------------------
dijkstra 1574.18 149 0.21 1.00x (ref)
astar 1574.18 37 0.11 1.91x
bellman_ford 1574.18 200 25.69 0.01x
------------------------------------------------------------
📊 Analyse :
• A* vs Dijkstra :
- Réduction de sommets visités : 75.2% (37 vs 149 sommets)
- Gain de temps : 47.6% (A* est 1.91× plus rapide)
• Bellman-Ford vs Dijkstra :
- Ratio de temps : 122.3× plus lent (visite tous les 200 sommets)
• Tous les algorithmes trouvent le même chemin optimal ✓
############################################################
Nombre de sommets (n) : 200
Nombre d'arêtes (m) : 591
Degré moyen : 5.91
Signification :
Algorithme Coût Sommets Temps (ms) Speedup
------------------------------------------------------------
dijkstra 1574.18 149 0.21 1.00x (ref)
astar 1574.18 37 0.11 1.91x
bellman_ford 1574.18 200 25.69 0.01x
Colonnes expliquées :
📊 Analyse :
• A* vs Dijkstra :
- Réduction de sommets visités : 75.2% (37 vs 149 sommets)
- Gain de temps : 47.6% (A* est 1.91× plus rapide)
• Bellman-Ford vs Dijkstra :
- Ratio de temps : 122.3× plus lent (visite tous les 200 sommets)
• Tous les algorithmes trouvent le même chemin optimal ✓
Interprétation :
| Aspect | Réalisation | Niveau |
|---|---|---|
| Mathématiques | Modélisation rigoureuse + preuves | |
| Algorithmique | 2 algorithmes implémentés + comparés | |
| Architecture | Code modulaire et réutilisable | |
| Tests | 25 tests automatisés | |
| Documentation | 5 fichiers MD + doc HTML | |
| Interface | Webapp interactive |
# Terminal
cd ProjetS5_maths
source venv/bin/activate # Windows: venv\Scripts\activate
streamlit run webapp_demo.py
L'application s'ouvre dans le navigateur sur http://localhost:8501
Points clés de l'application :
Panneau de configuration :
Sélection interactive :
Graphe pondéré rigoureux
Dijkstra + A* + Bellman-Ford opérationnels
Formule mathématique justifiée
Interface web interactive
| Domaine | Compétences |
|---|---|
| Mathématiques | Modélisation, théorie des graphes, optimisation |
| Algorithmique | Dijkstra, A*, Bellman-Ford, analyse de complexité |
| Développement | Python, POO, architecture modulaire |
| Tests | Pytest, tests unitaires, validation |
| Web | Streamlit, Folium, interfaces interactives |
| Documentation | Markdown, LaTeX, HTML |
cd ProjetS5_maths
source venv/bin/activate
streamlit run webapp_demo.py
cd ProjetS5_maths
source venv/bin/activate
pytest tests/ -v
cd ProjetS5_maths
source venv/bin/activate
python3 experiments/comparaison_algos.py
| Fichier | Description |
|---|---|
README.md |
Documentation principale du projet |
webapp_demo.py |
Application web interactive |
src/algorithms.py |
Implémentation Dijkstra, A* & Bellman-Ford |
tests/test_algorithms.py |
Tests unitaires des algorithmes |
docs/modele_temps_reel.md |
Documentation du modèle mathématique |
Lorsque vous lancez python3 experiments/comparaison_algos.py, voici ce qui se passe :
######################################################################
SUITE COMPLÈTE D'EXPÉRIENCES
######################################################################
======================================================================
EXPÉRIENCE 1 : GRAPHE EN GRILLE (Type Manhattan)
======================================================================
Graphe : 400 sommets, 760 arêtes
Recherche du plus court chemin : 0 → 399
############################################################
COMPARAISON DES ALGORITHMES
############################################################
Algorithme Coût Sommets Temps (ms) Speedup
------------------------------------------------------------
dijkstra 1900.00 400 0.38 1.00x (ref)
astar 1900.00 400 0.49 0.77x
bellman_ford 1900.00 400 64.01 0.01x
📊 Analyse :
• A* vs Dijkstra :
- Réduction de sommets visités : 0.0% (même nombre sur grille)
- Gain de temps : -29.4% (A* légèrement plus lent sur grille)
• Bellman-Ford vs Dijkstra : 168.1× plus lent
• Tous les algorithmes trouvent le même chemin optimal ✓
======================================================================
EXPÉRIENCE 2 : GRAPHE URBAIN ALÉATOIRE
======================================================================
...
######################################################################
RÉSUMÉ GLOBAL DES EXPÉRIENCES
######################################################################
Graphe Dijkstra (ms) A* (ms) Bellman-Ford (ms) Speedup A*
------------------------------------------------------------------------------------------------
Grille 20×20 0.38 0.49 64.01 0.77x
Urbain Aléatoire (200 sommets) 0.21 0.11 25.69 1.91x
Ville Clustérisée (150 sommets) 0.14 0.14 13.14 1.03x
------------------------------------------------------------------------------------------------
Sur une grille régulière avec poids égaux, l'heuristique euclidienne n'apporte pas d'avantage car :
Conclusion : A* est beaucoup plus efficace sur graphes irréguliers (villes réelles) que sur grilles parfaites avec poids égaux. Sur grille : A* ≈ Dijkstra. Sur graphe aléatoire : A* visite 75% de sommets en moins !
Grille Régulière 10×10
Graphe Urbain Aléatoire
Graphe Clustérisé (quartiers)
Démonstration sur Grille
Comparaison de Chemins
Plus de 15 visualisations générées pour valider les algorithmes !