Génie civil & structural
Tirer parti de Johnson , Algorithme pour toutes les paires Problèmes de chemin plus court
Table of Contents
Comprendre le problème de la voie la plus courte pour toutes les paires
Le problème de trajectoire la plus courte (APSP) cherche la plus courte distance entre chaque paire de sommets dans un graphique pondéré. C'est un défi fondamental en théorie des graphiques avec des implications directes pour la conception du réseau, l'optimisation du flux de trafic, l'analyse du réseau social, et la logistique.
Les approches communes abordent ce problème mais font face à des compromis. Floyd-Warshall, un algorithme de programmation dynamique, travaille sur des graphiques denses mais fonctionne dans O(V3 et ne peut pas gérer des cycles de poids négatifs. L'algorithme Dijkstra=S, lorsqu'il est exécuté à partir de chaque vertex, obtient O(V (E + V log V)) avec un tas binaire, mais il échoue sur des graphiques avec des poids de bord négatifs.
Comparaison des algorithmes communs
Pour apprécier l'algorithme Johnson, il aide à contraster les résolveurs APSP les plus fréquemment utilisés :
- Floyd-Warshall – Simple à implémenter, utilise une matrice de distance 2D, met à jour via des triples boucles. Fonctionne sur les bords négatifs mais pas sur les cycles négatifs.
- Dijkstra – Runs Dijkstra de chaque vertex. Rapide sur des graphiques clairsemés (O(V E log V) utilisant des tas de Fibonacci), mais limité aux poids non négatifs.
- Bellman-Ford (répété) – Poigne les bords négatifs mais fonctionne dans O(V2E)[, qui est plus lent que les deux solutions de rechange.
- Johnson , Algorithme – Repoids le graphique de sorte que toutes les bords deviennent non négatifs, puis applique Dijkstra répété. Il donne O(V E + V2 log V)[ avec un tas binaire, ce qui en fait le choix préféré pour les graphiques clairs et avec des poids négatifs.
Comment fonctionne Johnson , Algorithme
Johnson , l'algorithme transforme astucieusement un graphique contenant des bords négatifs en un seul avec seulement des poids de bord non négatifs, préservant la structure des chemins les plus courts. Cette transformation repose sur une fonction potentielle dérivée d'un seul tour de Bellman-Ford. Une fois repondéré, l'algorithme Dijkstra , peut être utilisé de chaque noeud en toute sécurité. L'algorithme se compose de quatre étapes.
Étape 1: Ajout d'un nœud super source
Un nouveau vertex s est ajouté au graphique, relié à chaque vertex existant avec un bord de poids 0. Ce nœud supplémentaire ne modifie pas les distances de chemin les plus courtes car tout chemin qui utilise s peut être annexé sans frais.
Étape 2 : Fonctions potentielles de calcul avec Bellman-Ford
Exécutez l'algorithme Bellman-Ford à partir de la super source s. Parce que sssssss[ss[s[ss[..Cette distance sert de fonction potentielle. Si un cycle négatif est détecté pendant cette course, le graphique original contient un cycle négatif, et Johnson=s rapporte qu'il n'existe aucun ensemble valide de chemins plus courts.
Étape 3: Repondération du graphique
En utilisant les potentiels h(v), chaque bord (u, v) avec le poids initial w(u, v) est repondé à:
w'(u, v) = w(u, v) + h(u) – h(v)
Cette transformation garantit que chaque poids repondé est non négatif. La preuve repose sur l'inégalité du triangle : parce que h(v) ≤ h(u) + w(u, v) (de la sortie de Bellman‐Ford=), il s'ensuit que w'(u, v) ≥ 0. De plus, l'ordre des chemins est préservé : le chemin le plus court entre deux sommets du graphique d'origine reste le chemin le plus court du graphique repondé.
Étape 4: Courir l'algorithme Dijkstra , de chaque vertex
Avec le graphique repondé ne contenant que des bords non négatifs, l'algorithme Dijkstra , est exécuté une fois depuis chaque vertex. Chaque parcours calcule les distances les plus courtes à tous les autres sommets. Les distances résultantes sont ensuite converties en poids de bord d'origine en utilisant la formule:
dist[original(u, v) = distrépondu(u, v) – h(u) + h(v)
Cette dernière étape permet de s'assurer que les distances déclarées sont exactes pour le graphique original.
Analyse de la complexité et du rendement
L'algorithme Johnson=2 réalise une complexité temporelle globale de O(V E + V2log V)[ lorsqu'il est mis en œuvre avec une file d'attente de priorité binaire. L'étape Bellman‐Ford tourne dans O(V E)[, et l'étape suivante VDijkstra tourne chaque fois O(E + V log V) sur des graphiques clairs. Pour les graphiques denses (]E -]2]], les approches de complexité O(V]]3]]], ce qui rend Floyd–Warshall une alternative plus simple. Cependant, pour les graphiques clairs
L'utilisation d'un tas de Fibonacci peut réduire la partie Dijkstra=" à O(V E + V2 log V)[ amorti, bien que dans la pratique les tas binaires soient plus simples et souvent assez rapides. L'empreinte mémoire est O(V2[] pour la matrice de distance, mais cela peut être amélioré en stockant implicitement les résultats.
Applications pratiques
Johnson , l'algorithme est utilisé dans des domaines où les bords des graphiques peuvent supporter des coûts négatifs et où les distances les plus courtes sont requises.
- Roating réseau:[ Les fournisseurs de services Internet et les réseaux de télécommunications utilisent des protocoles de routage distribués qui doivent calculer adaptativement le trajet le moins cher entre deux routeurs, même lorsque les coûts de liaison fluctuent ou deviennent négatifs (p. ex. en raison de la congestion ou des rabais stratégiques).
- Les entreprises de cartographie et de logistique (p. ex. Google Maps, les moteurs de routage OpenStreetMap) calculent les chemins les plus courts entre de nombreuses paires de destinations d'origine pour optimiser la flotte.
- Minimisation des coûts de la chaîne d'approvisionnement :[ Dans les réseaux de production en plusieurs étapes, les coûts d'un noeud à un autre pourraient être négatifs (p. ex., rabais).
- Analyse des réseaux sociaux :[ La mesure de la proximité centralité ou entre les deux centralité nécessite des distances de toutes les paires.
- Les modèles d'entrées-sorties économiques:[ Les modèles et les analyses de flux de Leontief impliquent souvent des coefficients négatifs; l'algorithme Johnson=" calcule l'effet net de la propagation des changements par une économie interconnectée.
Pour plus de détails sur les bases mathématiques, voir Wikipedia=s entry et l'article original de Donald B. Johnson (1977). Une mise en œuvre pratique en Python se trouve sur NetworkX=s GitHub depository, qui inclut l'algorithme Johnson=s comme fonction standard. Pour une compréhension plus approfondie de la technique de repondération, CP‐Algorithms fournit un tutoriel clair étape par étape.
Conclusion
L'algorithme Johnsons se distingue par sa solution élégante et pratique au problème de trajectoire le plus court lorsque les poids négatifs sont présents. En combinant la robustesse de Bellman-Ford (pour détecter les cycles négatifs et les potentiels de calcul) avec la vitesse de Dijkstra (pour les graphiques non négatifs), il permet d'obtenir d'excellentes performances sur des réseaux épars. La technique de repondage elle-même est une belle application des fonctions potentielles, un concept qui s'étend bien au-delà des chemins les plus courts dans des domaines tels que le flux minimum de coûts et la théorie du jeu algorithmique.
Lorsqu'il est confronté à un problème réel d'APSP où les graphiques sont clairsemés et peuvent contenir des bords négatifs, l'algorithme Johnson , devrait être la première considération.Ses garanties théoriques et sa mise en œuvre généralisée dans les bibliothèques (p. ex. NetworkX, Boost Graph Library) rendent l'adoption pratique.