2011-11-18 2 views
4

[Не: е пользователь запрашивает это снова Development of railway enquiry system, how to model Trains, Stations and Stops?] Моя проблема Описание:Как сделать простой поисковый механизм маршрута автобуса?

Пусть у меня есть BUS-123 в ROUTE-1 он будет проходить через A, B, C, D, E, F, G, H и BUS-321 в ROUTE-2 через D, E, F, X, Y, Z. , если кто-то входит в B как источник, а F в качестве точки назначения, тогда ROUTE-1 с BUS-123 должен отобразиться в результате. Но если кто-то вводит H в качестве источника, а A в качестве результата назначения не должен отображаться, потому что возвращение может не всегда совпадать с тем, которое было отправлено. Но если человек входит в качестве источника и Z в качестве места назначения, то BUS-123 с ROUTE-1 и БУС-321 с ROUTE-2 следует отобразить.

Моя проблема: Как сохранить информацию о маршруте в базе данных? если я храню в СУБД, как показано ниже:

BUS_NUMBER ROUTE_NUMBER VIA_ROUTES 
BUS-123  ROUTE-1   A, B, C, D, E, F, G, H 
BUS-321  ROUTE-2   D, E, F, X, Y, Z 

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

+1

Я не думаю, что есть «простой» ответ. –

+4

Разве вы не должны делать домашнее задание самостоятельно? – troelskn

+1

Это не моя домашняя работа. – san

ответ

4

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

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

Тогда Сво дело обхода графа и нахождения «наименьшей стоимости» маршрут, однако вы решили определить «наименьших затратах» - факторы, которые вы могли бы хотеть рассмотреть будет включать в себя:

  • время Всего пройдено
  • Общее время, проведенное в ожидании следующего отступления.
  • Время ожидания при любой отдельной остановке.
  • Расстояние?

Следует отметить, что слишком много времени ожидания плохо (когда-либо тратите 40 минут на ожидание автобуса в январе, когда оно составляет -10 F?). Слишком мало также плохо, так как это увеличивает вероятность отсутствия соединения, учитывая, что шины, как правило, имеют довольно большую изменчивость в своих графиках, поскольку они очень чувствительны к колебаниям в условиях локального трафика.

Так я и сделал бы это.

Я не верю, что попытаюсь решить проблему непосредственно в SQL.

Модель хорошо подходит для SQL. Вам нужны следующие объекты, а затем некоторые, поскольку вам нужно будет представлять графики и т. Д .:

  • Остановить. Автобусная остановка. Вершины графа.
  • Маршрут. Автобусный маршрут.
  • Сегмент. Прямая связь между двумя остановками. Ребра графа.
  • RouteSegment. Ассоциативный объект, представляющий упорядоченную последовательность сегментов, составляющую маршрут.
+0

Вы предпочитаете DFS через диджестру? Какого рода обход графика вы имеете в виду? – Bytemain

+0

спасибо за предложение, я внимательно его прочитал, и я настроюсь на текущую таблицу. Ваше предложение приятно, когда я рассматривал с очень небольшим количеством сущностей. Приветствую вас. – san

+0

+1 для упоминания стоимости поездки.Я бы предпочел взять одно путешествие, которое занимает 30 минут, даже если два конкатенированных маршрута заняли 25 минут, особенно если холодно снаружи :) – halfer

0

Я думаю, что bus_numbers не важны, потому что вы можете посмотреть их позже. Возможно, вам нужно создать 2d-матрицу с bus_stops в большой матрице, имеющей их все, а затем использовать алгоритм перемещения графа, такой как dijkstra, чтобы найти кратчайший путь от A до B. Когда вы получили это, вы можете легко найти bus_numbers и покажите их клиенту. Таким образом, я думаю, что ваша база данных уже очень хороша.

+0

спасибо за быстрый ответ, да, ваш ответ весьма полезен, я постараюсь найти решение с матрицей 2d и dijkstra. – san

0

У меня был бы стол route и стол route_part. Последний будет содержать ссылку на маршрут плюс порядковый номер для сортировки и ссылку на таблицу stop. Таким образом, вы можете сохранить любой маршрут.

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

+0

Ищете тот же маршрут не так, как вычислить кратчайший путь. – Bytemain

+0

Большое спасибо за предложение ... – san

+0

@ user1054582 - нет проблем. Я не заметил ваше требование, однако, чтобы связать маршруты вместе, так как в ответ Дэвида будет необходим алгоритм сетевого обхода. – halfer

Смежные вопросы