powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Хранить и анализировать маршрут на графе
21 сообщений из 21, страница 1 из 1
Хранить и анализировать маршрут на графе
    #34381890
Yuri_Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, уважаемые гуру!

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

Необходимо хранить маршруты кораблей в акватории порта. Возможные маршруты имеют вид графа. Вершины графа обозначены B1, B2...

Соответственно, есть некая таблица Routes. Задумался, как лучше хранить маршрут - в виде ребер (т.е. создать связь с таблицей GraphRibs, где храняться все связанные пары B1B2, B1B5 etc), т.е. маршрут выглядит как совокупность ребер в соответствии со всеменем прохождения (навигации, это ж корабли :) ) по участку маршрута, либо хранить в виде вершин, сохраняя время прибытия в каждую вершину.

А интересует меня применительно к такой прблеме - на участке маршруте одновременно не может находится более 2 кораблей, т.е. необходимо добавить триггер на вставку. Какие условия - пока точно не представляю. Как _правильнее_ спроектировать эти таблицы, чтобы максимально упростить логику?
Сорри за сумбурность, точнее сформулировать не получилось :)
...
Рейтинг: 0 / 0
Хранить и анализировать маршрут на графе
    #34381892
Yuri_Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, забыл добавить - среда разработки MySQL5, менять нельзя.
...
Рейтинг: 0 / 0
Хранить и анализировать маршрут на графе
    #34382070
Фотография BULK INSERT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yuri_ChДа, забыл добавить - среда разработки MySQL5, менять нельзя.

да какая разница-то :) среда разработки то тут причем (если оэто реляционная БД, конечно)

замечание в строну:

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

в одном случае дороги - это то где можно проехать, но в акватории проплыть можно везде (по идее)

например если между пунктами А и Б прямой дороги нет - попасть из одного в другой можно будет только через пункты Г-Д-Е... а в акватории, полагаю, можно проплыть из любого пункта в любой, за исключением очевидно бессмысленных - из А в А или из Б в Б или может быть запрещенных

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

Код: plaintext
1.
SELECT T1.CheckPoint AS P1, T2.CheckPoint AS P2, P1<>P2 AS Constraint
FROM CheckPoints AS T1, CheckPoints AS T2

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

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

от такая вот петрушка - занятная задачка
...
Рейтинг: 0 / 0
Хранить и анализировать маршрут на графе
    #34384480
ModelR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прежде всего нужно исключить одновременное изменение маршрутов в окрестности какой-либо точки параллельными сессиями. Т.е если сессия намерена добавить точки Б1..Бn между А и В, то она сначала пытается получить А,Б1,..,Бn ,В в монопольное пользование. Затем уже триггером проверяется отсутвия дублирования отрезков.
Представления маршрута точками (не дугами) вполне дстаточно, перечисление дуг даст простой запрос.
...
Рейтинг: 0 / 0
Хранить и анализировать маршрут на графе
    #34384861
Фотография BULK INSERT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
позвольте уточнить 8) что ты вы тут такое завернули - не разобраться без бутылки

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

что имеется в виду, можете пояснить - имеется в виду, и что прежде всего исключить?

чтобы одно судно не пошло по двум маршрутам А-Б и А-Г например
или чтобы не пошло по одному маршруту в две стороны сразу А-Б и Б-А (и туда и обратно)

вообще сессия это что такое - движение некоторого судна в акватории из А в Б?
параллельная сессия - одновременное движение судна в разных направлениях?
что такое маршрут
что такое изменение маршрута

(в контексте меседжа)

ModelRТ.е если сессия намерена добавить точки Б1..Бn между А и В, то она сначала пытается получить А,Б1,..,Бn ,В в монопольное пользование. Затем уже триггером проверяется отсутвия дублирования отрезков

какая сессия? что намерена добавить? что определяет разницу между точками Б1 <> Бn?
я совсем вас не понял, простите... мы можем вернуться к нашим (? почему нашим ?) баранам?

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

или вы что-то еще более экзотическое хотите предложить? :)

ModelRПредставления маршрута точками (не дугами) вполне дстаточно, перечисление дуг даст простой запрос.

