Імітаційне моделювання на основі попередньо встановлених залежностей

[ виправити ] текст може містити помилки, будь ласка перевіряйте перш ніж використовувати.


Нажми чтобы узнать.
скачати

КАФЕДРА
Економічної кібернетики
імітаційне моделювання на основі попередньо встановлених залежностей.
м. Жовті Води 2004

Зміст
1. Постановка завдання _________________________________ 3
2. Метод рішення задачі _________________________________ 5
3. Програмне рішення _________________________________ 8
4. Керівництво пользователя_______________________________ 11
5. Лістинг програми _________________________________ 12

Постановка завдання
У сучасному світі гарантією ефективної роботи будь-якого підприємства є раціональне використання грошових коштів і трудового фактора. Так для розрахунку економічного ефекту роботи касового залу необхідно провести імітаційне моделювання на основі попередньо встановлених залежностей.
Припустимо, що клієнти в зал прибувають з інтервалом, що обчислюються у хвилинах (див. рис. 1).
t
Серпень 2000




SHAPE \ * MERGEFORMAT
Рис. 1 - «Прихід клієнтів в зал»
Прихід клієнтів в зал описується пуассоновским потоком з інтенсивністю r, який визначається наступним чином:
(1.1)
де: r - інтенсивність потоку;
k - час між парафіями клієнтів.
Параметр k може приймати дискретні значення від нуля до нескінченності. Причому k = 0 означає прихід відразу двох клієнтів.
Припустимо, в залі є N кас. Математичне сподівання обслуговування клієнтів у банку позначимо . Обслуговування клієнтів біля кас відбувається за експоненціальним законом розподілу випадкової величини ( - Час обслуговування клієнтів) з щільністю розподілу :
(1.2)
Примітка:
Якщо в залі є вільні каси, то клієнт стає на обслуговування до найближчої з них (тобто до каси з мінімальним номером). Якщо всі каси зайняті - клієнт стає в чергу до тієї каси, де черга мінімальна. Якщо черги однакові, то клієнт стає в будь-яку з них.
Для вирішення поставленого завдання необхідно розробити алгоритм імітаційного моделювання роботи касового залу за 24-годинний робочий день. А також визначити час простою кас і кількість клієнтів у черзі не обслужених на момент закриття банку.

1. Метод рішення задачі

Імітаційне моделювання на ЕОМ процесу функціонування автоматизованої системи управління роботою касового залу дозволяє отримати чисельний розв'язок поставленої задачі. Суть даного методу наближеного рішення полягає в проведенні низки випадкових випробувань ймовірнісної моделі досліджуваної системи та отриманні сукупності реалізацій випадкових процесів зміни стану.
У результаті багаторазового реалізації випадкових процесів визначаються оцінки ймовірності тих чи інших подій і середні значення випадкових величин. Імітаційне моделювання пов'язане з необхідністю відтворення випадкових подій і величин, розподілених за довільним законом. Існує кілька способів генерації випадкових величин і формування їх розподілів. Модель системи управління роботою касового залу включає в себе:
· Прихід клієнтів в зал ;
· Час обслуговування клієнтів біля кас .
За умовою поставленого завдання прихід клієнтів у зал описується пуассоновским потоком з інтенсивністю r. Для кращого розуміння суті розподілу Пуассона необхідно знати основні визначення:
Інтенсивність потоку - середнє число подій, що з'являється в одиницю часу.
Потік - послідовність подій, які настають у випадкові моменти часу.
Закон розподілу Пуассона виражається формулою (1.1).
Будемо моделювати інтервал часу між двома послідовно зайшли в банк клієнтами методом Монте-Карло з датчиком випадкових чисел на інтервалі [0 - 1].
Сукупність незалежних випадкових подій, що утворюють повну групу, характеризується ймовірностями появи кожного з подій , Причому . Для моделювання цієї сукупності випадкових подій використовується генератор випадкових чисел, рівномірно розподілених в інтервалі [0 - 1]. При розподілі відрізка [0 - 1] на n частин, чисельно рівних , Виникнення події встановлюється шляхом визначення знаходження випадкового числа Х в межах інтервалу при перевірці умови , Де змінюється від нуля до n. При маємо ; При маємо і так далі. При підстановці у формулу (1.1) отримаємо:
;
* ;
* і так далі.
Причому (Мін.) - максимальна кількість очікування клієнтів.
Так як досвід проводиться багаторазово, то, очевидно, що частота потрапляння випадкових чисел на кожний з відрізків, що визначаються їх довжиною, і відповідає отриманим ймовірностями
Моделювання часу обслуговування клієнтів біля кас відбувається за експоненціальним законом розподілу, формула якого представлена ​​вище (формула (1.2)).
Час обслуговування клієнтів , Як і будь-яка інша випадкова величина, описується функцією розподілу , Обумовлена ​​як ймовірність випадкової події, яка полягає в тому, що час обслуговування клієнтів менше деякого заданого часу :

