Ingegneria civile e strutturale
Sfruttando l'algoritmo di Johnson per tutti i tipi di problemi di percorso più brevi
Table of Contents
Capire il problema del percorso più breve di tutti i piani
Il problema del percorso più breve (APSP) di tutti i piani cerca la distanza più breve tra ogni coppia di vertici in un grafico ponderato. Si tratta di una sfida fondamentale nella teoria dei grafici con implicazioni dirette per la progettazione della rete, l'ottimizzazione del flusso di traffico, l'analisi della rete sociale e la logistica.
Gli approcci comuni affrontano questo problema ma affrontano i compromessi. Floyd-Warshall, un algoritmo di programmazione dinamico, funziona su grafici densi ma funziona in O(V]3]]])] tempo e non può gestire cicli di peso negativo.
Confronto degli Algoritmi Comuni
Per apprezzare l'algoritmo di Johnson, aiuta a contrastare i più frequentemente utilizzati risolutori APSP:
- Floyd-Warshall[[] – Semplice da implementare, utilizza una matrice di distanza 2D, aggiornamenti tramite loop tripli. Funziona su bordi negativi ma non cicli negativi.
- Dijkstra ripetuta[[] – Esegue Dijkstra da ogni vertice. Veloce su grafici radi ([[[]O(V E log V)]]] utilizzando Fibonacci heaps), ma limitato a pesi non negativi.
- Bellman-Ford (ripetato)[]] – Maneggia i bordi negativi ma corre in []O(V[]2]E), che è più lento di entrambe le alternative.
- L'Algorithm di Johnson[[[] – Rispesa il grafico in modo che tutti i bordi diventino non negativi, quindi applica Dijkstra ripetuta.
Come funziona l'Algoritmo di Johnson
L’algoritmo di Johnson trasforma in modo intelligente un grafico contenente bordi negativi in uno con solo pesi non negativi, preservando la struttura di percorsi più brevi. Questa trasformazione si basa su una funzione potenziale[[]] derivata da un singolo run di Bellman‐Ford. Una volta ridimensionato, l’algoritmo di Dijkstra può essere utilizzato da ogni nodo in modo sicuro.
Passo 1: Aggiungere un nodo Super Source
Un nuovo vertex s[]] viene aggiunto al grafico, collegato ad ogni vertex esistente con un bordo di peso 0. Questo nodo extra non altera le distanze di percorso più corte perché qualsiasi percorso che utilizza ]s]] può essere allegato senza alcun costo.
Fase 2: Computing Potenziali Funzioni con Bellman-Ford
Eseguire l'algoritmo Bellman‐Ford dalla super sorgente ]]. Poiché ]] ha bordi a peso zero a tutti i vertici, l'algoritmo calcola la distanza più breve h(v)] da ciclo negativo[FLT]
Passo 3: Ridimensionare il grafico
Usando i potenziali h(v), ogni bordo [(u, v)[] con il peso originale []w(u, v)]] è ripeso a:
w'(u, v) = w(u, v) + h(u) – h(v)]
Questa trasformazione garantisce che ogni peso del bordo ripeso non sia negativo. La prova si basa sulla disuguaglianza del triangolo: perché h(v) ≤ h(u) + w(u, v)] (dall'output di Bellman‐Ford), segue che w'(u, v) ≥ 0
Passo 4: Eseguire l'Algoritmo di Dijkstra da ogni Vertex
Con il grafico ridimensionato contenente solo bordi non negativi, l'algoritmo di Dijkstra viene eseguito una volta da ogni vertice. Ogni corsa calcola le distanze più corte a tutti gli altri vertici. Le distanze risultanti vengono poi convertite in pesi originali dei bordi utilizzando la formula:
dist]originale[(u, v) = dist[]ripeso[(u, v) – h(u) + h(v)]]]
Questo passaggio finale garantisce che le distanze riportate siano accurate per il grafico originale.
Analisi della complessità e delle prestazioni
[LT] L'algoritmo di Johnson raggiunge una complessità temporale complessiva di [VLT E + V]2 log V] quando implementato con una coda di priorità del heap binario.
Utilizzando un mucchio di Fibonacci può ridurre la parte di Dijkstra a O(V E + V2 log V) ammortizzato, anche se nella pratica i salti binari sono più semplici e spesso abbastanza veloci. L'impronta di memoria è O(V[2 migliorata:5]
Applicazioni pratiche
L'algoritmo di Johnson viene impiegato in domini in cui i bordi dei grafici possono portare costi negativi e sono necessarie distanze più brevi all-pair.
- ]Instradamento di rete:[[] I fornitori di servizi Internet e le reti di telecomunicazioni utilizzano protocolli di routing distribuiti che devono calcolare adattativamente il percorso più economico tra due router, anche quando i costi di collegamento oscillano o diventano negativi (ad esempio, a causa di sconti di congestione o di politica).
- Pianificazione dei trasporti urbani:[[] Aziende di mappatura e logistica (ad esempio, Google Maps, OpenStreetMap routing engine) calcolano percorsi più brevi tra molte coppie di destinazione di origine per l'ottimizzazione della flotta.
- Riduzione dei costi della catena di fornitura:[[ Nelle reti di produzione multistadio, i costi da un nodo all'altro potrebbero essere negativi (ad esempio, sconti).
- L'analisi della rete sociale:[[] La misurazione della centralità di prossimità o della centralità di trasposizione richiede distanze di ogni tipo.
- Modelli di input-output economici:[[ Le analisi dei flussi e dei modelli di Leontief spesso comportano coefficienti negativi; l'algoritmo di Johnson calcola l'effetto netto dei cambiamenti di propagazione attraverso un'economia interconnessa.
Per ulteriori informazioni sulle basi matematiche, vedere ]L'entrata dettagliata di Wikipedia e la carta originale di Donald B. Johnson (1977).L'implementazione pratica in Python può essere trovata sul tutorial GitHub repository], che include l'algoritmo di Johnson come funzione standard.
Conclusioni
L’algoritmo di Johnson si distingue come una soluzione elegante e pratica al problema del percorso più breve di tutti i piani quando sono presenti dei pesi negativi dei bordi. Combinando la robustezza di Bellman‐Ford (per rilevare cicli negativi e potenziali di calcolo) con la velocità di Dijkstra (per i grafici non negativi), raggiunge ottime prestazioni su reti sparse. La tecnica di ridimensionamento è una bella applicazione delle funzioni potenziali, come si estende un concetto più corto.
Di fronte a un problema APSP del mondo reale dove i grafici sono radi e possono contenere bordi negativi, l'algoritmo di Johnson dovrebbe essere la prima considerazione. Le sue garanzie teoriche e l'implementazione diffusa in biblioteche (ad esempio, []]NetworkX], [] Boost Graph Library]])]) rendono pratico adottare.