- Projet Chemin
- Equipe
- Instructions
- Introduction
- Questions
- Bibliographie
identifiant : G2S1
- Daniel Gilardoni
- Felipe Paris Mollo Christondis
- Leopold Abignoli
-
Cet article contient une annexe, un projet développé par l'équipe, qui montre certains algorithmes mentionnés dans l'article. Pour accéder à cette annexe, voir le lien suivant: https://github.com/parismollo/MD5-Projet
-
Pour afficher correctement le contenu de ce fichier, veuillez utiliser un éditeur de texte capable d'interpréter le démarquage "markdown". Sinon, voici un lien vers la version pdf de ce fichier: https://github.com/parismollo/MD5-Projet/blob/main/Article.pdf
L'objectif de ce projet est l'étude de chemins de taille minimum entre 2 points dans une grille. Un point est situé à l'extremité d'une arête. La grille peut contenir des murs, ce sont des arêtes de la grille par lesquelles on ne peut pas passer.
La taille d'un chemin est le nombre d'arêtes par lequel on doit passer pour aller du premier point du chemin au dernier. Un point qui a pour coordonnée
Les coordonnées du point de départ sont
Si le point d'arrivée et de depart sont sur la même ligne
Le nombre de chemins de taille minimale possible est donc :
ou
ou $$ \binom{|x_1 - x_2| + |y_1 - y_2|}{|x_1 - x_2|}$$
Dans une grille sans mur de longueur
C'est la taille de tous chemins entre le point de depart de coordonnée
Une grille peut être représentée par un graphe où on associe un sommet à chaque case de la grille. Une arête relie 2 sommets si les 2 cases qu'ils représentent sont voisines dans la grille.
- (BFS) est un algorithme de recherche qui permet de parcourir un arbre ou un graphe.
- Entrées : graphe
$G = (V, E)$ et sommet$s ∈ V$ , où$V$ represente les sommets du graphe$G$ et$E$ represente les aretes$(u, v)$ de$G$ .
-
$O(V + E)$ pour les listes d'adjacence -
$O(V^2)$ pour les matrices d'adjacence
début
créer file(Q);
marquer(départ);
enfiler(Q, départ);
Tant que Q != ∅ faire
u ← défiler(Q);
Pour tous les u,v ∈ E faire
si v non marqué alors
marquer(v);
enfiler(Q, v);
L'algorithme BFS (Breadth-first search) est un algorithme de recherche. Il réalise sa recherche à travers un parcours transversal d'un graphe, ce qui signifie qu'on visite tous les sommets d'un même niveau avant de passer à un autre.
Afin de visiter tous les sommets d'une graphe. BFS catégorise chaque sommet en deux types - visité et non visité. À partir d'un noeud choisi, BFS visite tous les noeuds adjacents au noeud sélectionné et ainsi de suite1.
Étape 1:
- Déclarer une file d'attente (FIFO) et insérer le sommet de départ.
- Initialiser un tableau de marquage (tableau de booléan) et marquer le sommet de départ comme visité.
Étape 2 Suivre le processus ci-dessous jusqu'à ce que la file d'attente soit vide :
- Supprimer le premier sommet de la file d'attente.
- Marquer ce sommet comme visité.
- Insérer tous les voisins non visités du sommet dans la file d'attente.
Entrées : Graphe orienté
créer filePriorité(pq);
enfiler(pq, (s, 0));
Pour tous i de 0 à taille(distances) faire
distances(i) ← +∞;
precedents(i) ← null;
precedents(s) ← None;
distances(s) ← 0;
Tant que pq != ∅ faire
u ← defiler(pq);
Si u = t:
Fin;
Pour tous les (u, v) ∈ E faire:
dist ← distances(u) + 1
Si dist < distances(v) alors
distances(v) ← dist
priorite ← dist + heuristic(t, v)
enfiler(pq, (v, priorite))
precedents(v) ← u
Le chemin le plus court entre le sommet s et un sommet arrivée est donné par le tableau precedents. La case du sommet d'arrivée dans precedents contient le sommet précédent dans le chemin le plus court, et ainsi de suite. Heuristic est une fonction qui peut aider à trouver le chemin le plus court plus rapidement. Par exemple elle peut renvoyer la valeur de la distance entre le sommet courant et le sommet arrivée si il n'y avait pas de murs. 3
Soit un graphe
Le graphe
A chaque tour de boucle, on récupère le sommet avec la priorité la plus faible avec une file de priorité. On compare la distance du sommet courant avec la distance de chacun de ses voisins dans le tableau distances. Chaque comparaison se fait en temps constant. Si la distance du voisin est la plus grande alors on va la modifier et ajouter ce sommet à la file de priorité. Il n'y a pas de poids et avec la file de priorité on regarde les sommets dans l'ordre de leur distance à la source, donc on ne va jamais modifié plusieurs fois la distance d'un sommet et donc on ne va jamais ajouté plus d'une fois un sommet à la file de priorité au cours de l'execution.
Dans le pire des cas, l'algorithme va visiter tous les sommets et les ajouter tous une fois dans la file.
On a donc
La complexité dans le pire des cas est donc de
Une méthode naïve qui ferait la liste des chemins de la grille avant d’enlever ceux bloqués par des murs puis de prendre l’un des chemins restant de longueur minimale, serait de complexité :
-
$O(\binom{h+l}{h})$ dans le pire des cas car on fait la liste de tous les chemins possibles. Ce serait beaucoup moins efficaces.