само собой разумеется. для перечисленного множества вершин вида:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CheckPoint

Приветинское		
Морской прибой		
Тесовый берег		
Репино		
Дюны		
"Парк ""Дубки"""		
Александровская	
 7 -й Северный		
 1 -й Северный		
Риф

запрос вида:

Код: plaintext
1.
2.
SELECT t1.CheckPoint AS p1, t2.CheckPoint AS p2
FROM CheckPoints AS t1, CheckPoints AS t2
WHERE t1.CheckPoint<>t2.CheckPoint;

вернет все возможные дуги (туда и обратно) - т.е. опишет орграф (двунаправленый граф)

<p2=p1 можно исключить>

т.е. каждой их 11 вершин прилегают все оставшиеся 10
...
Рейтинг: 0 / 0
Хранить и анализировать маршрут на графе
    #34384873
Yuri_Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за участие

Уточню задачу:
- граф не сильно связный, из любой точки нельзя попасть в любую
- составлять маршрут полностью необходимости нет, т.е. в промежуточных вершинах есть возможность выбора, если один из возможных маршрутов занят.
- Есть маршруты, которые могут стать доступны/недоступны в какой-то момент (подводные работы), есть которые недоступны всегда (отмель между точками)

В результате пришел к следующей структуре (фрагмент базы):
Таблица Routes (маршрут судна по прибытии или отплытии)
RouteID
SailID (ссылка на таблицу, описывающую факт прибытия или отплытия - описывает судно, дату прибытия/отплытия, обслуживающий буксировочный катер и т.п.)
StartPointID (точка в которой находимся на момент принятия решения о дальнейшем маршруте)
StartPointTime(время прибытия в эту точку)
NextPointID (точка к которой планируем двигаться - если кто-то движется навстречу, срабатывает триггер)

Таблица Straight - описывает возможные маршруты
StraightID
StartPointID
EndPointID
IsAvailable
Distance

Думаю, таблица Straight не будет избыточна, т.к. описывает связность узлов.
Т.е. в ней дуга A1-A2 == A2-A1
Если сделать в ней встречные маршруты уникальными(A1-A2 != A2-A1), можно изменить таблицу Routes следующим образом:
RouteID
SailID
StraightID (маршрут по которому планируем двигаться, триггер по конечной точке)
StartPointTime(время прибытия в стартовую точку маршрута)

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

В правильную сторону я рассуждаю?
...
Рейтинг: 0 / 0
Хранить и анализировать маршрут на графе
    #34385027
Фотография BULK INSERT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yuri_Ch
Уточню задачу:
- граф не сильно связный, из любой точки нельзя попасть в любую
Код: plaintext
не сильно связный это сильно сказано... иимхо если нет точек в которые вообще нельзя попасть, то граф связный
- составлять маршрут полностью необходимости нет, т.е. в промежуточных вершинах есть возможность выбора, если один из возможных маршрутов занят.
Код: plaintext
т.е. полный маршрут (завершенный) описывается двумя вершинами соединенными одной дугой - весь путь это последовательная совокупность таких завершенных маршрутов
- Есть маршруты, которые могут стать доступны/недоступны в какой-то момент (подводные работы), есть которые недоступны всегда (отмель между точками)
Код: plaintext
т.е. все возможные маршруты должны быть описаны, но некоторые невозможны для прохождения (либо всегда либо периодически либо никогда) в максиме любой из маршрутов бывает/может быть недоступен.
В результате пришел к следующей структуре (фрагмент базы):
Таблица Routes (маршрут судна по прибытии или отплытии)
Код: plaintext
эта таблица бессмысленна
RouteID
SailID (ссылка на таблицу, описывающую факт прибытия или отплытия - описывает судно, дату прибытия/отплытия, обслуживающий буксировочный катер и т.п.)
Код: plaintext
в этой таблице вы будете описывать все тоже что и в таблице Route то что дальше я даже комментировать не буду - это неверное решение
StartPointID (точка в которой находимся на момент принятия решения о дальнейшем маршруте)
StartPointTime(время прибытия в эту точку)
NextPointID (точка к которой планируем двигаться - если кто-то движется навстречу, срабатывает триггер)
Код: plaintext
какая разница навстречу или нет? по ТЗ 
авторна участке маршруте одновременно не может находится более 2 кораблей
Код: plaintext
какая разница в какую сторону они идут
Таблица Straight - описывает возможные маршруты
StraightID
StartPointID
EndPointID
IsAvailable
Distance
Код: plaintext
1.
2.
еще раз - по идее все возможные маршруты описываются одной таблицей CheckPoints с одним полем CheckPoint и одним запросом по ней. хранить имеет смысл только невозможные маршруты, хотя с учетом того что каждый мапршрут может быть невозможным - нужно еще подумать... 

