Форум Trainsim

Форум Trainsim (http://www.trainsim.ru/forum/index.php)
-   TrainZ - Маршруты и сценарии (http://www.trainsim.ru/forum/forumdisplay.php?f=24)
-   -   Система маршрутизации z7-xPath (Система расчёта поездных маршрутов стрелочная будка) (http://www.trainsim.ru/forum/showthread.php?t=11836)

TRam_ 24.09.2010 01:43

[QUOTE]Хм, "переведи..." (с) "Москва слезам не верит"[/QUOTE]имеется глобальная база данных, в которых стрелка может быть помечена либо как занятая, либо как свободная. Сборка маршрута по идее должна проходить так (заодно и для себя напишу)

1) из базы данных "маршруты светофора N станции Х" создаётся подбаза "маршруты от светофора N до светофора K по станции Х" или "маршруты от светофора N станции Х до светофора K по станции Х2". Сортируется по приоритетам, если таковые были введены.
2) если имеется первый вариант, то:[INDENT]а)если заданный номер маршрута больше, чем маршрутов всего, ждём 15 секунд, затем смотрим маршрут №1, далее в одном потоке (т.е. для виртуальной машины скриптов "линейным алгоритмом") проходит проверка занятости стрелок
б) проверяется следующая стрелка за тем светофором, занята ли она, и если занята, то не направлена ли на нас. Если направлена на нас и занята, увеличиваем номер маршрута на 1, переходим к пункту а)
в) Отсылаем светофору сообщение на предоткрытие. Ждём 0.5 секунды. После ожидания проверяем положения стрелок. Если они были переведены, увеличиваем номер маршрута на 1, переходим к пункту а)
г) Проверяем показание светофора. Если оно красное, убираем метки о занятости ,увеличиваем номер маршрута переходим к пункту а)
[/INDENT]Если второй вариант:[INDENT]а) проверяется направление перегона по тегу во входном светофоре следующей станции
б) если он повёрнут не на нас, посылаем сообщение о переключении перегона. Ждём подтверждения о его переключении, если такового не приходит за 0.4 секунды, ждём 5 минут, и переходим к пункту а)
в) проверяем положение стрелок, если все свободны, вписываем их занятость, ждём 0.5 секунд. Если не свободны, переходим на следующий номер маршрута, и к пункту а)
г) проверяем положение стрелок (если что-то случилось с положением, след. номер, переход к а), если ничего не случилось, переводим стрелки, открываем светофор, ждём 1 секунду
д) если светофор не открывается, убираем метки о занятости, переходим к следующему маршруту
[/INDENT]
далее...

когда стрелка освобождается, метка "занято" у неё снимается, ищутся все построенные маршруты с ней, светофорам, с которых эти маршруты были приготовлены, щлются сигналы о принудительном закрытии.
Если освобождённая стрелка последняя у маршрута, то он убирается из стека.

Вроде так...


[QUOTE]Если в одну сторону на перегон отправляется пакет[/QUOTE]с другого конца карты тоже может отправится другой пакет (причём не выполнено правило о прохождении пакета), то на одной из станций вполне может случиться коллизия.
Если же попытаться расталкивать составы по станциям, рассчитывая им пути на N станций вперёд, то вероятность коллизий в конце концов только увеличивается (из-за уменьшения количества свободных путей). Вывод: для однопутки наилучшее решение "пакет туда-пакет обратно", причём навстречу пакетам продвигаются по 1 поезду на перегон, с долгими ожиданиями. И размеры пакетов вполне можно оптимально рассчитывать. (не зря американцы делают сверхдлинные составы - у них навстречу пакетам почти нет движения)

TRam_ 24.09.2010 02:04

[QUOTE]б) проверяется следующая стрелка за тем светофором, занята ли она, и если занята, то не направлена ли на нас. Если направлена на нас и занята, увеличиваем номер маршрута на 1, переходим к пункту а)[/QUOTE]тут неверно: ждём 5 минут. Ибо коллизия.

