summaryrefslogtreecommitdiff
path: root/ero1/src/demo/demo_exec.py
diff options
context:
space:
mode:
authorMartial Simon <msimon_fr@hotmail.com>2025-09-15 01:07:58 +0200
committerMartial Simon <msimon_fr@hotmail.com>2025-09-15 01:07:58 +0200
commit967be9e750221ab2ab783f95df79bb26d290a45e (patch)
tree6802900a5e975f9f68b169f0f503f040056d6952 /ero1/src/demo/demo_exec.py
add: added projectsHEADmain
Diffstat (limited to 'ero1/src/demo/demo_exec.py')
-rw-r--r--ero1/src/demo/demo_exec.py229
1 files changed, 229 insertions, 0 deletions
diff --git a/ero1/src/demo/demo_exec.py b/ero1/src/demo/demo_exec.py
new file mode 100644
index 0000000..1242ff5
--- /dev/null
+++ b/ero1/src/demo/demo_exec.py
@@ -0,0 +1,229 @@
+# DEMO IMPORT
+from src.demo.print_demo import print_demo
+from src.demo.ask_variable import ask_variable
+from src.helper.color_suburbs import display_suburbs_with_colors
+from src.demo.demo_cost import export_deneigeuse, export_drone, get_edge_length
+from src.demo.demo_stats import stats_deneigeuses, stats_drone
+from src.demo.demo_final_report import * # nsm, flemme de trier
+
+# IMPORT FOR GENERATION
+from src.generation.graph_generation import generate_graph
+from src.generation.suburb_snowplow_generation import generate_quartiers_from_path
+
+# IMPORT FOR DRONE:
+from src.drone.postier_chinoisV2 import final_path, postier_chinois_process_v2, connect_circuits
+from src.drone.postier_chinoisV1 import postier_chinois_process_v1
+from src.drone.postier_chinoisV3 import postier_chinois_process_v3
+
+# IMPORT FOR DENEIGEUSE:
+from src.deneigeuses.hierholzer_v1 import process_hierholzer_v1
+from src.deneigeuses.hierholzer_v2 import process_hierholzer_v2
+from src.deneigeuses.directed_cpp import oriented_cpt
+from src.deneigeuses.drone_path import drone_path
+from src.helper.partitions import partition
+from src.deneigeuses.hangar_to_deneigeuse import path_hangar_to_deneigeuse, path_deneigeuse_to_hangar
+
+# IMPORT FOR YAML & KML
+from src.helper.export_to_kml import export_to_kml
+from src.helper.export_import_yaml import load_paths_from_yaml
+import os
+import time
+
+
+def demo_exec(place, drone, deneigeuse, debug):
+ """
+ Fonction principale pour le démarrage de la démo.
+ Parameters:
+ place : Liste des arrondissements à parcourir.
+ drone : Type de drone à utiliser.
+ deneigeuse : Type de déneigeuse à utiliser.
+ debug : Mode debug activé ou non.
+ """
+
+ # ---------------------- INITIALISATION ---------------------------
+
+ os.system('cls' if os.name == 'nt' else 'clear')
+ print_demo("Démarrage du programme sur :", time=True)
+ for lieu in place:
+ print_demo(lieu, indent=1)
+ print("")
+
+ # ---------------------- GENERATION DU GRAPHE ---------------------------
+
+ print_demo("Génération du graph de Montréal en cours...", time=True)
+ graph = generate_graph("Montréal, Québec, Canada", debug_mode=debug)
+ print_demo("Graph généré avec succès.", indent=1)
+
+ # ---------------------- PARCOURS - DRONE ---------------------------
+
+ start_time_drone = time.time()
+ if drone == "postier_chinoisV1":
+ print_demo("Parcours du drone sur Montréal avec la version 1.", time=True)
+ parcours_drone, finalPath = postier_chinois_process_v1(graph, debug)
+
+ elif drone == "postier_chinoisV2":
+ print_demo("Parcours du drone sur Montréal avec la version 2.", time=True)
+ parcours_drone, finalPath = postier_chinois_process_v2(graph, debug)
+
+ elif drone == "postier_chinoisV3":
+ print_demo("Parcours du drone sur Montréal avec la version 3.", time=True)
+ parcours_drone, finalPath = postier_chinois_process_v3(graph, debug)
+ else:
+ print_demo(f"Récupération du parcours de Montréal sur le fichier : {drone}", time=True)
+ parcours_drone = load_paths_from_yaml(graph, drone)
+ finalPath = final_path(graph, parcours_drone)
+
+ end_time_drone = time.time()
+ print_demo("Parcours du drone effectué avec succès.", indent=1)
+
+ # ---------------------- AFFICHAGE DU GRAPHE ---------------------------
+
+ Q_display = "Voulez-vous afficher le graph du parcours du drone ?"
+ A_display = [("Oui", True), ("Non", False)]
+ display = ask_variable(Q_display, A_display)
+ if display:
+ connections = connect_circuits(graph, parcours_drone)
+ display_suburbs_with_colors(graph, parcours_drone, connections)
+
+ # ---------------------- RECUPERATION DU PARCOURS DU DRONE ---------------------------
+
+ parcours_drone_arrondissements = []
+ for elt in place:
+ if elt in parcours_drone:
+ parcours_drone_arrondissements.extend(parcours_drone[elt])
+ else:
+ raise ValueError(f"{elt} introuvable dans le parcours du drone.")
+
+ # ---------------------- CALCUL DES COUTS - DRONE ---------------------------
+
+ cost_drone = export_drone(
+ graph, end_time_drone-start_time_drone, finalPath)
+ stat_drone = stats_drone(cost_drone)
+
+ # ---------------------- CALCUL DU NOMBRE OPTIMAL DE DÉNEIGEUSES ---------------------------
+
+ if deneigeuse == "naive":
+ print_demo("/!\\ L'algorithme de déneigeuse choisi ne dispose pas de la possibilité d'avoir plusieurs déneigeuses.", time=True)
+ number_of_deneigeuses = [1]
+ else:
+ optimal_number_deneigeuses = max(1, round((sum(get_edge_length(
+ graph, u, v) for u, v in parcours_drone_arrondissements)) / 200000))
+
+ Q_deneigeuse_number = "Avec quel nombre de déneigeuses voulez-vous comparer les coûts ?"
+ A_deneigeuse_number = [
+ ("1 déneigeuse", 1),
+ (f"{optimal_number_deneigeuses} déneigeuses - Version Optimale", optimal_number_deneigeuses),
+ (f"{optimal_number_deneigeuses * 2} déneigeuses", optimal_number_deneigeuses * 2), (f"{optimal_number_deneigeuses * 3} déneigeuses", optimal_number_deneigeuses * 3),
+ ("Faire toutes les partitions et comparer les coûts", 0)]
+ number_reply = ask_variable(Q_deneigeuse_number, A_deneigeuse_number)
+ if number_reply == 0:
+ number_of_deneigeuses = [optimal_number_deneigeuses, 1,
+ optimal_number_deneigeuses * 2, optimal_number_deneigeuses * 3]
+ else:
+ number_of_deneigeuses = [number_reply]
+ print("")
+
+ # ---------------------- GENERATION DU GRAPHE DE PARTITIONS ---------------------------
+
+ G_partition = generate_quartiers_from_path(
+ parcours_drone, graph, suburb_list=place, debug_mode=debug)
+
+ # ---------------------- PARCOURS - DÉNEIGEUSES ---------------------------
+
+ if deneigeuse == "hierholzer_v1" or deneigeuse == "hierholzer_v2":
+ print_demo("Parcours de la déneigeuse à partir de l'algorithme de Hierholzer", time=True)
+ elif deneigeuse == "naive":
+ print_demo("Parcours de la déneigeuse à partir de l'implémentation naïve", time=True)
+ else:
+ print_demo("Parcours de la déneigeuse à partir de l'algorithme du Postier Chinois Orienté", time=True)
+
+ cost_deneigeuses = {}
+ parcours_deneigeuses = {}
+ for i in number_of_deneigeuses:
+ cost_deneigeuses[i] = []
+ parcours_deneigeuses[i] = []
+
+ if i == 1 and (deneigeuse == "naive" or "hierholzer" in deneigeuse):
+ temp = []
+ for arrondissement in place:
+ temp.extend(parcours_drone[arrondissement])
+ partitions = [temp]
+ else:
+ partitions = partition(G_partition, i, debug_mode=debug)
+
+ for part in partitions:
+ start_time_deneigeuse = time.time()
+ drone_edges = [(u, v) for u, v in part.edges()] if i != 1 else part
+
+ if "hierholzer" in deneigeuse:
+ if deneigeuse == "hierholzer_v2":
+ parcours_deneigeuse = process_hierholzer_v2(
+ graph, drone_edges, debug)
+ else:
+ parcours_deneigeuse = process_hierholzer_v1(
+ graph, drone_edges, debug)
+
+ start_node = parcours_deneigeuse[0][0]
+ parcours_HangarDeneigeuse = path_hangar_to_deneigeuse(
+ graph, start_node)
+ end_node = parcours_deneigeuse[-1][1]
+ parcours_DeneigeuseHangar = path_deneigeuse_to_hangar(
+ graph, end_node)
+
+ parcours_deneigeuse = parcours_HangarDeneigeuse + parcours_deneigeuse + parcours_DeneigeuseHangar
+ if deneigeuse == "oriented_cpt":
+ parcours_deneigeuse = oriented_cpt(part, graph, debug)
+
+ start_node = parcours_deneigeuse[0][0]
+ parcours_HangarDeneigeuse = path_hangar_to_deneigeuse(graph, start_node)
+ end_node = parcours_deneigeuse[-1][1]
+ parcours_DeneigeuseHangar = path_deneigeuse_to_hangar(graph, end_node)
+
+ parcours_deneigeuse = parcours_HangarDeneigeuse + parcours_deneigeuse + parcours_DeneigeuseHangar
+ if deneigeuse == "naive":
+ parcours_deneigeuse = drone_path(drone_edges, graph)
+
+ start_node = parcours_deneigeuse[0][0]
+ parcours_HangarDeneigeuse = path_hangar_to_deneigeuse(graph, start_node)
+ end_node = parcours_deneigeuse[-1][1]
+ parcours_DeneigeuseHangar = path_deneigeuse_to_hangar(graph, end_node)
+
+ parcours_deneigeuse = parcours_HangarDeneigeuse + parcours_deneigeuse + parcours_DeneigeuseHangar
+
+ parcours_deneigeuses[i].append(parcours_deneigeuse)
+ end_time_deneigeuse = time.time()
+
+ cost_deneigeuse = export_deneigeuse(
+ graph, end_time_deneigeuse-start_time_deneigeuse, parcours_deneigeuse)
+ cost_deneigeuses[i].append(cost_deneigeuse)
+
+ stat_déneigeuses = {}
+ for i in number_of_deneigeuses:
+ stat_déneigeuses[i] = stats_deneigeuses(cost_deneigeuses[i])
+
+ print_demo("Parcours de la déneigeuse effectué avec succès.", indent=1)
+
+ # ---------------------- CALCUL DES STATS - DÉNEIGEUSES ---------------------------
+
+ os.system('cls' if os.name == 'nt' else 'clear')
+
+ print_recap_stat_drone(stat_drone, 0)
+
+ print("")
+
+ print_all_stat(stat_déneigeuses, 0)
+
+ print("")
+ print("--------------------")
+ print("")
+
+ # ---------------------- EXPORTATION DU PARCOURS EN KML ---------------------------
+
+ print_demo(
+ "Exportation des parcours des déneigeuses avec le parcours du drone au format KML.")
+ for i in parcours_deneigeuses:
+ print_demo(
+ f"{i} déneigeuses - Fichier KML : temp/parcours_{i}_deneigeuses.kml", indent=1)
+ export_to_kml(parcours_deneigeuses[i], finalPath, graph, debug, name=f"parcours_{i}_deneigeuses")
+
+ return True