Я принимал участие в разработке одной системы планирования поездок для общественного транспорта Стокгольма в Швеции. Он был основан на алгоритме Джикстры, но с завершением, прежде чем каждый узел был посещен в системе. Сегодня, когда есть надежные координаты, доступные для каждой остановки, я думаю, что алгоритм A * будет выбором.
Данные о предстоящем трафике регулярно извлекались из нескольких баз данных и компилировались в большие таблицы, загружаемые в память нашего кластера поисковых серверов.
Одним из ключей к успешному алгоритму было использование функции стоимости пути, основанной на времени в пути и времени ожидания, умноженном на различные веса. Это время называется по-шведски «kresu». Эти взвешенные времена отражают тот факт, что, например, время ожидания в одну минуту обычно «неудобно» эквивалентно двум минутам времени в пути.
Таблица веса KRESU
- x1 - Время в пути
- x2 - Прогулка между остановками
- x2 - Ожидание на остановке
во время поездки. Останавливается под крышей,
с магазинами и т.д. можно получить немного
меньший вес и многолюдные станции
выше, чтобы настроить алгоритм.
- Вес для времени ожидания на первой остановке зависит от интенсивности движения и может составлять от 0,5 до 3.
Структура данных
Область
Именованная область, где вы можете начать или закончить путешествие. Автобусная остановка может быть областью с двумя остановками. Большая станция с несколькими платформами может быть одной зоной с одной остановкой для каждой платформы.
Данные: Имя, Остановки в области
Останавливает
Массив со всеми автобусными остановками, железнодорожными и подземными станциями. Обратите внимание, что вам обычно требуется две остановки, по одной для каждого направления, потому что для перехода через улицу или перехода на другую платформу требуется некоторое время.
Данные: имя, ссылки, узлы
Ссылки
Список с другими остановками, вы можете добраться пешком от этой остановки.
Данные: Другая остановка, Время идти к другой остановке
Линии / Туры
У вас есть номер в автобусе и пункт назначения. Автобус начинается с одной остановки и проходит несколько остановок по пути к месту назначения.
Данные: номер, имя, место назначения
Вершина
Обычно у вас есть расписание с наименьшим временем, когда оно должно быть на первой и последней остановке в Туре. Каждый раз, когда автобус / поезд проходит остановку, вы добавляете новый узел в массив. Эта таблица может иметь миллионы значений в день.
Данные: линия / тур, остановка, время прибытия, время отправления, допустимая погрешность, следующий узел в туре
Поиск
Массив того же размера, что и массив узлов, используемый для хранения информации о том, как вы туда попали, и стоимости пути.
Данные: обратная ссылка с предыдущим узлом (не устанавливается, если узел не посещен), стоимость пути (бесконечно для не посещенных)