Esiste un algoritmo ottimale per trovare il percorso più lungo più breve in una rete?


13

Ho un ampio set di reti lineari e vorrei trovare le due estremità di ciascuna rete che sono le più distanti tra loro lungo la rete (nell'immagine sotto, sarebbe da D a K). La soluzione della forza bruta a questo problema è calcolare il percorso più breve lungo la rete per ogni coppia di origine, ma ho centinaia di reti con migliaia di estremità, quindi calcolare ogni possibile percorso è piuttosto pesante.

C'è un modo ottimale per calcolare questo senza usare la forza bruta? Posso escludere alcuni punti in base ad alcune regole intelligenti?

Come trovare in modo efficiente il percorso rosso?

EDIT: ho aggiunto un'illustrazione del percorso più lungo menzionato da @Alex Tereshenkov al fine di chiarire la mia domanda. Il percorso nero è il risultato dell'algoritmo del percorso più lungo (percorso più lungo senza ripetere i vertici). Nel mio caso, immagina di entrare nella rete da una qualsiasi delle lettere e di dover guidare verso un'altra lettera il più velocemente possibile. Quali sono le due lettere più difficili da unire? inserisci qui la descrizione dell'immagine


mad paint skillz!
Adam,

Risposte:


6

Penso che potresti cercare il diametro grafico della tua rete. Ci sono un paio di domande su stackexchange che menzionano questo argomento, ad esempio:

La maggior parte degli algoritmi suggerisce di calcolare prima i "percorsi più brevi a tutte le coppie" e di selezionare quelli più lunghi, ma ho trovato un post sul blog di Koushik Narayanan che suggerisce un approccio alternativo che potrebbe essere più ottimale (non ho verificato), che scorre su ogni vertice e trova la sua coppia più distante:

Possiamo calcolare il percorso da un vertice V1 in modo tale che sia il percorso più breve tra V1 e uno dei vertici ed è più lungo del percorso più breve tra qualsiasi altro vertice. Vedi questo post per un algoritmo. Quindi, possiamo scorrere tutti i vertici e trovare il percorso più lungo con ogni vertice come radice. Una volta che abbiamo l'elenco di tutti i percorsi più lunghi più brevi, possiamo trovare quello che ha il valore massimo e restituirlo.


grazie, il diametro del grafico era esattamente quello che cercavo e l'euristica pseudo-diametro funziona nel mio caso. Ho appena imparato nuove parole lì!
Radouxju,

7

Secondo la pagina Wikipedia Problema del percorso più lungo , questo problema

... è NP-difficile, il che significa che non può essere risolto in tempo polinomiale per grafici arbitrari a meno che P = NP. Sono noti anche risultati di durezza più elevati che dimostrano che è difficile approssimarsi. Tuttavia, ha una soluzione temporale lineare per i grafici aciclici diretti, che ha importanti applicazioni nella ricerca del percorso critico nella pianificazione dei problemi.

Se lavori con (o puoi rappresentare il tuo grafico come DAG ), il networkxpacchetto Python ti consentirà di calcolarlo. Cerca la funzione dag_longest_path.

A meno che non mi manchi qualcosa, dovrai calcolare la lunghezza tra i nodi del grafico e ordinarli che, sfortunatamente, funzioneranno solo in tempo lineare , cioè non esiste un algoritmo efficiente per questo.


grazie per la risposta, già + 1 a causa delle informazioni. Tuttavia, sto cercando il PERCORSO PIÙ BREVE più lungo in una rete (nel mio esempio, nessuna deviazione verso B o H). Pertanto la tua soluzione non è esattamente quello che sto cercando, anche se suggerisce che la "forza bruta" è probabilmente l'unica soluzione.
Radouxju,

@radouxju, ah vedo. Bene, vediamo se il gene lo noterà, ha molta esperienza con i grafici, forse ha delle idee brillanti.
Alex Tereshenkov,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.