summaryrefslogtreecommitdiff
path: root/ero1/demo.py
blob: d8042be41fd2113fbdbb019f3ab04a816900bcd0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
# IMPORT FOR DEMO
from src.demo.ask_variable import ask_variable
from src.demo.print_demo import print_demo
from src.demo.demo_exec import demo_exec

# LIB IMPORT
import os, time

def display_status(drone=None, déneigeuse=None, arrondissement=None, debug=None):
    '''
    Affiche le statut de la démonstration.
    Parameters:
        arrondissement : L'arrondissement choisi.
        drone : Le drone choisi.
        déneigeuse : La déneigeuse choisie.
        debug : Le mode debug choisi.
    '''
    os.system('cls' if os.name == 'nt' else 'clear')
    print("")
    if arrondissement:
        print_demo("Arrondissement choisi : " + arrondissement, 1)
    if drone:
        print_demo("Drone choisi : " + drone, 1)
    if déneigeuse:
        print_demo("Déneigeuse choisi : " + déneigeuse, 1)
    if debug is not None:
        print_demo("Debug : " + ("Oui" if debug else "Non"), 1)
    print("")


if __name__ == "__main__":
    '''
    Départ de la démonstration.
    '''
    try:
        os.system('cls' if os.name == 'nt' else 'clear')
        
        # ---------------------- CHOIX DU PARCOURS DE DRONE  ---------------------------

        Q_drone = "Quel parcours de drone voulez-vous faire ?"
        A_drone = [
            ("Postier Chinois V1 : Cette version est la version naïve avec NetworkX qui est plus longue mais distances plus optimisées. (Environ 30min)", "postier_chinoisV1"),
            ("Postier Chinois V2 : Cette version le plus rapide mais les distances sont moins optimisées. (Environ 3min)", "postier_chinoisV2"),
            ("Postier Chinois V3 : Cette version est une version intermédiaire entre la V1 et la V2 avec une distance optimisée et un calcul rapide. (Environ 4min)", "postier_chinoisV3"),
            ("Drones Sauvegardés : Charger un fichier sauvegarde des chemins générés par les algorithmes ci-dessus en YML.", "fichier")
        ]
        drone = ask_variable(Q_drone, A_drone)
        if drone == "fichier":
            Q_drone = "Quel fichier souhaitez-vous charger ?"
            A_drone = []
            num=0
            display_status(drone)
            for racine, repertoires, fichiers in os.walk("paths"):
                for fichier in fichiers:
                    if fichier.endswith(".yml"):
                        num+=1
                        (mode, ino, dev, nlink, uid, gid, size, atime, mtime, ctime) = os.stat(f"paths/{fichier}")
                        A_drone.append((f"{fichier} - {time.ctime(mtime)}",f"paths/{fichier}"))

            drone = ask_variable(Q_drone, A_drone)

        display_status(drone)

        # ---------------------- CHOIX DU PARCOURS DE DÉNEIGEUSE  ---------------------------

        Q_déneigeuse = "Quel parcours de déneigeuse voulez-vous faire ?"
        A_déneigeuse = [
            ("Hierholzer V1 : Cette première version est rapide à l'exécution mais reste bloquée dans les impasses/cycles.", "hierholzer_v1"),
            ("Hierholzer V2 : Cette deuxième version est rapide à l'exécution mais les distances ne sont pas optimisées.", "hierholzer_v2"),
            ("Postier Chinois orienté : Cet algorithme est un glouton qui cherche à équilibrer le graphe pour en extraire un circuit eulérien. (Uniquement sur 1 arrondissement)", "oriented_cpt"),
            ("Implémentation naïve : Une implémentation simple mais qui fournit un parcours très peu optimal, basée sur le parcours du drone. (Uniquement sur 1 arrondissement | Uniquement sur 1 déneigeuse)", "naive"),
        ]
        déneigeuse = ask_variable(Q_déneigeuse, A_déneigeuse)

        display_status(drone, déneigeuse)

        # ---------------------- CHOIX DE L'ARRONDISSEMENT  ---------------------------

        Q_arrondissement = "Sur quel arrondissement voulez-vous faire le parcours ?"
        A_arrondissement = [
            ("Outremont", "Outremont"), 
            ("Verdun", "Verdun"), 
            ("Anjou", "Anjou"), 
            ("Rivière-des-Prairies–Pointe-aux-Trembles","Rivière-des-Prairies–Pointe-aux-Trembles"),
            ("Le Plateau-Mont-Royal", "Le Plateau-Mont-Royal")
        ]
        if déneigeuse == "naive" or déneigeuse == "oriented_cpt":
            print_demo("/!\\ L'algorithme de déneigeuse choisi ne dispose pas de la possibilité d'effectuer les 5 arrondissements en une seule fois.")
        else:
            A_arrondissement.append(("Tous les secteurs ci-dessus", "all"))

        arrondissement = ask_variable(Q_arrondissement, A_arrondissement)
        arrondissements = ["Outremont", "Verdun", "Anjou", "Rivière-des-Prairies–Pointe-aux-Trembles", "Le Plateau-Mont-Royal"] if arrondissement == "all" else [arrondissement]

        display_status(drone, déneigeuse, arrondissement)


        # ---------------------- CHOIX DU MODE DEBUG  ---------------------------

        Q_debug = "Voulez-vous activer le mode debug ?"
        A_debug = [("Oui", True), ("Non", False)]
        debug = ask_variable(Q_debug, A_debug)

        display_status(drone, déneigeuse, arrondissement, debug)

        # ---------------------- EXECUTION DE LA DEMONSTRATION  ---------------------------

        demo_exec(arrondissements, drone, déneigeuse, debug)

    except KeyboardInterrupt: # Si l'utilisateur appuie sur Ctrl+C ou arrête le programme.
        print_demo("Arrêt du programme", 1)