Алгоритм общественного транспорта - PullRequest
19 голосов
/ 02 сентября 2010

Я работаю над автономным приложением C #, которое может найти автобусные маршруты.Я могу извлечь расписание / автобус / данные маршрута.Я ищу самое простое решение, которое будет работать с основными данными.

Какой алгоритм можно использовать для поиска маршрута от автобусной остановки "A" до автобусной остановки "B"?Есть ли готовое решение с открытым исходным кодом для C # / Java?Является ли формат google GTFS для базы данных хорошим решением?http://code.google.com/transit/spec/transit_feed_specification.html

Спасибо за любую помощь.Я застрял с этим.Я не знаю с чего начать - как хранить данные и как находить маршруты.Я знаю о Dijkstra / A *, но я использовал их только на графиках, которые не зависели от времени ...

Ответы [ 7 ]

10 голосов
/ 02 сентября 2010

Проблема, над которой вы работаете, не является тривиальной задачей.Это так называется: смешанная целочисленная задача нелинейного программирования (MINLP).По словам одного автора (Deb 1998):

"При математической формулировке задача планирования времени становится смешанной целочисленной задачей нелинейного программирования (MINLP), имеющей большое количество ресурсов и услуг, связанных сограничения. Хотя в прошлом предпринимались попытки найти оптимальный график упрощенной модели с использованием классических методов оптимизации (Bookbinder & DCsilets, 1992; Kikuchi & Parameswaran, 1993), отмечается, что это чрезвычайно трудная задача даже длямалая транзитная сеть. Трудность возникает главным образом из-за большого числа переменных и ограничений, дискретного характера переменных и нелинейностей, связанных с целевой функцией и ограничениями. "

В статье Деба он предлагаетгенетический алгоритм.

Другой вариант - использовать симуляцию.Просто чтобы что-то добавить туда, вы можете попробовать прямо сейчас - выберите тысячи случайных маршрутов, которые начинаются у вашего источника, и найдите те, которые достаточно хорошо работают, чтобы добраться до пункта назначения.

Представьте алгоритм, подобный этому: Вы пытаетесь найти самый быстрый маршрут от остановки A до остановки B, начиная с определенного времени.Вы нанимаете 1000 человек и вооружаете их четвертью, чтобы перевернуть.Вы говорите им подбрасывать монету каждый раз, когда у них есть возможность сесть или сесть на автобус.Головы, сойти (или встать, если уже выключен).Хвосты, оставайтесь на (или продолжайте ждать, если выключен).Каждый из них имеет учетную карточку, чтобы записать выбор, который они делают, когда они идут.Вы идете в пункт B и ждете, пока первый парень не появится и возьмет его карту.

6 голосов
/ 08 ноября 2010

читать это:

Мультимодальное планирование маршрута. Магистерская диссертация, Университет Карлсруэ (TH), Fakultät für Informatik, 2009. онлайн доступен на http://i11www.ira.uka.de/extra/publications/p-mmrp-09.pdf

раздел о железнодорожных маршрутах также применяется для маршрутизации автобусов.

Суть этого: наивный подход расширения пространства и времени в единый граф не работает для больших сетей. Есть более разумные решения.

4 голосов
/ 07 сентября 2014

Существует обширный список публикаций (30+) по алгоритмам маршрутизации общественного транспорта, который был составлен со временем участниками проекта с открытым исходным кодом (Java) Проект OpenTripPlanner здесь:

https://github.com/opentripplanner/OpenTripPlanner/wiki/RoutingBibliography

OpenTripPlanner - это мультимодальный механизм маршрутизации, который также включает в себя велосипед и прогулку - по вышеуказанной ссылке:

Это список статей, диссертаций и книг, которыевдохновили и сообщили как существующий механизм маршрутизации OTP, так и некоторые текущие эксперименты.В настоящее время OpenTripPlanner использует один зависимый от времени (в отличие от расширенного по времени) график, который содержит как уличные, так и транзитные сети.Поездки только на прогулку и на велосипед, как правило, планируются с использованием алгоритма A * с евклидовой эвристической или сжатой иерархиями.Прогулки «Прогулка + Транзит» или «Велосипед + Транзит» планируются с использованием варианта алгоритма MOA * с эпсилон-доминированием для сокращения пути и эвристики Тунг-Чу (график, показывающий нижнюю границу для совокупного веса) для упорядочения очереди.

Приведенная выше библиография маршрутизации включает ссылки на следующие категории алгоритмов и связанную с ними работу:

  • Методы ускорения поиска пути
  • Многоцелевые кратчайшие пути Парето
  • Маршрутизация с ограниченными ресурсами
  • Шаблоны сокращения и передачи
  • Маршрутизация на основе расписания
  • ALT и метрические вложения
  • Детали калибровки и реализации
  • Post-Dijkstra Public Transit Routing

Если вы найдете что-то новое, которого нет в списке, пожалуйста, не стесняйтесь добавлять его в вики!

Что касается других открытыхисходные библиотеки маршрутизации общественного транспорта - существует также проект RRRR, разработанный Bliksem Labs:

https://github.com/bliksemlabs/rrrr

Из вышеизложенногоink:

