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.