Вопрос - могут ли существовать маршруты, движение по которым возможно только в одну сторону

Думаю, таблица Straight не будет избыточна, т.к. описывает связность узлов.
Т.е. в ней дуга A1-A2 == A2-A1
Если сделать в ней встречные маршруты уникальными(A1-A2 != A2-A1), можно изменить таблицу Routes следующим образом:
RouteID
SailID
StraightID (маршрут по которому планируем двигаться, триггер по конечной точке)
StartPointTime(время прибытия в стартовую точку маршрута)

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

В правильную сторону я рассуждаю?


дело хозяйское...

если это реальная задача - тогда ой! я в вашей акватории не пловец,
если задачка из методички - к чему "подводные работы" "отмели" и прочие вводные
...
Рейтинг: 0 / 0
Хранить и анализировать маршрут на графе
    #34385175
ModelR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BULK INSERTпозвольте уточнить 8) что ты вы тут такое завернули - не разобраться без бутылки

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

что имеется в виду, можете пояснить - имеется в виду, и что прежде всего исключить?

чтобы одно судно не пошло по двум маршрутам А-Б и А-Г например
или чтобы не пошло по одному маршруту в две стороны сразу А-Б и Б-А (и туда и обратно)

вообще сессия это что такое - движение некоторого судна в акватории из А в Б?
параллельная сессия - одновременное движение судна в разных направлениях?
что такое маршрут
что такое изменение маршрута
(в контексте меседжа)
Я понял, что:
Маршрут судна - перечень точек в порядке их посещения. Точки выбираются как путь в графе непосредственного соседства точек (графа дорог).
Изменение маршрута - добавление/ удаление/ перестановка порядка точек в перечне.
Исключить нужно одновременное нахождение более чем одного судна на одном ребре графа дорог.

Ну а сессия - это сессия СУБД. Предполагается, что задачка многопользовательская.
BULK INSERT ModelRТ.е если сессия намерена добавить точки Б1..Бn между А и В, то она сначала пытается получить А,Б1,..,Бn ,В в монопольное пользование. Затем уже триггером проверяется отсутвия дублирования отрезков

какая сессия? что намерена добавить? что определяет разницу между точками Б1 <> Бn?
я совсем вас не понял, простите... мы можем вернуться к нашим (? почему нашим ?) баранам?

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

или вы что-то еще более экзотическое хотите предложить? :)Как автор уже уточнил, не все точки являются непосредственно соседними. BULK INSERT
ModelRПредставления маршрута точками (не дугами) вполне дстаточно, перечисление дуг даст простой запрос.

само собой разумеется. для перечисленного множества вершин вида:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CheckPoint

Приветинское		
Морской прибой		
Тесовый берег		
Репино		
Дюны		
"Парк ""Дубки"""		
Александровская	
 7 -й Северный		
 1 -й Северный		
Риф

запрос вида:

Код: plaintext
1.
2.
SELECT t1.CheckPoint AS p1, t2.CheckPoint AS p2
FROM CheckPoints AS t1, CheckPoints AS t2
WHERE t1.CheckPoint<>t2.CheckPoint;

вернет все возможные дуги (туда и обратно) - т.е. опишет орграф (двунаправленый граф)

<p2=p1 можно исключить>

