[Из песочницы] Система управления prt-транспортом
Привет, Хабр.Для начала я хочу сказать каким я вижу prt-транспорт — это гениальное изобретение, позволяющее доехать до станции назначения без остановок на перекрёстках и станциях. Я считаю, что колёса должны быть резиновые, как в Лондонском варианте, как у автомобиля. Но питание должно быть не от аккумуляторов, а от контактного рельса. И кабинки должны быть не 4-местные, а одно- и двухместные (одно за другим), что позволит сделать более узкие пути.
Вот здесь написано, что система управления prt-транспортом бывает синхронной, асинхронной, транс-синхронной, квази-синхронной и Asynchronous Point Follower. Насколько я понял, то, как я вижу prt-транспорт это и есть синхронная система управления. А вижу я так: по путям двигаются строго по расписанию и на заданном расстоянии транспортные средства (ТС) или их отсутствие. Так сказать электроны и дырки, если сравнивать с полупроводниковыми приборами. При посадке пассажир указывает станцию назначения. Центральный компьютер получает эту информацию, вырабатывает путь движения и отправляет его на ТС.Для упрощения программы предположим, что у нас есть три станции A, B и C (см. рисунок).
Имеются также 4 контрольные точки: 2 точки слияния потоков (B2, B4) и 2 развилки (B1, B3). Предположим также, что ТС двигаются со скоростью 60 км/ч, расстояние между носами ТС составляет 8,33 метра (60/3,6/2). Тогда на участках со скоростью 60 км/ч ТС будут проезжать 2 раза в секунду. А на станции ТС двигаются со скоростью 10 км/ч, расстояние между носами ТС — 2,77(60/3,6) метра (ТС будут проезжать 1 раз в секунду).
Попробуем написать программу, определяющую путь. Для изображённой на рисунке системы нам понадобится два массива, по одному массиву для каждой из точек слияния B2 и B4, хранящих информацию о проходящих через них ТС. Размерность массивов будет 7200=60×60*2 (60 минут*60секунд*2раза/секунду). В массиве будет храниться информация о проезжающих через данную точку слияния ТС на близжайший час. Если в массиве для какого-то момента времени хранится 0, то место свободно (это дырка). Если этот момент забронирован каким-то ТС, то можно хранить в массиве номер этого ТС.
Пишу на javascript, но думаю нет проблемы сделать это на C.
B2.length = 7200; B4.length = 7200; // Устанавливаем длину массивов for (i=0; i<7200; i++ ){ B2[i]=0; B4[i]=0; } // и обнуляем
TaktovOtBDoB2 = 20;//Сколько тактов по 0,5 секунды нужно чтобы доехать от стояночного места на станции В до точки слияния B2 TaktovOtADoB2 =200;//Сколько тактов по 0,5 секунды нужно чтобы доехать от стояночного места на станции A до точки слияния B2 TaktovOtBDoB4 = 20;//Сколько тактов по 0,5 секунды нужно чтобы доехать от стояночного места на станции В до точки слияния B4 TaktovOtCDoB4 =200;//Сколько тактов по 0,5 секунды нужно чтобы доехать от стояночного места на станции C до точки слияния B4
//Нужно ввести ещё смещение соответствующее текущему моменту времени TekTakt: //Надо ещё проверять if (startTakt + TekTakt + TaktovOtADoB2 > 7200) то отнять 7200: function nahodim_puti (S1, S2, NTC){//S1-исходная станция, S2-станция назначения, NTC-номер транспортного средства if (S1=='A' && S2=='C'){ // Едем со станции A на станцию С startTakt=0; // Это то, что мы ищем: через сколько тактов стартовать. do{ startTakt++; T = startTakt + TekTakt + TaktovOtADoB2; if (T > 7200) T = T — 7200; }while (B2[T] != 0) // Находим первый нулевой элемент массива (дырку) B2[T] = NTC; } if (S1=='B' && S2=='C'){//Едем со станции В на станцию С startTakt=0; // Это то, что мы ищем: через сколько тактов стартовать. do{ startTakt++; T = startTakt + TekTakt + TaktovOtBDoB2; if (T > 7200) T = T — 7200; }while (B2[T] != 0) // Находим первый нулевой элемент массива (дырку) B2[T] = NTC; } if (S1=='C' && S2=='A'){//Едем со станции C на станцию A startTakt=0; // Это то, что мы ищем: через сколько тактов стартовать. do{ startTakt++; T = startTakt + TekTakt + TaktovOtCDoB4; if (T > 7200) T = T — 7200; }while (B4[T] != 0) // Находим первый нулевой элемент массива (дырку) B4[T] = NTC; } if (S1=='B' && S2=='A'){//Едем со станции В на станцию A startTakt=0; // Это то, что мы ищем: через сколько тактов стартовать. do{ startTakt++; T = startTakt + TekTakt + TaktovOtBDoB4; if (T > 7200) T = T — 7200; }while (B4[T] != 0) // Находим первый нулевой элемент массива (дырку) B4[T] = NTC; } return startTakt; }
setInterval (OpredeliaemTekTakt, 500); function OpredeliaemTekTakt ()//Каждые полсекунды увеличиваем TekTakt на 1 и обнуляем элементы массива, которые уже в прошлом { B2[TekTakt]=0; B4[TekTakt]=0; TekTakt++; } Если стояночных мест на станции будет несколько, то добавятся ещё точки слияния для каждого стояночного места. Тогда для вычисления момента старта ТС надо применять рекурсию.