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

Необходимо промоделировать данную систему с целью получения оценок времени ожидания контейнеров с грузами и загрузки самолетов обоих типов в течение 100 ч., при этом временем погрузки пренебречь.

 Алгоритм моделирования

1.  Пока модельное время меньше 6000 мин., перейти к п.2, иначе к п.16.

2.  Сгенерировать 2 контейнера , увеличить модельное время на 1 мин.  Вновь прилетевшие самолеты , если такие имеются, поставить в очередь на  обслуживание.

3.  Пока очередь на обслуживание не пуста, перейти к п.4, иначе к п.1.

4.  Взять самолет из очереди с заданным приоритетом.

5.  Пока самолет не загружен полностью, перейти к п.6, иначе к п.12.

6.  Если контейнеры на складе отсутствуют, то перейти к п.7, иначе к п.9.

7.  Сгенерировать 2 контейнера , увеличить модельное время на 1 минуту.    Вновь прилетевшие самолеты , если такие имеются, поставить в очередь на  обслуживание.

8.  Если модельное время больше 6000 мин., то перейти к п.16, иначе к п.9.

9.  Взять контейнер со склада.

10.Погрузить контейнер на обслуживаемый самолет.

11.Перейти к п.5.

12.Если модельное время больше 6000 мин., то перейти к п.16, иначе к п.13.

13.Приравнять время полета самолета к нормальному случайному числу с     заданными параметрами.

14.Рассчитать время прилета , время простоя , увеличить количество вылетов  на 1.

15.Перейти к п.3.

16.Конец алгоритма.

    Описание программы

Программа математического моделирования работы аэропорта написана на языке Borland C++ 3.1.

#include <fstream.h>

#include <math.h>

#include <stdlib.h>

#include <time.h>

Данные выше строки выполняют подключение заголовочных файлов библиотек файлового ввода/вывода, общего назначения, библиотеки, которая поддерживает получение равномерно распределенной случайной величины.

void  normt(unsigned *xx)

{

int i,j;

double x[400];

double a,b,w;

int s=60,u=180;

float l;

randomize();

i=0;

while(i<400){

x[i]=random(21)/20.0;

i++;

}

randomize();

i=0;

j=0;

while(j<400){

a =2*x[j]-1;

b=2*(random(21)/20.0)-1;

w=a*a+b*b;

if (w>0&&w<=1){

l=-2.0*log(w)/w;

*(xx+i)=a*sqrt(l)*s+u;

*(xx+i+1)=b*sqrt(l)*s+u;

if(*(xx+i)<120&&*(xx+i)>60&&*(xx+i+1)<120&&*(xx+i+1)>60)

i+=2;

}

else if(w==0){

*(xx+i)=u;

*(xx+i+1)=u;i+=2; }

j++;

}

}

Функция void normt(unsigned *xx) заполняет массив xx случайными величинами, распределенными по нормальному закону.

i,j – счетчики;

x[400] - массив из 400 элементов , заполняется равномерными случайными величинами;

s,u - переменные для хранения значений дисперсии и мат. ожидания;

randomize() - вызов этой функции инициализирует генератор равномерно-распределенных случайных величин.

while(i<400){

x[i]=random(21)/20.0;

i++;

}

В данном цикле записывается 400 значений равномерно-распределенной случайной величины:

random(m) - возвращает равномерно-распределенное случайное число в диапазоне от 0 до m, где m – целое;

randomize() - инициализирует новый генератор равномерно-распределенных случайных величин. Для получения случайных величин , распределенных по нормальному закону, требуется 2 независимых генератора равномерно-распределенных случайных величин.

i=0;

j=0;

while(j<400){

a =2*x[j]-1;

b=2*(random(21)/20.0)-1;

w=a*a+b*b;

if (w>0&&w<=1){

l=-2.0*log(w)/w;

*(xx+i)=a*sqrt(l)*s+u;

*(xx+i+1)=b*sqrt(l)*s+u;

if(*(xx+i)<120&&*(xx+i)>60&&*(xx+i+1)<120&&*(xx+i+1)>60)

i+=2;

}

else if(w==0){

*(xx+i)=u;

*(xx+i+1)=u;i+=2; }

j++;

}

В данном цикле сначала вычисляются значения a,b,w. Если w больше 0 и не больше 1, то вычисляется значение l и с его помощью значения случайных нормальных величин *(xx+i) и *(xx+i+1). Если вычисленные значения принадлежат интервалу (60,120), то i увеличивается на 2. Если w равно 0, то значения случайных величин равны мат. ожиданию.

class Fifo_a {

unsigned char a,f[5];

void move (unsigned char i);