73 行
3.7 KiB
Text
73 行
3.7 KiB
Text
problème ouvert
|
|
|
|
marathon: 42,195 kilomètres
|
|
contraintes :
|
|
- on ne peut pas passer par le même sommet plusieurs fois
|
|
- on ne peut pas passer par le même arc plus d'une fois
|
|
- on ne peut pas passer par les petites rues (pour avoir assez de place) = pas à implémenter dans l'algorithme, à vérifier avant : on suppose que, sur le graphe, les petites rues ne sont pas affichées
|
|
- 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
|
|
- on ne peut pas avoir d'obstacles sur le chemin
|
|
- on ne peut pas avoir de grosses montées ou descentes
|
|
|
|
|
|
1er algo: on considère qu'on connait le point de départ et le point d'arrivée
|
|
|
|
|
|
ALGO
|
|
|
|
int dist_done = 0; //distance déja effectuée depuis le point de départ
|
|
//on appelle origine le point de départ et dest le point de destination
|
|
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
|
|
|
|
|
|
//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.
|
|
|
|
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.
|
|
|
|
|
|
|