Ho bisogno di trovare un percorso più breve attraverso un grafico non orientato i cui nodi sono reali (positivi e negativi) ponderati. Questi pesi sono come risorse che puoi guadagnare o perdere inserendo il nodo.Qual è l'algoritmo/soluzione più semplice per un singolo percorso più breve attraverso un grafico non orientato ponderato reale?
Il costo totale (somma delle risorse) del percorso non è molto importante, ma deve essere maggiore di 0 e la lunghezza deve essere la più breve possibile.
Per esempio consideriamo un grafico in questo modo:
A-start node; D-end node
A(+10)--B(0)--C(-5)
\ | /
\ |/
D(-5)--E(-5)--F(+10)
Il percorso più breve sarebbe A-E-F-E-D
di Dijkstra da solo non fare il trucco, perché non in grado di gestire valori negativi. Quindi, ho pensato ad alcune soluzioni:
Prima si utilizza l'algoritmo di Dijkstra per calcolare la lunghezza di un percorso più breve da ciascun nodo al nodo di uscita, non considerando i pesi. Questo può essere usato come una sorta di valore euristico come in A *. Non sono sicuro che questa soluzione possa funzionare, ed è anche molto costosa. Ho anche pensato di implementare l'algoritmo di Floyd-Warshall, ma non so come.
Un'altra soluzione era calcolare il percorso più breve con l'algoritmo di Dijkstra non considerando i pesi, e se dopo aver calcolato la somma delle risorse del percorso è inferiore a zero, passare attraverso ciascun nodo per trovare un nodo vicino che potrebbe aumentare rapidamente la somma delle risorse, e aggiungilo al percorso (più volte se necessario). Questa soluzione non funzionerà se c'è un nodo che potrebbe essere sufficiente per aumentare la somma delle risorse, ma più lontano dal percorso più breve calcolato.
Ad esempio:
A- start node; E- end node
A(+10)--B(-5)--C(+40)
\
D(-5)--E(-5)
Potresti aiutarmi a risolvere questo problema?
MODIFICA: Se durante il calcolo del percorso più breve, si raggiunge un punto in cui la somma delle risorse è uguale a zero, quel percorso non è valido, poiché non è possibile proseguire se non c'è più benzina.
In questo esempio, anche A-E-A-E-D sarebbe una soluzione valida? – mbeckish
Sì, è valido. – foobars
A prima vista, sembra che ci siano 2 modi per aumentare la somma delle risorse - 1) deviare dal percorso più breve per trovare un nodo ad alta risorsa nelle vicinanze, e 2) oscillare tra due nodi sul percorso più breve con un aumento della somma delle risorse nette. Quindi il trucco è capire un euristico per determinare quale opzione scegliere. – mbeckish