Необходимо промоделировать данную систему с целью получения оценок времени ожидания контейнеров с грузами и загрузки самолетов обоих типов в течение 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);
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.