Смекни!
smekni.com

Имитационное моделирование на основании предварительно установленных зависимостей (стр. 2 из 3)

Для моделирования времени обслуживания клиента у кассы проинтегрируем функцию распределения

:

(1.5)

От датчика случайных чисел равномерно распределенных на интервале [0 - 1] получаем очередное число Х, которое подставляем в формулу (1.5) и вычисляем

:

(1.6)

Из соотношения (1.6) найдем

соответствующее Х, которое будем принимать за случайное число, обозначающее время обслуживания данной кассой.

2. ПРОГРАММНОЕ РЕШЕНИЕ

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

Блок-схема имитационного моделирования работы кассового зала

Исходный текст программы состоит из одного файла Kas1.c который содержит реализацию таких функций программы:

– float RND_DIG (void) - Функция возвращающая СЧ в диапазоне [0, 1];

– void massive (void) - Функция выделяющая память под массив времени обслуживания у каждой из касс;

– float _tau(void) - Функция возвращающая время обслуживания у кассы;

– float time_to(void) - Функция определяет время входа следующего клиента. Промежутки между входами распределены по закону Пуассона с параметром lambda;

– void inf (void) - Функция вывода информации пользователю.


РУКОВОДСТВО пользователя

1. Программа имитационного моделирования работы банка расположена по следующему адресу:

A:\Kas1.exe

2. На запрос программы:

«Введите количество касс в кассовом зале ж\д вокзала:»

Вводим предполагаемое (данное) количество касс обслуживающих клиентов.

3. На запрос программы:

«Введите параметр распределения Пуассона для определения времени между входами пассажиров в зал:»

Вводим lambda – Параметр распределения Пуассона

4. На запрос программы:

«Введите минимальную продолжительность обслуживания у касс»

Вводим tau_min – минимальную продолжительность обслуживания.

4. На запрос программы:

«Введите максимальную продолжительность обслуживания у касс»

Вводим tau_max – максимальную продолжительность обслуживания.

5. На запрос программы:

«Введите время моделирования работы зала(в ч.):»

Вводим hours - время моделирования работы зала.

6. На запрос программы:

«Введите математическое ожидание времени обслуживания у касс:»

Вводим MO - математическое ожидание.

7. На запрос программы:

«Введите среднеквадратическое отклонение времени обслуживания у касс:»

Вводим SKO - среднеквадратическое отклонение.

8. После просмотра результатов, нажмите любую клавишу для завершения работы.


5. Листинг программы

/* Включаемие модули*/

#include<stdio.h> // Функции потокового ввода - вывода

#include<conio.h> // Формирование экракна

#include<math.h> // Математические функции

#include<alloc.h> // Функции по работе с динам. памятью

//Прототипы функций

float RND_DIG( void ); // Ф-я генерирует случ. числа

void inf( void); // Ф-я сообщает о назн-ии программы

void massive( void ); // Ф-я выделяющая память под массив

float _tau( void ); // Расчет времени обсл-я клиента у кассы

float time_to ( void ); // Расчет времени входа пассажира в зал

//Объявление переменных

float

tau_min, // Мин. время обсл-я у касс

tau_max, // Макс. время обсл-я у касс

*tau, // Тек. время обсл-я у касс

current_time, // Тек. время

minutes, // Общ. время работы в минутах

lambda, // Пар-р закона распр-я Пуассона

enter_time_, // Время входа очередного пассажира

MO, // Мат. ожид-е времени обсл-я

SKO, // Среднекв. откл-е времени обсл-я у касс

t_free, // Общ. время простоя касс

t_free_av, // Ср. время простоя

serve_av, // Ср. % обслуж-я пассажиров

refuse_av, // Ср. % отказов в обсл-ии

N0=7836, // 1-й множитель для расчета случ. числа

NI=4792, // 2-й множитель для расчета случ. числа

N, // Прозведение N0 и NI

ND; // Средние 4 цифры из числа N

int

m, // Кол-во касс

i, // Тек. номер кассы

enter, // Кол-во вошедших

hours, // Время работы зала в часах

serve, // Кол-во обслуж-х пассажиров

refuse, // Кол-во необслуж-х пассажиров

stand, // Кол-во стоящих в очереди на момент обслуживания

INDPAS; // Флаг обслуживания пассажиров

// Главная функция программы

void main(void)

