Общественный транспорт на автобусах в городе - PullRequest
8 голосов
/ 22 ноября 2010

Я занимаюсь разработкой сайта Планировщика путешествий.В настоящее время в этом случае есть несколько простых вещей, т. Е. Сейчас веб-сайт сможет планировать только автобусные маршруты, время движения автобусов в настоящее время недоступно.Таким образом, это означает, что у нас есть только автобусные маршруты, сохраненные в БД, и поскольку время в автобусе не доступно, поэтому время ожидания для путешественника также не имеет значения.Доступно время и расстояние, пройденное между двумя остановками для отдельного автобуса.

Я думаю, что было бы лучше использовать неориентированный взвешенный график, хранящий затраты времени и расстояния каждой автобусной остановки для каждого отдельного автобуса.Затем я мог бы использовать алгоритм Дейкстры для вычисления кратчайшего пути между двумя точками, введенными пользователем, на основе времени или расстояния в соответствии с предпочтениями пользователя.Я бы выяснил, требуются ли два или три автобуса с помощью простых функций C #, если автобусные маршруты пересекаются на остановках, а затем используют эти остановки пересечения, чтобы путешественник сменил автобус.Но для каждого автобуса был бы индивидуальный график.Альтернативный (не уверен, что это правильно) способ состоит в том, чтобы использовать график, содержащий каждую автобусную остановку города в качестве узлов, а затем использовать эту технику, чтобы выяснить способ проезда между двумя остановками.Какой правильный подход?Должен ли я использовать алгоритм A * вместо алгоритма Дейкстры?

Несколько общих моментов для дизайна: я хотел бы, чтобы приложение было расширяемым, чтобы я мог добавить другие транспортные средства позже, когда возникнет такая необходимость.Кроме того, время автобусов также может быть добавлено позже, если это возможно, без серьезных изменений на сайте.Я видел немало экспертов, которые работали над очень сложными проектами транспортировки.Поэтому, пожалуйста, помогите мне с наилучшим способом реализации этой функциональности наиболее масштабируемым, модульным и расширяемым способом.

Ответы [ 5 ]

3 голосов
/ 22 ноября 2010

Я запустил подобное приложение прошлым летом и никогда не заканчивал его, но у меня есть несколько советов по этому графику и тому, как структурировать ваши данные.

Мой план состоял в том, чтобы каждая остановка была узлом и путь между каждым из этих узлов каждый раз, когда проходил автобус. Например, если автобус останавливался каждые полчаса в течение 6-часового периода, то между двумя узлами было бы 12 путей. Время было основным фактором, определяющим «стоимость» пути, поэтому обычно выбирается самый быстрый путь.

Перед запуском приложение запросит в базе данных все пути в течение следующих 5 часов (при необходимости измените). Затем он будет работать с алгоритмом Дейкстры.

Другими факторами, влияющими на стоимость, являются фактические денежные затраты на маршрут, трансферы (и их стоимость), остановки без крыш (если у вас плохая погода) и т. Д.

Этот план хорошо сработал для меня. Я живу в районе с 3-мя автобусными системами.

Наконец, вам может быть полезно структурировать ваши данные аналогично спецификации фида Google Transit , так как многие агентства предоставляют данные такого типа, которые вы можете импортировать.

3 голосов
/ 22 ноября 2010

График должен быть направленным - автобусные остановки на противоположных сторонах дорог (даже в такой стране, как Великобритания, где редко встречаются медианы) - это НЕ одна и та же остановка!

0 голосов
/ 12 апреля 2011

Я кодировал такой алгоритм для тестового приложения. У меня был словарь для каждой остановки, как источник и как пункт назначения. Алгоритм был рекурсивным. Каждый шаг рекурсии был таким: учитывая источник и цель, он генерировал бы список маршрутов, идущих в цель, список маршрутов, покидающих источник. Если были какие-то общие остановки, мы были сделаны, мы сообщаем маршрут. Если нет, то я генерирую соседние остановки для источника и рекурсирую. Следующая рекурсия генерирует список соседних остановок для рекуперации. Перед рекурсией я записал предыдущий путь, и в конце у меня был бы список.

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

Я также посмотрел на эту статью:

www.citeulike.org / пользователь / rchauhan / статьи / 819528

Мне интересно, удалось ли вам решить эту проблему по-другому.

0 голосов
/ 23 ноября 2010

Может быть, вы можете использовать работу paddydubs для TransportDublin найдено на github .

0 голосов
/ 22 ноября 2010

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

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

...