Планирование маршрута в приложении общественного транспорта

Я делаю планировщик поездок (или приложение общего расписания) для всех видов общественного транспорта в моей стране (автобус / поезд / воздух).

Состояние проекта находится на промежуточном этапе, теперь мне немного сложно выполнить более сложную часть приложения.

Чтобы описать текущий статус:

  • Данные хранятся в базе данных MySQL, смоделированной как GTFS (General (Google) Transit Feed Specification).

  • Я получаю прямые маршруты, просто запрашивая базу данных (объединение двух временных таблиц, я считаю это достаточно эффективным)

  • В настоящее время это сделано на PHP, но при необходимости я могу переработать его на Java.

Итак, когда есть прямая связь между двумя точками, все в порядке. Сложнее всего совершить путешествие, когда нет прямых линий.

Допустим, пользователь хочет отправиться из city A в city D, но поскольку между этими городами нет прямых линий, ему нужно проехать через city B и city C.

Как я могу получить оптимизированные маршруты и трансферы в этой ситуации?

Мои идеи пока что тяготеют к использованию графика, но в этом случае мне нужен Зависящий от времени направленный взвешенный мультиграф, и я действительно не знаю в данный момент, как реализовать Time- Зависимая часть.

Получить только маршрут можно с помощью алгоритмов Dijkstra, A* или Floyd–Warshall, но поскольку вылеты бывают в разное время, я не уверен, как это будет реализовано, чтобы получить оптимальное решение. Мне нужно учитывать продолжительность сегмента (от A до B, от B до C), время ожидания передачи, возможно, расстояние тоже.

Чтобы уточнить, мне не нужен ни один результат. Я хочу получать ежедневный список всех отправлений из city A, которые могут привести пользователя к city D, с пересадками, если это необходимо.

По сути, я пытаюсь получить что-то вроде этого (взято с Болгарских железных дорог или, если уж на то пошло, с любого другого железнодорожного узла), список всех отправлений за выбранный день с Sofia на Kystendil с пересадкой в ​​Radomir при необходимости:

Пример результата

Что касается части решения графа, я могу создать приложение на Java, используя jGraphT, кэшировать результаты (они меняются один раз в несколько месяцев, может быть), и использовать их в PHP (или вызывать приложение через PHP).

Если я не совсем ясен, спросите, пожалуйста.

Я знаю, что это делается так много раз (решения есть почти на любом веб-сайте поездов), но я не знаю, по каким терминам даже искать.

Итак, мой вопрос: может ли кто-нибудь дать мне совет, как решить эту проблему?

Или, по крайней мере, по каким терминам мне искать идеи и как это делать.

Может быть, какие-нибудь предложения для других сайтов в сети StackExchange.

Спасибо.


person ekstrakt    schedule 09.07.2013    source источник
comment
Загляните в OpenTripPlanner   -  person Karussell    schedule 09.07.2013
comment
Возможный дубликат.   -  person Bernhard Barker    schedule 09.07.2013
comment
Я не хочу возрождать этот, так как его и так много дублировали. В PHP вы, скорее всего, обречены. Вот мой подробный ответ.   -  person dube    schedule 27.03.2015