т.е. каждой их 11 вершин прилегают все оставшиеся 10Имелось ввиду, если заданы
Точки_маршрута
Номер точки в маршруте (Pos) ИДТочки графа дорог (Point)1Приветинское2Х 3Морской прибой 4X5Тесовый берег
(Наличие точки X вытекает из того , что 3.8+14<>17.5), то запрос

Код: plaintext
1.
2.
select distinct least(m1.point,m2.point), greatest(m1.point,m2.point)
from Точки_маршрута m1, Точки_маршрута m2
where m1.pos=m2.pos- 1 

вернет перечень дуг графа дорог,
ХПриветинскоеХМорской прибой XТесовый берегпо которым проходит маршрут. Как я понял, именно эти перечени дуг не должны пересекаться в разных маршрутах.
...
Рейтинг: 0 / 0
Хранить и анализировать маршрут на графе
    #34385327
Фотография BULK INSERT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ModelR
вернет перечень дуг графа дорог,


по тз вопрос в том, чтобы небыло двух кораблей на любом участке любого маршрута.

т.е. маршрут = участок маршрута = одна дуга
т.е любой маршрут = некая отправная вершина ->- некая прилежащая вершина
т.е. маршрут как перечень точек выглядит как А ->- Б и состоит только из двух точек
...
Рейтинг: 0 / 0
Хранить и анализировать маршрут на графе
    #34386123
ModelR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И в чем тогда задача?
Не, маршрут - список точек. Единственно непонятно, почему некотрые ограничения должны учитываться триггером а не алгоритмом планирования, которым бы решать диспетчер решал задачу сразу для всех кораблей. Ну для учебных целей видимо считается, что капитаны сами пытаются дойти до нужной точки, а диспетчерская база лишь региструет маршруты и пресекает столкновения.
...
Рейтинг: 0 / 0
Хранить и анализировать маршрут на графе
    #34386476
Фотография BULK INSERT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ModelRИ в чем тогда задача?
Не, маршрут - список точек. Единственно непонятно, почему некотрые ограничения должны учитываться триггером а не алгоритмом планирования, которым бы решать диспетчер решал задачу сразу для всех кораблей. Ну для учебных целей видимо считается, что капитаны сами пытаются дойти до нужной точки, а диспетчерская база лишь региструет маршруты и пресекает столкновения.

это-ш курсовик

задача на полный безостовный орграф

ЗЫ

ИМХО предложил бы вообще отказаться от такого толкования понятия маршрут - автор говорит, чито в каждой точке возможен выбор следующей точки - ИМХО это основа задачи - просто обход графа с выбором дуги

ЗЫ

условие задачи выполняется всегда если судов < 2-х
...
Рейтинг: 0 / 0
Хранить и анализировать маршрут на графе
    #34386727
Yuri_Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BULK INSERT
Таблица Routes (маршрут судна по прибытии или отплытии)

эта таблица бессмысленна
RouteID
SailID (ссылка на таблицу, описывающую факт прибытия или отплытия - описывает судно, дату прибытия/отплытия, обслуживающий буксировочный катер и т.п.)

в этой таблице вы будете описывать все тоже что и в таблице Route то что дальше я даже
комментировать не буду - это неверное решение

А можно поподробнее, что именно неверно? По-моему, одна сущность-одна таблица.
В одной таблице хранятся все точки, в другой - маршруты, т.е. пары точек, в третей - информация о связности.
Что тогда вы предлагаете хранить в таблице CheckPoints?

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

Вообще, я опасался, что будут замечания "так не делается". Да, база не обеспечивает реальную функциональность, это просто учебный пример. Она просто фиксирует события, для поддержания логической целостности должны использовтаься триггера, поэтому я и выбрал такую реализацию.
Если моя схема ошибочна, объясните плз в каком месте.
...
Рейтинг: 0 / 0
Хранить и анализировать маршрут на графе
    #34386785
Yuri_Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ModelRИ в чем тогда задача?
Единственно непонятно, почему некотрые ограничения должны учитываться триггером а не алгоритмом планирования, которым бы решать диспетчер решал задачу сразу для всех кораблей. Ну для учебных целей видимо считается, что капитаны сами пытаются дойти до нужной точки, а диспетчерская база лишь региструет маршруты и пресекает столкновения.