{

inf(); // cообщение о назначении программы

textcolor( 14 ); //установка цвета и фона

textbackground( 1 );

clrscr(); //очистка экрана

/* Прием данных от пользователя */

printf("&bsol;n████████████████████████████████████████████████████████████████████████████████");

for(i=1;i<=21;i++)

printf("█ █");

printf("████████████████████████████████████████████████████████████████████████████████");

gotoxy(10,7);

do

{

printf("&bsol;n█&bsol;tВведите количество касс в кассовом"

" зале ж&bsol;д вокзала:");

scanf( "%d", &m );

}

while( (m<=0)||(m>=100) );

do

{

printf( "&bsol;n█&bsol;tВведите параметр распределения Пуассона для"

" определения" );

printf( "&bsol;n█&bsol;t&bsol;tвремени между входами пассажиров в зал:" );

scanf( "%f", &lambda );

}while( lambda<=0 );

clrscr();

//Вывод рамки

printf("&bsol;n████████████████████████████████████████████████████████████████████████████████");

for(i=1;i<=21;i++)

printf("█ █");

printf("████████████████████████████████████████████████████████████████████████████████");

gotoxy(5,3);

do

{

printf( "&bsol;n█&bsol;n█&bsol;tВведите минимальную продолжительность обслуживания " );

printf( "&bsol;n█&bsol;t&bsol;t&bsol;tу кассами:" );

scanf( "%f", &tau_min );

}while( tau_min<=0 );

do

{

printf( "&bsol;n█&bsol;tВведите максимальную продолжительность обслуживания " );

printf( "&bsol;n█&bsol;t&bsol;t&bsol;tу касс:" );

scanf( "%f", &tau_max );

}while( tau_max<=tau_min );

do

{

printf( "&bsol;n█&bsol;tВведите время моделирования работы зала(в ч.):" );

scanf( "%d", &hours );

}while( hours<=0 );

do

{

printf("&bsol;n█&bsol;tВведите математическое ожидание времени обслуживания");

printf( "&bsol;n█&bsol;t&bsol;tу касс:");

scanf( "%f", &MO );

}while( MO<=0 );

do

{

printf( "&bsol;n█&bsol;tВведите среднеквадратическое отклонение времени ");

printf( "&bsol;n█&bsol;tобслуживания у касс:");

scanf( "%f", &SKO );

}while( SKO<=0 );

massive(); // создание и обнуление массива

minutes=floor( hours*60 ); // переведем время работы в минуты

enter=0; // никто не входил

serve=0; // никого не обслужили

refuse=0; // никому не отказали

t_free=0; // кассы еще не простаивали

current_time=0; // начало отсчета времени с нуля

enter_time_=time_to(); // когда зайдет следующий

/* Цикл моделирования работы зала

for( current_time=0; current_time<=minutes; current_time++ )

{

/* Коррект-ка времени обсл-я у каждой кассы */

if( current_time )

for( i=1; i<=m ;i++)

if( tau[i] ) //Если касса занята, то уменьшим время обсл-я

tau[i]--; // в ней на 1 мин.

else // Если касса свободна, наращиваем общее время

t_free++; // простоя касс.

if( enter_time_<=current_time )

{

enter++; // Если входит пассажир, отмечаем это

enter_time_=time_to(); // Узнаем, когда зайдет следующий?

i=1; // Вошедший подходит к 1-й кассе

INDPAS=1; // Его еще не обслуживают

do

{

if( tau[i]<=0 ) //Если касса свободна, ставим пассажира на

{ //обсл-е и узнаем, сколько ему стоять у кассы

tau[i]=_tau();

INDPAS=0; //Укажем, что пассажира обслуживают

}

i++; // Подходим к следующей кассе

}while((i<=m) && (INDPAS==1));

if( INDPAS==1 ) // Если клиент не обслужен, отмечаем это

refuse++;

if( INDPAS==0) // Если клиент обслужен, отмечаем это

serve++;

}

}

stand=0; // Пока в очереди никто не стоит

i=1; // Начинаем с первой кассы

do

{

if( tau[i]>0 ) // Если время обсл-я не равно нулю, значит

stand++; // у кассы кто-то стоит

i++; // Смотрим у следующей кассы

}while( i<=m );

serve-=stand; // Корректируем кол-во обслуженных

t_free_av=(float)t_free/m; // Вычислим ср. время простоя

serve_av=(float)serve/enter; // Вычислим ср. % обслуженных

refuse_av=(float)refuse/enter; // Вычислим ср. % необслуженных

textcolor(1); // Установка параметров текста

textbackground(2);

clrscr();

_setcursortype( _NOCURSOR );

/*Вывод полученных результатов