J'ai réalisé ce projet afin d'améliorer ma compréhension des algorithmes de plus court chemin dans des graphes ainsi que mes capacités en programmation orientée objet.
Le graphe est représenté ici par une grille de cases contenant des obstacles répartis de façon aléatoire où l'utilisateur choisit la case de départ ainsi que la case d'arrivée.
L'utilisateur peut utiliser l'algorithme A étoile (A*) ou le parcours en largeur (Breadth-First Search).
L'avantage de l'algorithme A étoile est sa rapidité. Cependant, le choix de son heuristique est crucial.
Par exemple, dans certains cas, il peut perdre du temps dans un labyrinthe, ou contre un obstacle qui pourrait simplement être contourné.
L'avantage de l'algorithme du Breadth-First Search (BFS) est justement qu'il ne risque pas de perdre du temps dans une impasse.
Cependant, l'algorithme consomme plus de mémoire et prendra plus de temps si l'objectif à atteindre est éloigné.
Le choix s'est porté sur le BFS plûtot que Dijkstra, car la grille conçue est un graphe non pondéré. Toutes les cases sont à égale distance les unes des autres et par conséquent, l'information nous intéressant est le voisinage de chaque case.
Dans le programme de base, les voisins de chaque case sont : la case située à gauche (x-1, y) ; la case située à droite (x+1, y) ; la case située en haut (x, y-1) et la case située en bas (x, y+1).
Pour accélérer le temps de calcul, l'utilisateur a également le choix d'inclure les voisins situés en diagonale de chaque case. (x-1, y-1) ; (x+1, y-1) ; (x-1, y+1) ; (x+1, y+1)
Ce projet m'a permis d'améliorer ma connaissance des algorithmes de parcours de graphes ainsi que mes compétences en programmation orientée objet avec le langage Python, le tout en réalisant un projet tout aussi amusant qu'intéressant.
Les paramètres actuels permettent de choisir la taille de la fenêtre, la taille de la grille, l'emplacement de la case départ et d'arrivée, le nombre d'obstacles à répartir aléatoirement ainsi que l'algorithme A* ou le BFS.
Les futures améliorations sont:
Le développement d'une interface graphique (Graphical User Interface) afin de sélectionner les paramètres au lancement du programme.
L'ajout de la valeur des cases et l'implémentation de l'algorithme de Dijkstra.
La possibilité de sélectionner plusieurs cases de départ et d'arrivée.
Programmation Python en utilisant les librairies : Numpy, Pygame, Collections (pour le pathfinding) et Time.
Pygame a été utilisé pour l'affichage du projet.
Programmation Orientée Objet en créant les classes : Main, Fenêtre, Grille et Case.