Можно поподробнее? Под алгоритмом планирования вы подразумеваете резервирование возможного маршрута полностью, исходя из его доступности в определенный момент времени?
Вообще, такая задача не ставилась, но это может быть интересно. Надеюсь, препод не будет возражать против небольшой корректировки ТЗ. :)
...
Рейтинг: 0 / 0
Хранить и анализировать маршрут на графе
    #34386819
Фотография BULK INSERT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yuri_ChНадеюсь, препод не будет возражать против небольшой корректировки ТЗ. :)

зачем ему это может понадобиться?


сделайте рабочую имитационную модель акватории и запустите по таймеру...

задача типа: какой алгоритм обеспечит большее суммарное время нахождения как можно большего количества судов в плавании (на маршруте)

но у вас-то так вопрос не стоит :) вам нужно просто набросать схему БД для хранения данных :)
...
Рейтинг: 0 / 0
Хранить и анализировать маршрут на графе
    #34386853
Yuri_Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
зачем ему это может понадобиться?


сделайте рабочую имитационную модель акватории и запустите по таймеру...

задача типа: какой алгоритм обеспечит большее суммарное время нахождения как можно большего количества судов в плавании (на маршруте)

но у вас-то так вопрос не стоит :) вам нужно просто набросать схему БД для хранения данных :)[/quot]

Да ему-то в принципе все равно, это мне хочется сдлать *правильнее*. :)
Кстати, повторю вопрос - если не сложно, обсясните что не так со схемой таблиц Routes и Points. Как сделать лучше (в текущем контексте - база "только для хранения")
...
Рейтинг: 0 / 0
Хранить и анализировать маршрут на графе
    #34386859
Фотография BULK INSERT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yuri_ChВообще, я опасался, что будут замечания "так не делается".

да, действительно, "так не делается".

начинать нужно с формализации задачи, выяснения недостающих сведений и устранения противоречий

а вы бросились схему БД проектировать, ничтоже сумняшеся...
...
Рейтинг: 0 / 0
Хранить и анализировать маршрут на графе
    #34386884
Yuri_Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BULK INSERT Yuri_ChВообще, я опасался, что будут замечания "так не делается".

да, действительно, "так не делается".

начинать нужно с формализации задачи, выяснения недостающих сведений и устранения противоречий

а вы бросились схему БД проектировать, ничтоже сумняшеся...

ок
...
Рейтинг: 0 / 0
Хранить и анализировать маршрут на графе
    #34386888
Yuri_Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BULK INSERT Yuri_ChВообще, я опасался, что будут замечания "так не делается".

да, действительно, "так не делается".

начинать нужно с формализации задачи, выяснения недостающих сведений и устранения противоречий

а вы бросились схему БД проектировать, ничтоже сумняшеся...

ок, начну с уточнения задачи
...
Рейтинг: 0 / 0
Хранить и анализировать маршрут на графе
    #34387200
ModelR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yuri_ChМожно поподробнее? Под алгоритмом планирования вы подразумеваете резервирование возможного маршрута полностью, исходя из его доступности в определенный момент времени?
Вообще, такая задача не ставилась, но это может быть интересно. Надеюсь, препод не будет возражать против небольшой корректировки ТЗ. :)Алгоритм, который в качестве исходных данных имеет N кораблей, граф дорог, для каждого корабля начальную и целевую точки и в результате выдает маршрут и график движения всех кораблей. Только вряд ли это можно считать небольшой корректировкой. В общем случае задачка вычислительно трудная - кобинаторика же. Снизить комбинаторную сложность могут какие-то приоритеты, правила, чем больше тем лучше.
...
Рейтинг: 0 / 0
Хранить и анализировать маршрут на графе
    #34387469
Фотография BULK INSERT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ModelRТолько вряд ли это можно считать.

для построения графиков движения орграф должен быть взвешенным... должны быть тарированны расстояния между вершинами в графе и известна скорость кораблей.
...
Рейтинг: 0 / 0
Хранить и анализировать маршрут на графе
    #34387496
ModelR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Конечно.
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Хранить и анализировать маршрут на графе
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]