Привет, Хабр.
PRT расшифровывается как personal rapid transit. Это автоматический транспорт, управляемый компьютером и перемещающийся по специальным путям. Вот ссылки на википедию по-английски и по-русски. В Лондоне, в аэропорту Хитроу уже пару лет работает действующая система. А японцы сделали такой транспорт ещё в 70-е годы, но потом запретили. Как сказано в википедии: проект CVS (Computer-controlled Vehicle System) был закрыт после того, как Министерство территории, инфраструктуры и транспорта Японии заявило, что система небезопасна и не соответствует существующим правилам о минимальной дистанции. Поэтому для внедрения этого вида транспорта надо будет принять специальный закон.
Для начала я хочу сказать каким я вижу 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(10/3,6) метра (ТС будут проезжать 1 раз в секунду).
Попробуем написать программу, определяющую путь. Для изображённой на рисунке системы нам понадобится два массива, по одному массиву для каждой из точек слияния B2 и B4, хранящих информацию о проходящих через них ТС. Размерность массивов будет 7200=60*60*2 (60минут*60секунд*2раза/секунду). В массиве будет храниться информация о проезжающих через данную точку слияния ТС на близжайший час. Если в массиве для какого-то момента времени хранится 0, то место свободно (это дырка). Если этот момент забронирован каким-то ТС, то можно хранить в массиве номер этого ТС.
Пишу на javascript, но думаю нет проблемы сделать это на C.
Если стояночных мест на станции будет несколько, то добавятся ещё точки слияния для каждого стояночного места. Тогда для вычисления момента старта ТС надо применять рекурсию.
PRT расшифровывается как personal rapid transit. Это автоматический транспорт, управляемый компьютером и перемещающийся по специальным путям. Вот ссылки на википедию по-английски и по-русски. В Лондоне, в аэропорту Хитроу уже пару лет работает действующая система. А японцы сделали такой транспорт ещё в 70-е годы, но потом запретили. Как сказано в википедии: проект CVS (Computer-controlled Vehicle System) был закрыт после того, как Министерство территории, инфраструктуры и транспорта Японии заявило, что система небезопасна и не соответствует существующим правилам о минимальной дистанции. Поэтому для внедрения этого вида транспорта надо будет принять специальный закон.
Для начала я хочу сказать каким я вижу 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(10/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++; if(TekTakt==7200)TekTakt=0;}
Если стояночных мест на станции будет несколько, то добавятся ещё точки слияния для каждого стояночного места. Тогда для вычисления момента старта ТС надо применять рекурсию.