Ho un database di bus/treno/... fermate e gli orari di arrivo/partenza in ogni data e così via. Sto cercando un modo per effettuare una ricerca per il viaggio più veloce (più breve/più economico/meno transizioni) tra due località. Mi piacerebbe avere sedi arbitrarie in futuro, usando i dati di OpenStreetMap per fare passi tra le fermate e dalle fermate all'inizio/fine, tuttavia per il momento voglio solo trovare il percorso tra due fermate nel database.Algoritmi di pathfinding (routing, pianificazione del viaggio, ...) su grafici con limiti di tempo
Il problema è che non riesco a trovare molte informazioni su questo argomento, ad esempio this Wikipedia page ha un sacco di testo con assolutamente nessuna informazione utile in esso.
Quello che ho trovato è il formato GTFS, utilizzato in Google Transit. Mentre la mia città non fornisce un feed di dati pubblico (nemmeno privato), ho già tutte le informazioni importanti che il GTFS contiene e fare una trasformazione sarebbe banale.
Esiste un software basato su GTFS, ad esempio OpenTripPlanner che può anche eseguire il routing di pedoni/auto/bici utilizzando OpenStreetMap.
Tuttavia, il codice di instradamento non è ben documentato (almeno da quello che ho trovato) e non ho bisogno del tutto.
Tutto quello che sto cercando è una buona panoramica degli algoritmi che potrei usare, le loro prestazioni, forse qualche pseudocodice.
Quindi, la domanda è, dato un elenco di fermate, percorsi e orari di arrivo/partenza/viaggio, come posso trovare facilmente il percorso più veloce dalla fermata A alla fermata B?
Sì, non si otterrà più veloce dell'algoritmo di Dijkstra Per questo a meno che non ci siano vincoli che stai trattenendo che consentono ulteriori ottimizzazioni. Per metriche diverse dal tempo, è necessario formulare un "peso" che sia una combinazione di tempo, costi e problemi. Potrebbe anche essere necessario lasciare all'utente per determinare esattamente quali sono quei pesi e ricalcolare al volo, oppure avere un paio di scenari predeterminati (100% tempo, 100% economico, 50/50/0, 40/40/20, e simili) e mantenere una versione memorizzata nella cache della tabella di ricerca Dijkstra. – corsiKa
A meno che non manchi qualcosa, questo non funzionerà. Dijkstra è ottimo per un grafico "statico" con solo il dominio dello spazio, ma questo ha un dominio del tempo. Ad esempio, se si arriva a un nodo da un bus che impiega 1 minuto, i bordi su di esso saranno diversi rispetto a quando ci sono voluti 5 minuti. Potresti perdere un autobus in modo che i pesi diventino più grandi perché devi aspettare. Inoltre, alcuni bordi potrebbero scomparire se si arriva a un nodo in un certo modo (mancato ultimo bus del giorno) ma essere lì se ci si arriva in un altro modo. AFAIK, Dijkstra non lo consente, ma per favore correggimi se sbaglio. – lacop
@albwq: l'algoritmo di Dijkstra non gestisce con 'waiting' nei vertici per il prossimo bus, hai ragione su questo. Tuttavia, è valido per gli altri due criteri che hai richiesto: costo e numero di transizioni. [vedi la mia ultima sezione sull'ottimizzazione del numero di transizioni]. – amit