Сборник задач и упражнений по курсу "Моделирование" (Событийный подход. Программное моделирование), страница 7

void simulation(ostream &ofs)

{

Gen g;

Aircraft ac[5];

Fifo_a fa;

unsigned xx[600];

unsigned r=0;

normt(xx);

ac[3].write_140();

ac[4].write_140();

while(g.get_time()<6000){

unsigned char ar;

unsigned int norm_t;

g.genarator(fa,ac);

while(fa.get_a()!=0){

ar=fa.take_off_f();

while(ac[ar].get_cur_cont()!=ac[ar].get_n_cont()){

if(g.get_cont()==0){

g.genarator(fa,ac);

if(g.get_time()>6000)break;

}

g.take_off_cont();

ac[ar].inc_cur_cont();

}

if(g.get_time()>6000) break;

norm_t=(unsigned)xx[r];

r++;

ac[ar].write_nt(g.get_time()-ac[ar].get_b());

ac[ar].inc_n();

ac[ar].dmaxmin(g.get_time()-ac[ar].get_b());

ac[ar].cur_cont_into_z();

ac[ar].b_t(g.get_time()+norm_t);

ac[ar].write_f(1);

}

}

ofs<<endl<<"        _________ Информация__о__самолетах ___________"<<endl<<

"        Количество_вылетов     Простой     Max._простой    Мin._простой    "<< endl ;

r=0;

while(r<5){

ofs<<(r+1)<<"           "<<(int)ac[r].get_n()<<

"                  "<<(ac[r].get_nu()/ac[r].get_n())<<

"          "<<ac[r].get_max_t()<<"              "<<

ac[r].get_min_t()<<endl;

r++;

}

ofs<<  "        ________ Информация о контейнерах ___________"<<endl<<

"        Простой     Мax.простой    Min.простой "<<endl<<

"              "<<(g.get_nt()/(float)g.get_g_cont())<<"        "<<g.get_max()<<"                   "<<g.get_min()<<

endl<<endl;

}

Функция simulation моделирует работу аэропорта в течение 100ч.(6000мин.)  и записывает результаты моделирования в файл "test10.txt".

Работа функции:

Создается массив хх для хранения 600 нормально-распределенных случайных величин.Переменная r - счетчик.Вызывом функции nornt(xx), заполняется массив хх. 4-му и 5-му самолету установливается грузоподъемность в 140 контейнеров.

while(g.get_time()<6000){

unsigned char ar;

unsigned int norm_t;

g.genarator(fa,ac);

while(fa.get_a()!=0){

ar=fa.take_off_f();

while(ac[ar].get_cur_cont()!=ac[ar].get_n_cont()){

if(g.get_cont()==0){

g.genarator(fa,ac);

if(g.get_time()>6000)break;

}

g.take_off_cont();

ac[ar].inc_cur_cont();

}

if(g.get_time()>6000) break;

norm_t=(unsigned)xx[r];

r++;

ac[ar].write_nt(g.get_time()-ac[ar].get_b());

ac[ar].inc_n();

ac[ar].dmaxmin(g.get_time()-ac[ar].get_b());

ac[ar].cur_cont_into_z();

ac[ar].b_t(g.get_time()+norm_t);

ac[ar].write_f(1);

}

}

Данный цикл выполняется пока модельное время меньше 6000 мин.Внутри цикла отводится память под 2 переменные:

ar - индекс обслуживаемого самолета;

norm_t - переменная для хранения нормальной случайной величины.

Далее запускается функция g.generator(fa,ac).

while(fa.get_a()!=0){

ar=fa.take_off_f();

while(ac[ar].get_cur_cont()!=ac[ar].get_n_cont()){

if(g.get_cont()==0){

g.genarator(fa,ac);

if(g.get_time()>6000)break;

}

g.take_off_cont();

ac[ar].inc_cur_cont();

//g.genarator(fa,ac);

}

if(g.get_time()>6000) break;

norm_t=(unsigned)xx[r];

r++;

ac[ar].write_nt(g.get_time()-ac[ar].get_b());

ac[ar].inc_n();

ac[ar].dmaxmin(g.get_time()-ac[ar].get_b());

ac[ar].cur_cont_into_z();

ac[ar].b_t(g.get_time()+norm_t);

ac[ar].write_f(1);

}

Цикл продолжается до тех пор, пока очередь не пуста. Внутри цикла берется самолет из очереди на обслуживание и загружается, пока число загруженных контейнеров не будет равно его грузоподъемности . Если самолет загружен не полностью , а со склада взяты все контейнеры, то вызывается функция g.genаrator и производится проверка модельного времени. Если погрузка завершена, то проверяется модельное время , берется нормальное случайное число из массива xx и запоминается в переменной normt_t. Далее увеличивается время суммарного простоя и прибавляется 1 к количеству полетов данного самолета. Корректируется его максимальное и минимальное  время простоя. Записывается время прилета на основе значения переменной norm_t и изменяется флаг состояния в 1.