diff options
| author | Martial Simon <msimon_fr@hotmail.com> | 2025-09-15 01:07:58 +0200 |
|---|---|---|
| committer | Martial Simon <msimon_fr@hotmail.com> | 2025-09-15 01:07:58 +0200 |
| commit | 967be9e750221ab2ab783f95df79bb26d290a45e (patch) | |
| tree | 6802900a5e975f9f68b169f0f503f040056d6952 /ero1/src/demo/demo_exec.py | |
Diffstat (limited to 'ero1/src/demo/demo_exec.py')
| -rw-r--r-- | ero1/src/demo/demo_exec.py | 229 |
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 |
