La verità è che molte persone usano una variazione personalizzata dell'algoritmo A * . Lo vedrai nella maggior parte dei "grandi" (non posso dire chi siano in un forum pubblico, ma posso dirti che probabilmente ne usi uno - garantito), dove la modifica dell'euristica è molto dipendente dai set di dati che usano.
Hai già citato il pgrouting , che considererei un'opzione "tradizionale". È utile per eseguire semplici algoritmi di routing e per la maggior parte dei problemi. È anche facile da usare e utilizza un database tradizionale nel suo backend.
Tuttavia, dipende davvero dalla scala e dal tipo di problema che si sta tentando di risolvere e il routing è un problema grafico .
Ancora una volta, i "big guy" di solito hanno molti dati associati al loro grafico (ad esempio dati sul traffico, linee di autobus, percorsi pedonali) che influiscono sull'algoritmo di routing. Questi sono noti come pianificatori di viaggio multimodali (dove è anche possibile scegliere una "modalità" di pianificazione - nessuna pista ciclabile - solo mezzi pubblici - quel tipo di cose). Puoi pensare a come la pianificazione del viaggio diventi anche un problema sensibile al tempo (ad esempio se torni indietro di alcuni bordi indietro, sarai in grado di prendere la metropolitana che ti porta a destinazione in avanti molto più velocemente rispetto a se avessi appena provato a spostarti in avanti utilizzando il costo più basso).
I "big guy" non memorizzano i loro dati in un database tradizionale di per sé, usano grafici precalcolati (benvenuti cluster hadoop / mapreduce!). Come puoi immaginare, questi grafici diventano davvero grandi, quindi sapere come collegare i bordi dei grafici adiacenti può essere una sfida.
Ad ogni modo, ti consiglio di dare un'occhiata ad alcuni progetti di grafici di routing multimodali:
Graphserver mi viene in mente. Non molta documentazione ma tanta bellezza di codifica pura (AFAIK, credo che MapQuest utilizzi una variante di questo progetto per alcuni dei loro prodotti di routing).
Un'altra opzione sarebbe OpenTripPlanner che ha molte persone intelligenti (comprese le persone di Graphserver).