2011-10-27 3 views
0

J'essaie de modifier le comportement par défaut de astar_visitor de bgl astar_search. J'ai un graphique représentant le transport public - les arrêts sont des sommets et les lignes sont des arêtes (il y a donc des arêtes parallèles entre les sommets). J'ai besoin de vérifier si la connexion (edge) que l'algorithme essaie d'utiliser est disponible à cette heure (nous ne pouvons pas utiliser les lignes de nuit à 12h).Modification de la bibliothèque de graphes boost astar recherche visiteur

Je sais que astar_visitor utilise la fonction examination_edge dans laquelle je peux prendre des décisions, mais que dois-je faire pour que bgl astar sache que ce bord est mauvais et ne devrait pas être utilisé?

Je préférerais ne pas supprimer le bord parce que je veux charger le graphique juste une fois et puis faire beaucoup de temps de recherche.

Merci à l'avance

Répondre

0

Jetez un oeil à boost :: astar_heuristic.

Vous pouvez définir une votre propre heuristique et le transmettre dans astar_search()

Votre classe heuristique doit avoir accès à une structure de données qui détiennent des données supplémentaires sur les « mauvais » bords. Vous devez traduire "mauvais" en "cher", ce qui signifie que l'algorithme ne considérera pas ceux-ci comme faisant partie des solutions.

http://www.boost.org/libs/graph/doc/AStarHeuristic.html

+0

Oui, vous avez raison, mais il résout pas le problème (ou je ne comprends pas la solution). Quand je change de poids de bord, il sera changé après l'exécution de astar_search, et comme je l'ai déjà dit - j'ai besoin d'utiliser le même graph (comme d'origine) quelques fois. Bien sûr, je peux stocker des informations sur les changements et après tout "réinitialiser" mais je pense qu'il y a une meilleure solution. Peut-être utiliser functor, qui sera une sorte de machine d'état va résoudre le cas. Dans astar_visitor, je pourrais définir "ignorer la prochaine fois", et dans la fonction de poids, si cette option est définie, edge retournerait + inf et définirait cette option sur false. – myky

+0

@myky A l'intérieur de la classe heuristique, vous pouvez remplir une structure de données avec de mauvais "bords". astar_search() appellera votre objet heuristique pour chaque arête et vous aurez alors la possibilité de rechercher si le bord de votre liste de mauvais bords. –

+0

Merci Eddy, je connaissais l'heuristique mais pour une raison inconnue je ne me suis pas battu sur le retour + inf en heuristique au lieu de réinventer la roue. – myky

Questions connexes