Génération de labyrtinthes et recherche de solution

Le but est de trouver le plus court chemin dans un labyrinthe en utilisant l'algorithme de Dijkstra

On va tout d'abord chercher à générer nos propres labyrinthes pour tester l'algorithme

Ce seront des labyrinthes carrés ou du moins rectangulaires dans un premier temps, pour des raisons pratiques et esthétiques.

On testera dans un second temps sur des labyrinthes plus exotiques afin de vérifier l'exactitude et l'universalité de notre implémentation de l'algorithme de Dijkstra

On peut voir qu'il y a des soucis sur les bords, nos labyrinthes sont résolubles de façon triviale : en passant par les bords ! On va donc modifier le code pour nettoyer le rendu

maze

On va maintenant passer à la résolution des labyrinthes générés, en utilisant l'algorithme de Dijkstra https://en.wikipedia.org/wiki/Dijkstra%27s_algorithm

On commence par créer quelques fonctions auxiliaires

On peut alors créer une fonction qui va nous dessiner le chemin trouvé sur le labyrinthe

solution2

Bien, tout semble fonctionner Essayons maintenant avec un labyrinthe rond, par exemple:

Ici l'arrivée est au milieu, on garde le départ en haut à gauche

Il nous faut donc convertir l'image en ndarray pour pouvoir le traiter avec notre programme

On va traiter l'image pour s'assurer de n'avoir que des pixels blancs ou noirs

Je suspecte notre implémentation de Dijkstra d'être sous-optimale, je vais donc minuter la résolution

On va procéder à quelques modifications, à savoir:

- Modification de la fonction distance car la précédente n'est sensible qu'aux différences de couleur

- Autoriser les diagonales

- Utiliser une liste à priorité pour éviter d'avoir à rechercher le minimum dans Q à chaque itération, optimisation générale du code

Comparons les performances avec l'exécution précédente sur le labyrinthe rond

Le résultat est convaincant

Voulant tester sur de gros labyrinthes générés par notre programme, celui-ci crash dès que la taille des tableaux dépasse 2^15.

Nous allons donc ré-écrire notre fonction génératrice en utilisant un arbre binaire

hives_sol

La génération est rapide mais ces labyrinthes ne sont pas très esthétiques, essayons avec l'algorithme "recursive backtracker"

https://en.wikipedia.org/wiki/Maze_generation_algorithm#Recursive_backtracker

Essayons maintenant sur un labyrinthe de grande taille :

big

On termine avec la recherche d'une solution dans un labyrinthe inhabituel :

https://www.amazingmazes.co.uk/images/bubblebabybl.jpg

hives_sol

References :

Génération de labyrinthes :

https://github.com/AryanAb/MazeGenerator

https://github.com/antigones/pymazes/blob/main/binary.py

https://github.com/ravenkls/Maze-Generator-and-Solver/blob/master/maze_generator.py


Algorithme de Dijkstra :

https://towardsdatascience.com/solving-mazes-with-python-f7a412f2493f

https://codereview.stackexchange.com/questions/249011/implementation-of-dijkstras-algorithm-in-python

https://gist.github.com/m00nlight/245d917cb030c515c513

https://fr.wikipedia.org/wiki/Algorithme_de_Dijkstra


Labyrinthe dessiné :

https://www.amazingmazes.co.uk/

Gauthier HARENG, étudiant de L3-Mathématiques à UGA - 2021