Volevo solo condividere il mio approccio finale su questo problema. Questo faceva parte di un progetto universitario, quindi potrebbe non essere completamente adatto all'uso nel mondo reale. Doveva essere ragionevolmente veloce per essere eseguito su un dispositivo Windows Mobile.
Ho finito per utilizzare 4 tabelle (SQLite). Una tabella mantiene la lista degli autobus, la seconda mantiene una lista di stazioni. Un'altra tabella mantiene le combinazioni: quale bus si ferma su una stazione specifica e da dove va questa stazione e per quanto tempo (minuti) impiega. Tutte le combinazioni devono essere memorizzate. E l'ultimo tavolo è un semplice orario.Per ogni stazione elenca ogni bus che si ferma lì e il tempo (ho memorizzato il tempo come valore intero - 14:34 è 1434, per renderlo più veloce per il confronto).
Ho usato un algoritmo di ricerca bidirezionale di larghezza prima. Le stazioni vicine (direttamente accessibili) vengono recuperate per la stazione di partenza e la stazione di destinazione. C'è un percorso dalla stazione A alla stazione X se questi due "grafici" si sovrappongono su una stazione. Ad esempio, dalla stazione A è possibile raggiungere le stazioni B, C, D, E (utilizzando bus specifici). E dalla stazione di destinazione X puoi arrivare direttamente a N, C, Z. Questi due grafici si sovrappongono alla stazione C. Quindi esiste un percorso A -> C -> X. Se non vengono trovati percorsi in questa prima iterazione, l'algoritmo continua e distribuisce nuovamente i grafici (BFS).
Il tempo non viene preso in considerazione nel primo passaggio: ciò lo rende abbastanza veloce. Viene visualizzato solo un elenco di percorsi possibili con un elenco di bus che è necessario utilizzare per percorrere questi percorsi. I tempi vengono valutati nell'ultimo passaggio, si passa attraverso l'elenco dei possibili percorsi e si controlla se il bus viaggia nel tempo specifico (aumentando il tempo ogni fermata).
In una piccola città, con 250 stazioni e oltre 100 autobus/ferrovie, questo approccio consente di eseguire fino a 3 modifiche (in cui è necessario modificare gli autobus durante il viaggio). Ci vogliono solo pochi secondi per calcolare. Ma ho dovuto caricare l'intero database in memoria (Dizionario) per velocizzare le query, che richiedevano troppo tempo.
Non credo che ciò funzionerebbe per una grande rete. Ma funziona per un trasporto pubblico di una singola città di piccole-medie dimensioni.
fonte
2011-06-01 13:15:39
[OSRM] (http://project-osrm.org/) è un motore di routing open source per i percorsi più brevi basati in C++. Potresti trovarlo utile –