Ця ймовірність розглядається як функція у всьому діапазоні можливих значень величини . Функція розподілу будь-якої випадкової величини є неубутною функцією часу . Зразковий вид функції дан на малюнку 3.


1


Рис. 3 - «Функція розподілу експоненціального закону»
Так як значення не можуть бути негативними, то . При величина прагне до одиниці. Таким чином, функція розподілу часу обслуговування клієнтів:
(1.3)
де - Параметр розподілу (середній час обслуговування клієнтів біля каси).
Відповідно щільність розподілу:
(1.4)
Для моделювання часу обслуговування клієнта біля каси проінтегруємо функцію розподілу :

(1.5)
Від датчика випадкових чисел рівномірно розподілених на інтервалі [0 - 1] отримуємо чергове число Х, яке підставляємо у формулу (1.5) і обчислюємо :

(1.6)
Зі співвідношення (1.6) знайдемо відповідне Х, яке будемо приймати за випадкове число, що означає час обслуговування даної касою.

2. ПРОГРАМНЕ РІШЕННЯ

Програма імітаційного моделювання роботи касового залу написана на мові C за допомогою середовища розробки Borland C + + 3.1.
kassa
Блок-схема: знак завершення: KASSA Блок-схема імітаційного моделювання роботи касового залу
Введення кол-ва кас m
Введення lambda
Введення tau_min і tau_max
хв. і мак. час обслуго-вування клієнтів біля кас
Параметр розподілу Пуассона

i:: = 1
Введення hours
Введення MO і SKO
Час моделювання роботи касового залу в ч.
Математичне очіку-ня і середн. кв. від-ня
Створення і обнулення масиву і змінних
current_time <= minutes
Так
Ні
current_time
Так
i <= m
Так
tau [i]
Ні
Так
tau [i] -
t_free + +
i + +
Ні
Ні
2
1
2
1
enter_time_ <= current_time
Так
Ні
enter + +
enter_time_ = time_to ()
i = 1; INDPAS = 1
tau [i]
Ні
Так
tau [i] = _tau ()
INDPAS = 0
i + +
i <= m & & INDPAS = = 1
Так
Ні
INDPAS = = 1
Так
Ні
refuse + +
INDPAS = = 0
Так
Ні
serve + +
current_time + +
3
3

tau [i]> 0
stand + +
Так
Ні
i + +
i <m
4
4
serve-= stand;
t_free_av = (float) t_free / m; serve_av = (float) serve / enter;
refuse_av = (float) refuse / enter;
Висновок результатів
КІНЕЦЬ
Коррек. к-ть обслужених
Обчислимо СР час простою
Обчислимо СР % Обслугованих
Обчислити. СР % Необслуженной

