2015-10-22 22 views
7

Sto utilizzando Bellman-Ford per trovare il percorso più breve attraverso un grafico con alcuni pesi negativi. Il grafico non ha possibilità di loop e nessuna connessione bidirezionale. Mi piacerebbe trovare i cammini più corti di K attraverso il grafico, in cui i percorsi non condividono nodi in comune. C'è un algoritmo che posso cercare per imparare come farlo? La semplice implementazione è più importante della velocità al momento.Algoritmo per trovare i percorsi K in alto nel grafico, senza vertici comuni, pesi negativi?

Aggiunto: Grazie per i commenti. Per essere chiari, sto cercando i migliori K modi per passare da un nodo iniziale specificato a un nodo finale specificato, senza altri nodi in comune. Ho bisogno di un optimum globale; trovare in modo sequenziale i nodi migliori e eliminarli non dà un risultato soddisfacente. Questo: https://en.wikipedia.org/wiki/Yen%27s_algorithm, dà il sapore di ciò di cui sto parlando, ma in questo caso richiede costi di bordo non negativi e consente anche la condivisione dei nodi.

+1

Suppongo che si possa presumere che il grafico sia connesso? – Codor

+1

K percorsi più brevi che non condividono nodi in comune, come nei percorsi K più brevi che collegano due vertici e condividono solo quei due vertici? Se il grafico è senza anello, potresti esaurire tutti i percorsi e prendere la K più corta? – opticaliqlusion

+2

Quindi hai un grafico aciclico diretto? È ciò che stai facendo ora per trovare ripetutamente un percorso più breve ed eliminare i nodi interni o sei interessato a un'ottimizzazione globale? –

risposta

2

Penso che il problema possa essere risolto trovando un flusso minimo di costi.

Trasformiamo il grafico nel modo seguente:

  1. sostituire ogni nodo v tranne source e lavello con due nodi v1 e v2 collegati da un bordo di peso 0 da v1 a v2. I archi entranti della ex v entrano a v1 e l'uscita partono dal v2. Con questo il problema è equivalente a non usare quei bordi più di una volta.

  2. Impostare la capacità 1 su tutti i bordi.

Trovare un flusso di valore K vi darà K percorsi che non condividono un nodo (a causa di mettere la capacità di 1 a quei nuovi bordi). Quindi, se questo flusso è un flusso di costo minimo, si avrà che quei percorsi K hanno anche la somma minima possibile di costi.

Si presume che non si disponga di uno spigolo che collega direttamente la sorgente e il lavandino. Controlla la cassa dell'angolo separatamente.

+0

Grazie, hai un algoritmo consigliato per risolvere il problema del costo minimo? – user2364295

+0

Vorrei suggerire di applicare l'algoritmo Shortest Augmenting Path per essere abbastanza semplice da codificare, ma usando Bellman-Ford invece di Dijkstra perché il tuo grafico contiene bordi negativi. – AlexAlvarez

Problemi correlati