RRRR (обычно произносится как R4) - это реализация на языке C алгоритма маршрутизации общественного транспорта RAPTOR.Это основной компонент маршрутизации системы планирования путешествий Bliksem и системы информирования пассажиров.Целью этого проекта является создание наборов оптимальных по Парето маршрутов по большим географическим районам (например, BeNeLux или по всей Европе), улучшая потребление ресурсов и усложняя существующие более гибкие альтернативы.В конечном итоге система должна поддерживать обновления транспортного средства / поездки в реальном времени, отраженные в планах поездок, и иметь возможность запуска непосредственно на мобильном устройстве без подключения к Интернету.

И OpenTripPlanner, и RRRR используют данные GTFS.

3 голосов
/ 01 июня 2011

Просто хотел поделиться своим окончательным подходом к этой проблеме. Это было частью университетского проекта, поэтому он может не полностью подходить для реального использования. Он должен был быть достаточно быстрым для запуска на устройстве с Windows Mobile.

В итоге я использовал 4 таблицы (SQLite). В одной таблице хранится список автобусов, во второй - список станций. Другая таблица содержит комбинации - какой автобус останавливается на определенной станции и куда он идет от этой станции и сколько времени (минут) занимает. Все комбинации должны быть сохранены. И последняя таблица - это простое расписание. Для каждой станции перечисляются все автобусы, которые там останавливаются, и время (я сохранил время как целочисленное значение - 14:34 равно 1434, чтобы сделать его более быстрым для сравнения).

Я использовал двунаправленный алгоритм поиска в ширину. Соседние станции (непосредственно доступные) извлекаются для начальной станции и станции назначения. Существует путь от станции A до станции X, если эти два «графика» перекрываются на станции. Например, от станции A вы можете добраться до станций B, C, D, E (используя специальные автобусы). А от станции назначения X вы можете добраться прямо до N, C, Z. Эти два графика перекрываются на станции C. Таким образом, путь A -> C -> X существует. Если в этой первой итерации пути не найдены, алгоритм продолжает работу и снова раздает графики (BFS).

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

В небольшом городе с 250 станциями и более 100 автобусами / железными дорогами, этот подход работает до 3-х смен (где вы должны менять автобусы в пути). Это займет всего несколько секунд, чтобы рассчитать. Но мне пришлось загружать всю базу данных в память (словарь), чтобы ускорить запросы, которые занимали слишком много времени.

Я не думаю, что это будет работать для большой сети. Но это работает для общественного транспорта одного маленького города среднего размера.

1 голос
/ 02 сентября 2010

Концептуально, вы берете тот же базовый алгоритм для оценки расстояния между A и B, но вместо расстояния вы должны оценивать время. Дейкстра может сделать и то, и другое, если вы дадите ей правильные данные.

Вы привыкли видеть карту как меру расстояния. Тем не менее, та же карта может быть мерой времени; все, что вам нужно, это добавить данные о средней скорости, и время, которое потребуется, чтобы преодолеть определенное расстояние конкретной дороги, потрясет себя. Вы даже можете визуализировать карту с точки зрения времени; маршруты, которые занимают больше времени, будут дольше. Дейкстре все равно, что он оценивает; он просто заботится о том, чтобы найти непрерывный маршрут с наименьшим числом, и то, представляет ли это число длину или время, не имеет значения.

Чтобы включить скорость, наивные алгоритмы просто используют дневное ограничение скорости и предполагают, что вам никогда не придется останавливаться при переходе от А к В; более продвинутые алгоритмы могут включать информацию о времени суток и схемах движения (которые будут влиять на среднюю скорость движения по этой дороге в это время), а также о том, является ли дорога автострадой или наземной улицей (и, таким образом, дают обоснованные предположения о том, сколько времени прошло) на перекрестке). То, что вы используете, зависит от того, что у вас есть, но базовое четырех- или пятислойное измерение времени суток должно быть подходящим для всех приложений, кроме абсолютных, наиболее критичных ко времени. Для каждого направления каждой дороги на вашей карте вам нужна средняя скорость во время утренней лихорадки, дневной, вечерней лихорадки и ночи, возможно, с учетом чисел в обеденное время. Как только вы это сделаете, это сравнительно простое изменение алгоритма Дейкстры, которое передается во время дня и позволяет ему оценивать маршруты на основе времени.

0 голосов
/ 02 сентября 2010

Попробуйте это как модель данных.

Шина 1 идет к остановкам A, B и C. Шина 2 идет к остановкам B, D и E.

Я бы сохранил уникальный узелна основе как автобуса, так и остановки, причем расстояния до узлов основаны на времени.У нас были бы узлы A1, B1, C1, B2, D2 и E2.В особом случае переводов применяется ожидание следующей шины в качестве расстояния между узлами.Например, если автобус 1 прибывает на остановку B за 30 минут до автобуса 2, время в пути от B1 до B2 составляет 30 минут.

Затем вы сможете применить алгоритм Дейкстры.

0 голосов
/ 02 сентября 2010

Если вас интересует информация о времени, то почему бы не обозначить значения расстояний на краях графика, используя информацию о времени, а не их физическое расстояние друг от друга.Таким образом, вы будете искать самый быстрый маршрут, а не самый короткий.Затем вы можете использовать Dijkstra / A * для вычисления вашего результата.

Мне немного неясно, что вы подразумеваете под зависимостью от времени.Если вы имеете в виду, что вам нужно отвечать на запросы в форме «идет от x до y до 10 утра», то вы можете рассчитать, какие автобусные маршруты прибывают до 10 утра, что выглядит как простой фильтр данных.Затем примените Dijkstra / A * к данным.

...