stand = 0; i = 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 (); / / Повідомлення про призначення програми
textcolor (14); / / установка кольору і фону
textbackground (1);
clrscr (); / / очищення екрана
/ * Отримання даних від користувача * /
printf ("\ n █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ ");
for (i = 1; i <= 21; i + +)
printf ("█ █");
printf ("█ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ ");
gotoxy (10,7);
do
{
printf ("\ n █ \ tВведіте кількість кас в касовому"
"Залі ж \ \ д вокзалу:");
scanf ("% d", & m);
}
while ((m <= 0) | | (m> = 100));
do
{
printf ("\ n █ \ tВведіте параметр розподілу Пуассона для"
"Визначення");
printf ("\ n █ \ t \ tвремені між входами пасажирів у зал:");
scanf ("% f", & lambda);
} While (lambda <= 0);
clrscr ();
/ / Висновок рамки
printf ("\ n █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ ");
for (i = 1; i <= 21; i + +)
printf ("█ █");
printf ("█ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ ");
gotoxy (5,3);
do
{
printf ("\ n █ \ n █ \ tВведіте мінімальну тривалість обслуговування");
printf ("\ n █ \ t \ t \ tу касами:");
scanf ("% f", & tau_min);
} While (tau_min <= 0);
do
{
printf ("\ n █ \ tВведіте максимальну тривалість обслуговування");
printf ("\ n █ \ t \ t \ tу кас:");
scanf ("% f", & tau_max);
} While (tau_max <= tau_min);
do
{
printf ("\ n █ \ tВведіте час моделювання роботи залу (в ч.):");
scanf ("% d", & hours);
} While (hours <= 0);
do
{
printf ("\ n █ \ tВведіте математичне сподівання часу обслуговування");
printf ("\ n █ \ t \ tу кас:");
scanf ("% f", & MO);
} While (MO <= 0);
do
{
printf ("\ n █ \ tВведіте середньоквадратичне відхилення часу");
printf ("\ n █ \ 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);

/ * Висновок отриманих результатів
/ / Висновок рамки
printf ("\ n █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ ");
for (i = 1; i <= 21; i + +)
printf ("█ █");
printf ("█ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ ");
gotoxy (3,3);
printf ("\ n █ \ n █ \ t ╔ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ╗ ");
printf ("\ n █ \ t ║% d залізничних кас працювало протягом:% d годин.", m, hours);
gotoxy (70,6);
printf ("║");
printf ("\ n █ \ t ║ У зал зайшло% d відвідувачів.", enter);
gotoxy (70,7);
printf ("║");
printf ("\ n █ \ t ║");
gotoxy (70,8);
printf ("║");
printf ("\ n █ \ t ║ \ n █ \ t ║ Було обслуговано% d чоловік (а).", serve);
gotoxy (70,9);
printf ("║");
printf ("\ n █ \ n █ \ t ║ Пішли необслуженной% d чоловік (а).", refuse);
gotoxy (70,10);
printf ("║");
printf ("\ n █ \ n █ \ t ║ У черзі залишилося стояти% d чоловік (а).", stand);
gotoxy (70,11);
printf ("║");
printf ("\ n █ \ n █ \ t ║ Середній відсоток обслуговування пасажирів% .2 f%%", serve_av * 100);
gotoxy (70,12);
printf ("║");
printf ("\ n █ \ n █ \ t ║ Середній відсоток відмов в обслуговуванні% .2 f%%", refuse_av * 100);
gotoxy (70,13);
printf ("║");
printf ("\ n █ \ n █ \ t ║ Всього каси простоювали:% .0 FЧ.% .0 f хв.", floor (t_free/60),
t_free-floor (t_free/60) * 60);
gotoxy (70,14);
printf ("║");
printf ("\ n █ \ n █ \ t ║ Середній час простою 1 каси:% .0 FЧ.% .0 f хв.",
floor (t_free_av/60), t_free_av-floor (t_free_av/60) * 60);
gotoxy (70,15);
printf ("║");
gotoxy (70,16);
printf ("║");
printf ("\ n █ \ t ╚ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ╝ ");
getch ();
}
/ / Функція повертає СЧ в діапазоні від 0 до 1
float RND_DIG (void)
{
float
x; / / СЧ в діапазоні від 0 до 1
N = (NI * N0);
ND = floor (N/100);
ND = (ND/10000-floor (ND/10000)) * 10000; / / Відкинемо перші 2 цифри
N0 = NI;
NI = ND;
x = ND/9999;
return x;
}
/ / Ф-я виділяє пам'ять під масив часу обсл-я у кожної з кас
void massive (void)
{
int i;
tau = (float *) malloc ((m +1) * sizeof (float));
/ * Обнулення елементів масиву * /
for (i = 1; i <= m; i + +)
tau [i] = 0;
}
/ / Ф-я возвр. час обсл-я біля каси
float _tau (void)
{
float
x, / / ​​Випадкове число x
y, / / ​​Випадкове число y
z, / / ​​Випадкове число z
tau_; / / Час обслуговування
/ / Перевірка на парність
//---------------------
if (floor ((float) i / 2) == ceil ((float) i / 2))
{
x = RND_DIG (); / / Запит случ. числа від ДСЧ
y = RND_DIG (); / / Запит случ. числа від ДСЧ
if (x> =. 0001) / / Якщо х не дуже маленьке, вважаємо z
z = sqrt (-2 * log (x)) * sin (2 * M_PI * y);
else
{
if (sin (2 * M_PI * y) <= 0)
z = 0; / / Якщо обидва множника занадто малі, то z = 0
else
z = (float) minutes / 2; / / Якщо 2-й множ-ль нормальний, то
} / / Вів-на z дорівнює половині часу роботи залу.
tau_ = MO + z * SKO; / / Обчислимо нормально розподілене час обсл-я
if (tau_ <0) / / Якщо час негативно, воно дорівнює 1 хв.
tau_ = 1;
}
else
{
x = RND_DIG (); / / Запит случ. величини від ДСЧ
/ * Обчислимо рівномірно розподілене час обсл-я * /
//------------------------------------------------ -
tau_ = floor (tau_min + x * (tau_max-tau_min) + .5);
}
return floor (tau_ + .5); / / Виведемо в місце запиту
}
/ / Ф-я визначає час входу слід-го клієнта. Проміжки
/ / Між входами розподілені за законом Пуассона з пар-м lambda
/ / ================================================ ============
float time_to (void)
{
int
j; / / Пар-р закону распр-я Пуассона
float
x, / / ​​Случ. вів-на
tau, / / ​​Час до входу
a, / / ​​Пар-р закону распр-я
n, / / ​​Половина загального часу роботи
S; / / Пар-р закону распр-я
n = floor (minutes / 2 +0.5);
x = RND_DIG (); / / Приймемо случ. число
tau = 0;
j = 0;
a = exp ((lambda * (-1))); / / Розрахунок поч. знач-я пар-ра а
S = 0;
do
{
if (S> = x & & x <S + a) / / Перевірка х на пренадл-ть проміжку [S; S + a)
break;
tau + +;
j + +;
S + = a;
a *= lambda / j;
}
while (tau <= n);
return current_time + tau; / / Повернемо час до входу слід-го клієнта
}
Додати в блог або на сайт

Цей текст може містити помилки.

Економіко-математичне моделювання | Контрольна робота
59.2кб. | скачати


Схожі роботи:
Імітаційне моделювання системи фазового автопідстроювання частоти в пакеті моделювання динамічних
Імітаційне моделювання
Імітаційне моделювання на виробництві
Імітаційне моделювання на виробництві
Імітаційне структурне моделювання системи
Імітаційне моделювання виробничого процесу
Імітаційне моделювання роботи обчислювального центру
Імітаційне моделювання в контексті управлінського прогнозування
Імітаційне моделювання в аналізі ризиків інвестиційного проект
© Усі права захищені
написати до нас
Рейтинг@Mail.ru