Quelles optimisations existent pour essayer de trouver le chemin le plus long dans un graphe cyclique?Optimisations pour le problème de chemin le plus long dans le graphe cyclique
Le plus long chemin dans les graphes cycliques est connu pour être NP-complet. Quelles optimisations ou heuristiques peuvent vous permettre de trouver le chemin le plus long plus rapidement que DFS le graphique entier? Y a-t-il des approches probabilistes?
J'ai un graphique avec des qualités spécifiques, mais je cherche une réponse à cela dans le cas général. Lier aux papiers serait fantastique. Voici une réponse partielle:
Confirmez qu'il est cyclique. Le plus long chemin dans les graphes acycliques est facilement calculé en utilisant la programmation dynamique. Déterminez si le graphe est planaire (quel est le meilleur algorithme?). Si c'est le cas, vous pouvez voir s'il s'agit d'un graphe de blocs, d'un graphe ptolemaic ou d'un graphique de cactus et appliquer les méthodes trouvées dans this paper. Pour connaître le nombre de cycles simples, utilisez Donald B Johnson's algorithm (Java implementation). Vous pouvez transformer n'importe quel graphique cyclique en un graphique acyclique en supprimant un bord dans un cycle simple. Vous pouvez ensuite exécuter la solution de programmation dynamique trouvée sur the Wikipedia page. Pour être complet, vous devez faire N fois pour chaque cycle, où N est la longueur du cycle. Ainsi, pour un graphe entier, le nombre de fois que vous devez exécuter la solution DP est égal au produit des longueurs de tous les cycles.
Si vous devez DFS le graphe entier, vous pouvez élaguer certains chemins en calculant à l'avance l '"atteignabilité" de chaque noeud. Cette accessibilité, qui est principalement applicable aux graphes orientés, est le nombre de nœuds que chaque nœud peut atteindre sans répétitions. C'est le maximum que le plus long chemin de ce nœud pourrait être. Avec cette information, si votre chemin actuel plus l'accessibilité du nœud enfant est inférieur au plus long que vous avez déjà trouvé, il est inutile de prendre cette branche car il est impossible que vous trouviez un chemin plus long.
Est-ce que (3) concernent la recherche de composants fortement connectés? (http://en.wikipedia.org/wiki/Strongly_connected_component) - sinon, j'aurais pensé que vous pourriez faire quelque chose avec ça. J'ai trouvé l'algorithme de Tarjans assez facile à comprendre. – Steve314
Honnêtement, je ne vois pas comment l'identification des composants fortement connectés ou la contraction des sommets aide à résoudre le LPP, mais je peux me tromper. Pour le contraindre en un graphique acyclique, je crois que vous avez besoin des cycles simples (Johnson's), car il peut encore y avoir des cycles dans les composants fortement connectés. –
peut-être que cela n'aide pas. Ma pensée était que les CSC sont généralement plus petits que le graphique entier, donc trouver les plus longues routes à travers eux pour chaque paire entrée/sortie devrait être relativement rapide. Supprimez les SCC et ajoutez un front pondéré à la place pour chacune de ces solutions SCC les plus longues et vous devriez vous retrouver avec un digramme acyclique sur lequel vous pouvez effectuer une programmation dynamique. Chaque arête SCC la plus longue remplace en réalité une arête qui a pénétré dans la couche SCC et une arête qui l'a quittée, ainsi que la trajectoire qui traverse la couche SCC elle-même. Il se peut que je manque quelque chose, cependant. – Steve314