Quels sont les meilleurs algorithmes de chemin le plus court à considérer?

13

Je résous un problème d'optimisation de la recherche de graphiques. J'ai besoin de trouver les k meilleurs chemins les plus courts acycliques à travers un graphique pondéré dirigé.

Je sais qu'il existe un certain nombre d'algorithmes k-best exacts et approximatifs, mais la plupart des recherches récentes semblent être orientées vers des graphiques très grands et très peu connectés (par exemple, l'itinéraire routier et les directions), et mon graphique n'est ni l'un ni l'autre.

Distinguer les aspects de mon problème:

  • Le graphique se compose d'environ 160 sommets.

  • Le graphique est presque entièrement connecté (bidirectionnellement, donc ~ 160 ^ 2 ~ = 25k bords)

  • k sera assez petit (probablement moins de 10)

  • La longueur maximale du trajet sera probablement limitée et très petite également (par exemple 3 à 5 bords)

  • J'ai dit «acyclique» ci-dessus, mais juste pour réitérer - les solutions ne doivent pas inclure de cycles. Ce n'est pas un problème pour le meilleur chemin le plus court, mais cela devient un problème pour k-meilleur - par exemple, considérez un itinéraire routier - le 2ème chemin le plus court de A à B pourrait être le même que le meilleur, avec un rapide voyage autour d'un bloc quelque part. C'est peut-être mathématiquement optimal, mais pas une solution très utile. ;-)

  • Nous devrons peut-être repeser les bords à la volée pour chaque calcul. Un coût de périphérie se compose d'une somme pondérée de plusieurs facteurs, et les exigences finales (chaque fois que nous les obtenons) peuvent permettre à un utilisateur de spécifier sa propre hiérarchisation de ces facteurs de pondération, modifiant les pondérations de bord. Il s'agit d'un graphique relativement petit (nous devrions pouvoir le représenter dans quelques centaines de Ko), il est donc probablement raisonnable de cloner le graphique en mémoire, d'appliquer la repondération, puis d'exécuter la recherche sur le graphique cloné. Mais s'il existe une méthode plus efficace pour effectuer la recherche tout en calculant les poids à la volée, je suis intéressé.

Je regarde les algorithmes décrits dans Santos (algorithmes de chemin le plus court K), Eppstein 1997 (Trouver les k chemins les plus courts), et d'autres. L'algorithme de Yen est intéressant, principalement en raison de l' implémentation Java existante . Je n'ai pas peur de lire les documents de recherche, mais j'ai pensé qu'il valait la peine de jeter les détails de mon problème et de demander des conseils pour gagner du temps de lecture.

Et si vous avez des pointeurs vers des implémentations Java, c'est encore mieux.

AaronD
la source
+1, car je suis intéressé par les suggestions des utilisateurs, et cela semble être le type exact de question pour lequel ce site a été fait.
KChaloux
Votre condition acyclique ne signifie-t-elle pas que TOUT autre chemin, du début à l'objectif, créerait un cycle avec le premier chemin? Et si le départ et le but sont dans une allée aveugle, chaque chemin doit utiliser ces deux bords.
user470365
Peut-être que je n'étais pas clair. La contrainte acyclique ne s'applique qu'à un seul chemin - naturellement, 2 chemins distincts de A à B formeront un cycle.
AaronD
@AaronD: alors, lequel avez-vous finalement utilisé?
dagnelies
@arnaud: Je ne suis pas certain d'avoir encore opté pour un algorithme; J'ajouterai une mise à jour à cette question lorsque j'en aurai. J'ai éliminé Eppstein car il ne garantit pas les solutions acycliques (alias «simples»). Je travaille actuellement avec l'algorithme de Yen, mais je ne suis pas encore arrivé au profilage détaillé ou à l'optimisation, donc je vais peut-être devoir le remplacer par un autre. Je mettrai à jour la semaine prochaine ou deux.
AaronD

Réponses:

2

Pour répondre partiellement à ma propre question:

Depuis la publication de cette question, j'ai découvert que nous devons gérer les poids de bords négatifs ainsi que les positifs (la limitation aux chemins acycliques / simples / sans boucle signifie que la meilleure solution est définie, tandis que sans cette limitation, le chemin le plus court à travers un graphique avec négatif- les cycles de coûts ne sont pas définis).

L'algorithme de Yen et la plupart des autres que j'ai examinés dépendent d'une série de recherches parmi les meilleures; la plupart utilisent Dijkstra pour ces recherches intermédiaires. Dijkstra ne prend pas en charge les poids de bord négatifs, mais nous pouvons remplacer Bellman-Ford à sa place (au moins en yen; probablement à Lawler ou Eppstein également). J'ai développé une modification de Bellman-Ford avec une limitation de longueur de trajet (en bords) et une vérification de cycle explicite pendant la recherche (à la place de la détection de cycle post-recherche standard). La complexité de calcul est pire, mais toujours traitable pour mes besoins. Je vais modifier cette réponse et créer un lien vers un rapport technique si j'obtiens la permission de la publier.

AaronD
la source
1

Je dirais que cette question peut être facilement googlé et est également un doublon:

Cela étant dit, j'ai déjà utilisé et implémenté Eppstein et le recommande. Je l'ai trouvé assez élégant. Si je me souviens bien, cela peut aussi être optimal, et l'article suivant l'explique très bien:

http://pdf.aminer.org/001/059/121/finding_the_k_shortest_paths.pdf

dagnelies
la source
Tout d'abord, merci pour la recommandation d'Eppstein. J'y regarderai plus. Je dirais que ce n'est pas un doublon exact, ni facile à google; il est facile de trouver un algorithme k-best, mais pas si facile de choisir judicieusement entre eux. Je suppose que je voudrais un algorithme très différent pour un graphe faiblement connecté de millions de sommets que je ne le ferai pour ce problème. Je me soucierais beaucoup plus de la complexité en k si je voulais le 1000-best au lieu du 10-best. Et, bien que les facteurs constants ne soient pas si importants lors de la publication d'articles, ils le sont certainement lors de l'expédition du code de production.
AaronD
@AaronD: juste pour votre information, je pense que l'algorithme est très efficace quoi qu'il arrive. Il y a peut-être des cas spéciaux où les recherches heuristiques l'ont battu, mais pour le cas général, je pense que cela fonctionne très bien. Les performances exactes dépendront probablement davantage de la façon dont vous les implémentez exactement, de l'efficacité de vos infrastructures de données et de leur adaptation à votre problème.
dagnelies
@arnaud Bonjour, est-il possible pour vous de partager l'implémentation de votre eppstein? J'ai une question similaire publiée ici: math.stackexchange.com/questions/1661737/…
Tina J