Pull to refresh

Система управления PRT-транспортом

Reading time 4 min
Views 2.8K
Привет, Хабр.
PRT расшифровывается как personal rapid transit. Это автоматический транспорт, управляемый компьютером и перемещающийся по специальным путям. Вот ссылки на википедию по-английски и по-русски. В Лондоне, в аэропорту Хитроу уже пару лет работает действующая система. А японцы сделали такой транспорт ещё в 70-е годы, но потом запретили. Как сказано в википедии: проект CVS (Computer-controlled Vehicle System) был закрыт после того, как Министерство территории, инфраструктуры и транспорта Японии заявило, что система небезопасна и не соответствует существующим правилам о минимальной дистанции. Поэтому для внедрения этого вида транспорта надо будет принять специальный закон.

Для начала я хочу сказать каким я вижу PRT-транспорт — это гениальное изобретение, позволяющее доехать до станции назначения без остановок на перекрёстках и станциях. Я считаю, что колёса должны быть резиновые, как в Лондонском варианте, как у автомобиля. Но питание должно быть не от аккумуляторов, а от контактного рельса. И кабинки должны быть не 4-местные, а одно- и двухместные (одно за другим), что позволит сделать более узкие пути.

Вот здесь написано, что система управления PRT-транспортом бывает синхронной, асинхронной, транс-синхронной, квази-синхронной и Asynchronous Point Follower. Насколько я понял, то, как я вижу PRT-транспорт это и есть синхронная система управления. А вижу я так: по путям двигаются строго по предписанию и на заданном расстоянии транспортные средства (ТС) или их отсутствие. Так сказать электроны и дырки, если сравнивать с полупроводниковыми приборами. При посадке пассажир указывает станцию назначения. Центральный компьютер получает эту информацию, вырабатывает путь движения и отправляет его на ТС.

Для упрощения программы предположим, что у нас есть три станции A, B и C (см. рисунок).

image

Имеются также 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;}


Если стояночных мест на станции будет несколько, то добавятся ещё точки слияния для каждого стояночного места. Тогда для вычисления момента старта ТС надо применять рекурсию.
Tags:
Hubs:
+6
Comments 0
Comments Leave a comment

Articles