Показать сообщение отдельно
Старый 24.09.2010, 01:43   #11
TRam_
Матёрый пользователь
 
Аватар для TRam_
 
Регистрация: 18.02.2008
Сообщений: 8,754
Вы сказали Спасибо: 1,426
Поблагодарили 2,403 раз(а) в 1,352 сообщениях
TRam_ стоит на развилке (репутация по умолчанию)
По умолчанию

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

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

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

Вроде так...


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

Последний раз редактировалось TRam_; 24.09.2010 в 01:57.
TRam_ вне форума   Ответить с цитированием
Старый 01.01.2007, 12:00  
Яndex
Спонсор
 
 
Регистрация: 01.01.2007
Сообщения: 500


Реклама показывается изредка по случайному принципу
По умолчанию РЕКЛАМА