Для начала я хочу сказать каким я вижу 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++; }
Если стояночных мест на станции будет несколько, то добавятся ещё точки слияния для каждого стояночного места. Тогда для вычисления момента старта ТС надо применять рекурсию.
ссылка на оригинал статьи http://habrahabr.ru/post/220179/
Добавить комментарий