Просто хотел поделиться своим окончательным подходом к решению этой проблемы. Это было частью университетского проекта, поэтому он не может быть полностью подходящим для использования в реальном мире. Он должен был быть достаточно быстрым для работы на устройстве Windows Mobile.
В итоге я использовал 4 таблицы (SQLite). В одной таблице хранится список автобусов, второй - список станций. В другой таблице хранятся комбинации - какая шина останавливается на конкретной станции и откуда она идет с этой станции и сколько времени (минут) требуется. Все комбинации должны быть сохранены. А последняя таблица - простой график.Для каждой станции он перечисляет каждую оставшуюся там шину и время (я сохранил время как целое значение - 14:34 - 1434, чтобы ускорить сравнение).
Я использовал двунаправленный алгоритм поиска по ширине. Соседние станции (непосредственно доступные) извлекаются для начальной станции и станции назначения. Существует путь от станции A до станции X, если эти два «графика» перекрываются на станции. Например, со станции А вы можете добраться до станций B, C, D, E (используя специальные шины). И с станции назначения X вы можете напрямую перейти на N, C, Z. Эти два графика перекрываются на станции C. Таким образом, существует путь A -> C -> X. Если в этой первой итерации не найдены пути, алгоритм продолжается и снова выводит графики (BFS).
Время не учитывается на первом шаге - это делает его достаточно быстрым. Вы получаете только список возможных путей со списком автобусов, которые вы должны использовать для этих путей. Время оценивается на последнем шаге, вы просматриваете список возможных путей и проверяете, путешествует ли автобус в течение определенного времени (увеличивая время каждой остановки).
В небольшом городе с 250 станциями и более 100 автобусами/железными дорогами этот подход работает до 3-х изменений (где вам нужно сменить автобусы в пути). Для вычисления требуется всего несколько секунд. Но мне пришлось загрузить всю базу данных в память (Словарь), чтобы ускорить запросы, которые занимали слишком много времени.
Я не думаю, что это будет работать для большой сети. Но он работает на общественном транспорте одного маленького города среднего размера.
[OSRM] (http://project-osrm.org/) - механизм маршрутизации с открытым исходным кодом для кратчайших путей, основанных на C++. Вы можете найти это полезным. –