[QUOTE]в) Отсылаем светофору сообщение на предоткрытие. [/QUOTE]перед этим переведя стрелки, естественно.

Combine 24.09.2010 10:10

[QUOTE]Too long, don't read[/QUOTE] You, sir, are fucking awesome!

[QUOTE]Давай после. Мне очень понравилась твоя идея с приоритетами, но ты и сам сказал, что их-то три. И ни какие "птички" и "галочки" не помогут в правилах сие изменить.[/QUOTE] Их примерно 4294967296.

[QUOTE]Только вот, упал он (Т6) когда я 10-й поезд запустил...[/QUOTE] Ой не знаю... У меня в метро целая линия в 30км длиной заполнялась выскакивающими из порталов поездами. Следовали с интервалом полторы-две минуты. Количество поездов посчитай сам. :)

[QUOTE]РаннингНамбер можно сделать номером поезда, который будет ключом к таблице данных поезда (мини-вариант системы расписаний) где и указывать нормальный приоритет.[/QUOTE] Поддерживаю. RunningNumber я уже использую для хранения номера поезда в моем концепте "говорящего" ДСП.

По архитектуре: никак будок. Сделай его в виде правила.

NickLon 24.09.2010 13:52

[QUOTE=TRam_;203867]имеется глобальная база данных, в которых стрелка может быть помечена либо как занятая, либо как свободная. Сборка маршрута по идее должна проходить так (заодно и для себя напишу)

1) ...
2) ...
и т.д.
[/QUOTE]
Ой, ё! А зачем так сложно то? Чем сложнее, тем большая вероятность всяких глюков. Не проще ли сделать примерно так.
У светофоров расчитаны маршруты, так? У нас есть всего лишь несколько вариантов поведения:
1) прибытие на станцию, зная на какой путь;
2) прибытие на станцию на путь из группы (нам всё равно куда прибывать, лишь бы грузовым не залезть в пассажирский парк, а пассажирским - в грузовой);
3) отправление со станции;
4) маневры.
По первому случаю. Отыскиваем тот самый маршрут, который соответствует заданному направлению Н - Н1. Проверяем стрелки между этимми светофорами на занятость. Хотя бы одна занята, тогда Н - красный, стоим, курим бамбук до следующей проверки. Все стрелки свободны и открылся светофор (путь не занят другим поездом) - welcome to Н1!
По второму случаю. Хватаем первый маршрут из группы (это должна быть команда такая "собрать маршрут из группы"). Далее то же, что и в первом случае, только бамбук будем курить, когда проверим последний маршрут. Через время опять по кругу.
Третье. С отправлением проще. Там единственный вариант и его проверяем до умопомрачения. Но! Если это однопутка, или идём на неправильный, то тоже, что у тебя во втором варианте по пунктам а), б) и в).
Маневры - это отдельная эпопея там черт ногу может сломать, так что об этом можно как-нить отдельно.
Но! Меня смущают эти 5 минут везде. С одной стороны вроде и не надо бы особо часто ломиться в закрытую дверь, а с другой стороны хвост встречного спустя 5 секунд после проверки прошмыгнул обратный ему выходной (или когда входной проезжает перегон считается свободным?), а мы продолжаем ещё целых 5 минут курить бамбук. Думаю, оптимально будет 1-2 минуты.
P.S. Выражение "курить бамбук" применяю исключительно к железнодорожному транспорту. Ехал как-то на электричке в Саратовской губернии. На станции - остановка. Только остановился, открыл двери и тут по громкой связи:"Стоим, курим бамбук. Минут 20, выходной - закрыт!":D

TRam_ 24.09.2010 14:10

