marathon
This commit is contained in:
parent
4a1e281ec7
commit
9f3a23c707
1 changed files with 43 additions and 20 deletions
|
@ -8,9 +8,7 @@ contraintes :
|
|||
- vérifier le roadType de chaque arc : ne pas accepter PEDESTRIAN, CYCLEWAY, TRUNK et TRACK
|
||||
- on doit vérifier que la distance entre le point de départ et le point d'arrivée ne dépasse pas les 3km (distance max acceptable)
|
||||
- on doit définir une zone (autour du point de départ) contenant tous les sommets acceptables (où le marathon peut passer). Cette zone est représentée par un cercle de rayon 24 km (car 21km qui est envirion la moitié du marathon +3 car on peut avoir un point d'arrivée jusqu'à 3km du point de départ) et de centre le point de départ.
|
||||
- on vérifie que tous les sommets du marathon se situent à l'intérieur de cette zone
|
||||
- chaque sommet doit avoir une zone (autour de lui) de sommets voisins acceptables. Cette zone doit contenir tous les sommets de distance inférieure ou égale à 4 km par rapport au sommet précédent.
|
||||
- on ne peut pas avoir des arcs qui se croisent
|
||||
- on vérifie que tous les sommets du marathon se situent à l'intérieur de cette zone
|
||||
- on ne peut pas avoir d'obstacles sur le chemin
|
||||
- on ne peut pas avoir de grosses montées ou descentes
|
||||
|
||||
|
@ -21,30 +19,55 @@ contraintes :
|
|||
ALGO
|
||||
|
||||
int dist_done = 0; //distance déja effectuée depuis le point de départ
|
||||
liste_deja_visite //liste avec sommets déjà visités (au début elle ne contient que l'origine)
|
||||
//on appelle origine le point de départ et dest le point de destination
|
||||
zone //zone des arcs acceptables pour chaque sommet. Par exemple zone[k] donne tous les arcs acceptables en partant du sommet k.
|
||||
|
||||
//x est le sommet qu'on est en train de traiter
|
||||
zone //zone contenant tous les sommets acceptables (distance inférieure à 24 km)
|
||||
h //sommet situé à 24 km du point d'arrivée
|
||||
//suc est l'arc successeur
|
||||
|
||||
for suc in zone[x] loop
|
||||
|
||||
if suc.roadType==PEDESTRIAN or suc.roadType==CYCLEWAY or suc.roadType==TRUNK or suc.roadType==TRACK then
|
||||
//on lève une exception et on affiche un message qui dit que cette rue n'est pas acceptable car elle est très petite
|
||||
end if
|
||||
//Avant de commencer l'algo:
|
||||
|
||||
On doit créer la zone. Pour chaque sommet du graphe on vérifie la distance entre le point d'arrivée et ce sommet : si elle est supérieure à 24 km, on retire ce sommet du graphe.
|
||||
|
||||
for i in liste_deja_visite loop
|
||||
if x==i then
|
||||
//on lève une exception et on affiche un message pour dire que le sommet a déjà été visité
|
||||
end if
|
||||
end loop
|
||||
|
||||
|
||||
if x==dest then
|
||||
//on est arrivé à la destination
|
||||
Ensuite, on vérifie le roadType de tous les arcs
|
||||
if suc.roadType==PEDESTRIAN or suc.roadType==CYCLEWAY or suc.roadType==TRUNK or suc.roadType==TRACK then
|
||||
//on retire l'arc et on affiche un message qui dit que cette rue n'est pas acceptable car elle est très petite
|
||||
end if
|
||||
|
||||
|
||||
|
||||
// 1ere Etape :
|
||||
|
||||
On fait un Dijkstra en partant du point de départ jusqu'en h (sur les sommets étant dans la zone). dist_done prend la valeur du cout total calculé par Dijkstra.
|
||||
|
||||
// 2 ème étape :
|
||||
|
||||
On enlève les sommets visités du graphe (sauf h).
|
||||
|
||||
// 3 ème étape :
|
||||
|
||||
On refait un Dijkstra de h jusqu'au point d'arrivée. On rajoute à dist_done le cout total.
|
||||
|
||||
// 4ème étape :
|
||||
|
||||
On compare la distance parcourue (dist_done) à 42,195 : (3 cas)
|
||||
|
||||
- cas où dist_done = 42,195 km. On a trouvé un chemin de marathon acceptable.
|
||||
|
||||
- if dist_done > 42,195 km
|
||||
On enlève la distance supplémentaire (on modifie donc dist_done) en partant du point d'arrivée et en supprimant les derniers parcours (jusqu'à ce qu'on arrive à la distance voulue) avec une boucle while:
|
||||
while (dist_done > 42,195 ET distance entre sommet courant et point de départ < 3 km) :
|
||||
On recule d'un sommet (en suivant le chemin trouvé avec Dijkstra)
|
||||
|
||||
- si on est sorti de la boucle car dist_done = 42,195, on a trouvé un chemin acceptable.
|
||||
|
||||
- si on est sorti de la boucle car distance entre sommet courant et point de départ est supérieure à 3 km:
|
||||
On refait les deux Dijkstra du début mais au lieu de s'arrêter à h on s' arrête au sommet juste avant h (donc il est plus près du point de départ).
|
||||
|
||||
|
||||
- if dist_done < 42,195 km
|
||||
On prend un autre point du graphe (qui respecte les contraintes du point d'arrivée donc distance inférieure à 3 km) tel que si on rajoute le cout entre notre point d'arrivée et ce nouveau sommet à dist_done, on trouve 42,195.
|
||||
Ce sommet choisi va être notre nouvel point d'arrivée. On a trouvé un chemin acceptable.
|
||||
|
||||
|
||||
|
||||
|
|
Loading…
Reference in a new issue