[QUOTE]Все стрелки свободны и открылся светофор (путь не занят другим поездом) - welcome to Н1![/QUOTE]и если хотя бы одна из этих стрелок Х-овая, и по другой её стороне проложен маршрут, то стрелки на нашем маршруте переведутся через 0.5 секунд, и курить бамбук на прийдётся намного больше часа, т.к. фактически маршрут собран (за исключением той стрелки), но светофор "чё-то не открывается". Аналогично с с маркерами пересечений. Вроде и стрелки свободны, ан нет: светофор закрыт и открываться не хочет.

По поводу групп...Ты имеешь в виду "если маршрут на один путь (станции/перегона) не собрался, собираем на другой"? Возникает вопрос: а в следующей команде как мы будем узнавать, с какого пути маршрут отправления/приёма создавать? Или правило "поискать маршрут отправления для поезда ** по станции ***Х " тоже надо?

[QUOTE]Но! Меня смущают эти 5 минут везде. С одной стороны вроде и не надо бы особо часто ломиться в закрытую дверь, а с другой стороны хвост встречного спустя 5 секунд после проверки прошмыгнул обратный ему выходной (или когда входной проезжает перегон считается свободным?)[/QUOTE]можно не через 5 минут, а после очередного освобождения стрелки поездом. Тут без разницы.

NickLon 24.09.2010 17:01

[QUOTE=TRam_;203960]и если хотя бы одна из этих стрелок Х-овая, и по другой её стороне проложен маршрут, то стрелки на нашем маршруте переведутся через 0.5 секунд, и курить бамбук на прийдётся намного больше часа, т.к. фактически маршрут собран (за исключением той стрелки), но светофор "чё-то не открывается". Аналогично с с маркерами пересечений. Вроде и стрелки свободны, ан нет: светофор закрыт и открываться не хочет.
[/QUOTE]
Хм, действительно. А как правило "видит" светофоры? Светофоры видят маркеры. Значит, по идее, и правило может "увидеть" на пути маркер как объект и почитать его состояние, так же, как читаем состояние стрелки. Но тогда на х-овой стрелке обязательно надо ставить х-маркеры. Хотя их вроде всегда нужно ставить, но я пользуюсь Path Control, а там они явно задаются при создании маршрута, вручную.
[QUOTE]
По поводу групп...Ты имеешь в виду "если маршрут на один путь (станции/перегона) не собрался, собираем на другой"? Возникает вопрос: а в следующей команде как мы будем узнавать, с какого пути маршрут отправления/приёма создавать? Или правило "поискать маршрут отправления для поезда ** по станции ***Х " тоже надо?

можно не через 5 минут, а после очередного освобождения стрелки поездом. Тут без разницы.[/QUOTE]
Да, именно это я и имел ввиду. Поискать маршрут отправления для поезда, думаю, не получится, потому как маршруты у светофора, а вот поискать следующий светофор впереди - это, думаю, реально и плясать уже от его маршрутов. Правда, тут маршрутные и маневровые будут путаться под ногами, но для маршрутных всё равно нужно считать маршрут, поскольку часто он выполняет роль фактически выходного, а маневровые отсеиваются исходя из категории поезда. Так получится?
И таким образом реализовать "маршруты от светофора N станции Х до светофора K по станции Х2"

TRam_ 24.09.2010 17:07

[QUOTE]И таким образом реализовать "маршруты от светофора N станции Х до светофора K по станции Х2"[/QUOTE]маршрут отправления строится до входного(или ещё какого-то) следующей станции. Но перегон, естественно, при этом не проверяется, повторюсь, будет проверяться состояние этого светофора на предмет направления перегона (закрытый входной в z7 имеет состояние 0, закрытый входной из-за встречного направления перегона - 1000)


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

Значит, по поводу маркеров... Прийдётся их логику изучать :( .


[QUOTE]Правда, тут маршрутные и маневровые будут путаться под ногами, но для маршрутных всё равно нужно считать маршрут, поскольку часто он выполняет роль фактически выходного, а маневровые отсеиваются исходя из категории поезда. Так получится?[/QUOTE]да, создание маршрутов сделанно именно так. Слово в слово :)

TRam_ 24.09.2010 20:40

Эх, а будку-то в правило превратить не удаётся... Бука умеет аакуратно выделять под себя память, а правило нет (в результате трейнз выбивает в процессе сортировки светофоров и сборки маршрутов уже который раз ). В то же время с правилом удобнее: не надо лазить за окошком за пол карты ...

Видимо прийётся делать и будку, и "правило-паразит" этой будке :(.

NickLon 24.09.2010 20:51

Ну это то всё хорошо. Вроде как с поездными более-менее понятно. TRam, я как-то раньше сказал, что о маневровых - потом. (со вздохом) Давай сейчас это "потом" и откроем. Как ты думаешь маневровые маршруты считать? Посмотри на БМО от Tramwayz. ст. Бекасово. Там же черт ногу сломит! А всё должно работать, тем более, если он делал всё это по ТРА.
TRam, а ты часто Главный контроллер ищешь? На БМО как-то однажды хотел его найти, дабы все светофоры сразу переинициализировать, но так и не нашёл. Ну и? Сигналка там просто пыщет здоровьем! :) Так и здесь. Один раз поставил, настроил - забыл о его существовании. Так что по этому поводу, думаю, заморачиваться не стоит.

TRam_ 24.09.2010 21:02

[QUOTE]Как ты думаешь маневровые маршруты считать? Посмотри на БМО от Tramwayz. ст. Бекасово. Там же черт ногу сломит![/QUOTE]по крайней мере поездные там будка пересчитывала вполне нормально, памяти хватало. Другое дело что там маневровые отнесены к другой станции (станционный контроллёр = станция), так что там думать прийдётся долго и упорно...

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

Combine 24.09.2010 21:22

[QUOTE]Бука умеет аакуратно выделять под себя память, а правило нет (в результате трейнз выбивает в процессе сортировки светофоров и сборки маршрутов уже который раз ).[/QUOTE] Как правило, неправильно выделяет память программист... Я считаю, что правило необходимо.

TRam_ 24.09.2010 21:46

[QUOTE]Как правило, неправильно выделяет память программист...[/QUOTE]ну да, две тысячи светофоров, у каждого из которых есть имя, и есть по 3-10 маршрутов, с запоминанием 5-6 имён стрелок в каждом. Итого около 60 000 строк. Плюс сортированный массив объектов, содержащих ссылки на все стрелки (ибо для быстого поиска Soup не очень выгоден: мы из него можем получать только строки имён, и будем сильно напрягать роутер).

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

CFM 24.09.2010 22:18

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

TRam_ 24.09.2010 22:23

[QUOTE]А если пересчитывать маневровые маршруты не сразу по всей карте, а в пределах только станции?[/QUOTE]у меня все поездные маршруты в пределах каждой станции свои.

Алгоритм составных пока не придумал - надо вначале хоть элементарные сделать.

genesis 24.09.2010 23:09

[QUOTE=TRam_;204092]ну да, две тысячи светофоров, у каждого из которых есть имя, и есть по 3-10 маршрутов, с запоминанием 5-6 имён стрелок в каждом. Итого около 60 000 строк. Плюс сортированный массив объектов, содержащих ссылки на все стрелки (ибо для быстого поиска Soup не очень выгоден: мы из него можем получать только строки имён, и будем сильно напрягать роутер).[/QUOTE]
Чево? Суп — это тип данных, реализованный, скорее всего, на дереве, каким боком к нему относится загрузка роутера?
Что-то памяти многовато требуется.
Если у тебя есть имена всех стрелок, то зачем нужен массив ссылок? Есть же Router.GetObject(string)?


Текущее время: 06:04. Часовой пояс GMT +4.

Powered by vBulletin® Version 3.8.12 by vBS
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
© 2001-2019, Администраторы и разработчики Клуба Trainsim