Міністерство освіти і науки, молоді та спорту України
Національний університет «ЛЬВІВСЬКА ПОЛІТЕХНІКА»
Кафедра автоматизованих систем управління
/
Лабораторна робота №3
з курсу “ Планування експериментів”
на тему:
«Імітаційне моделювання системи масового обслуговування типу М\М\1 із застосуванням методу зміни системного часу з кроком до наступної події»
Bиконав:
студент групи КН – 32
Харчишин П.
Прийняв:
доцент Кузьмін О.В.
Львів – 2013
Мета роботи: Ознайомлення з методом імітаційного моделювання по подіях із змінним прирістом кроку часової змінної для дослідження систем масового обслуговування (СМО).
Теоретичні положення
Механізм системного часу.
Однією з найбільш важливих задач при створенні моделі і виборі мови програмування є визначення механізму регламентації подій і процесів. Поняття регламентації в імітаційному моделюванні включає два етапи або дві функції: просування часу або коректування часової координати стану системи і забезпечення узгодженості різних блоків і подій в системі. Оскільки дії, які виконуються різними блоками залежать від дій і станів інших елементів, вони повинні бути скоординовані у часі або сихронізовані. Таким чином функціонування моделі повинно протікати у штучному часі, забезпечуючи появу подій в належному порядку і з належним часовим інтервалом між ними. Хоча компоненти реальної системи функціонують одночасно, компоненти цифрової імітаційної моделі діють послідовно, оскільки в цифровій ЕОМ в кожен момент часу виконується лише одна команда (принцип дії її послідовний), тобто обробляється лише один компонент системи. Оскільки в різних частинах реальної системи події можуть виникати одночасно, необхідно побудувати деякий механізм задання часу для синхронізації дій компонентів системи на даному часовому інтервалі. Існують два основних методи задання часу – за допомогою фіксованих і змінних інтервалів часу. Їх також називають відповідно методами фіксованого кроку і кроку до наступної події. По методу фіксованого часового кроку відлік системного часу ведеться через попередньо визначенні часові інтервали постійної довжини моделювання протікає у звичайному часі з фіксованим кроком.
При використанні методу змінного кроку або кроку до наступної події, стан системи, яка моделюється, оновлюється з появою кожної суттєвої події незалежно від інтервалів часу між ними (моделювання протікає у часі подій).
Імітаційні моделі також зручно класифікувати по двох основних категоріях:
моделі з неперервною зміною стану;
моделі з дискретною зміною стану;
В перших використовуються механізми фіксованого приросту часових інтервалів. Ними зручно описувати поведінку системи, які представляються неперервними потоками інформації.
Моделі другого виду знаходять застосування тоді, коли дослідника цікавить поведінка окремих елементів в системі. В більшості моделей з дискретною зміною станів використовується метод відліку часу до наступної події.
Розглянемо діаграми, які демонструють способи представлення і управління часом в обох випадках (рис.1). По осі часу відкладена одна і та ж сама послідовність подій ei. Стрілки вказують на точки, в яких відбувається приріст часу на один такт, і момент наступлення чергових подій.
а) змінного кроку
б) фіксованого кроку
Рис. 1. Механізм управління часом.
В моделі, яка використовує принцип кроку до наступної події, час, який імітується при зміні, зсувається вперед точно на момент наступлення самого раннього з наступних подій. При цьому послідовність моментів часу така: S1=e1, S2=e2, S3=e3, S4=e4=e5=S5, S6=e6, де конкретні значення часу в точності дорівнюють величинам: e1, e2,..., які відповідають моментам появи подій. В другій моделі, яка використовує метод фіксованого часового кроку моменти модельного часу будуть послідовно приймати значення: S1'=(t, S2'=2t, S3'=3t, S4'=4t.
Ці моменти часу ніяк не зв'язані з моментами появи подій e1, e2,..., які імітує модель. Модельний час в цьому випадку отримає постійний приріст на попередньо вибрану величину t. У кожному з цих методів є свої переваги.
В моделі, яка використовує метод задання кроку до наступної події, обробка подій виконується послідовно і час імітації кожний раз зміщується вперед на початок наступної події, кожна з яких обслуговується по черзі. В моделі з фіксованим кроком обробка подій відбувається по-іншому, а саме: по групам, пакетам або множинам подій.
Припустимо, що заданий час Sk'. Тоді обробка всіх подій ep, eq, er,.. для яких виконується наступна умова:
Sk'-1<ep,eq,er,..<=Sk' виконується до того, як модульний час отримає приріст до Sk+1. Якщо величина t вибрана неправильно, результати також можуть бути невірними, оскільки всі події будуть з'являтися в точці, яка відповідає верхній межі інтервалу (рис.2).
Рис. 2. Механизм обробки подій з фіксованим прирістом часу при збільшенні величини t у два рази.
Для метода фіксованих інтервалів при тривалості імітації системи з m компонентів на проміжку T одиниць часу потрібно T+m раз визначати необхідність коректування характеристик стану цих компонентів. При середній тривалості події t одинць часу таких коректувань треба виконати Tm/t. Ця кількість коректувань не залежить від способу задання часових інтервалів. При зміні метода задання кроку до наступної події необхідно знайти мінімальну з множини з m значень для кожного з Tm/t коректувань, для чого потрібно провести m-1 порівнянь. Таким чином, порівнюючи величини (Tm/t)(m-1) і Tm можна прийти до висновку, який з методів кращий. Наприклад, при t<m-1 перевагу має метод з фіксованим вибором кроку.
Застосування одного з двох методів залежить від характеру тієї системи, яка моделюється, але метод фіксованих кроків працює краще якщо:
події з'являються регулярно і розподілені у часі відносно рівномірно;
на протязі циклу моделювання T з'являється багато подій, причому математичне сподівання тривалості подій мале;
точна природа суттєвих подій неясна як це буває на початковому етапі імітаційного дослідження.
З іншої сторони методу задання кроку до наступної події вигідніший тим, що:
дозволяє економити машинний час у випадку статистичних систем, в яких суттєві події можуть довгий час не наступати;
не потрібно визначати величину приросту часу (що впливає і на тривалість циклу моделювання і на точність);
може ефективно використовуватись при нерівномірному розподілі подій у часі або при великому значенні математичного сподівання їх тривалостей.
2.2. Реалізація моделювання по подіях.
Для моделювання СМО типу М\М\1 виділемо наступні характерні події:
R- запит ресурса для заявки (канала пристрою Q )
R- призначення ресурса заявці (канала пристрою Q )
R- звільнення ресурса заявкою (канала пристрою Q )
Послідовність планування та обробка подій схематично зображена на рис.3
Рис. 3. Діаграма планування послідовності подій, пов’язаних з обслуговуванням заявок.
Події R- запит ресурса для заявки та R- призначення ресурса заявці можна об’єднати в одну подію R- запит-призначення ресурсу заявці. Механізм синхронізації подій реалізується за допомогою списка подій, представленого на рис. 4.
Рис. 4. Механізм синхронізації подій.
При обробці кожної події планується інша подія згідно діаграми подій (рис.3) і виконується накопичення статистичних даних згідно виразів (2.2.1)-(2.2.7).
Коефіцієнт завантаження канала пристрою Q:
(2.2.1)
де – час обслуговування j-ї заявки,
Т – загальний час моделювання,
n – кількість заявок, які пройшли через обслуговуючий пристрій Q.
Середній час обслуговування пристроєм .
(2.2.2)
де і n мають ті самі значення, що і в виразі (2.2.1).
Середня довжина черги до пристрою .
(2.2.3)
де – поточне значення довжини черги до пристрою Q при поступленні в чергу заявки або звільненні з черги заявки,
- проміжок часу, на протязі якого поточне значення черги не змінюється,
m – кількість змін стану черги на протязі часу моделювання Т.
Максимальна довжина черги .
() (2.2.4)
Середній час очікування обслуговування заявки каналом пристрою Q:
(2.2.5)
де – час очікування j-ї заявки в черзі до пристрою Q,
n – має те ж саме значення, що і в виразі (2.2.1).
Максимальний час очікування заявки у черзі до пристрою Q:
() (2.2.6)
де і n мають ті ж самі значення, що і в виразі (2.2.5).
Середній час перебування заявки в пристрої Q:
(2.2.7)
де , мають ті самі значення, що і у виразах (2.2.2), (2.2.5).
Варіант 30.
№ варіанту
Значення вхідних даних
Початкове значення генератора
X0
Середній проміжок часу між поступленнями заявок
хв.
Середній час обслуговування заявок
хв.
30
17763
39
34
Виконання:
Код програми:
файл podiy.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace SMOMM1
{
public struct Harakter
{
public int Nzayvka;
public double Tpost;
public double Tserv;
}
public class Zayvka
{
public Harakter Harak;
public Zayvka(int Nzayvka, double Tpost, double Tserv)
{
Harak.Tpost = Tpost;
Harak.Tserv = Tserv;
Harak.Nzayvka = Nzayvka;
}
}
public class Podiy
{
public enum TypPodij { Post = 1, Give = 2, Free = 3 };
public TypPodij typ;
public int Nzayvka;
public double Time;
public Podiy(TypPodij typ, int Nzayvka, double Time)
{
this.typ = typ;
this.Nzayvka = Nzayvka;
this.Time = Time;
}
}
}
файл Form1.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace SMOMM1
{
public partial class Form1 : Form
{
long X, A, m = 0;
private Podiy.TypPodij TypePodijNext;
private int ZagalnKilkZamovl;
private int TZagalnImit;
private int LcherMax;
private bool KanalBusy;
private double Lcher;
private double TSpost, TSserv;
private double Tmodel, TOstanPodij, Toch, TochMax, TZagalnObslug;
private Podiy PodiyCurr = null;
private List<Podiy> ListPodij = new List<Podiy>();
private List<Zayvka> ChergaZayvok = new List<Zayvka>();
public Form1()
{
InitializeComponent();
}
public long multiplicative(long A, long X, long m)
{
this.X = (A * X) % m;
return this.X;
}
public double exponent(double Time)
{
return -Time * (Math.Log((double)multiplicative(A, X, m) / (double)m));
}
public void addPodiy(Podiy podiy)
{
int position = 0;
for (int i = 0; i < ListPodij.Count; i++)
if (ListPodij[i].Time > podiy.Time)
{
position = i;
break;
}
else position = ListPodij.Count;
ListPodij.Insert(position, podiy);
}
public void QueryResourse()
{
addPodiy(new Podiy(Podiy.TypPodij.Give, ZagalnKilkZamovl, Tmodel));
ZagalnKilkZamovl++;
double time = Tmodel + exponent(TSpost);
addPodiy(new Podiy(Podiy.TypPodij.Post, ZagalnKilkZamovl, time));
dataGridView1[0, dataGridView1.RowCount - 2].Value = PodiyCurr.Nzayvka;
dataGridView1[1, dataGridView1.RowCount - 2].Value = "прибуття";
dataGridView1[2, dataGridView1.RowCount - 2].Value = Tmodel;
dataGridView1.RowCount++;
ListPodij.Remove(PodiyCurr);
}
public void GiveResourse()
{
if (KanalBusy == true)
{
ChergaZayvok.Add(new Zayvka(PodiyCurr.Nzayvka,
PodiyCurr.Time, exponent(TSserv)));
int queueLength = ChergaZayvok.Count;
if (LcherMax < queueLength)
{
LcherMax = ChergaZayvok.Count;
}
}
else
{
KanalBusy = true;
double time = Tmodel + exponent(TSserv);
addPodiy(new Podiy(Podiy.TypPodij.Free, ZagalnKilkZamovl - 1, time));
}
dataGridView1[0, dataGridView1.RowCount - 2].Value = PodiyCurr.Nzayvka;
dataGridView1[1, dataGridView1.RowCount - 2].Value = "виділення ресурсу";
dataGridView1[2, dataGridView1.RowCount - 2].Value = Tmodel;
dataGridView1.RowCount++;
ListPodij.Remove(PodiyCurr);
}
public void FreeResourse()
{
int queueLength;
double delayTime;
queueLength = ChergaZayvok.Count;
dataGridView1[0, dataGridView1.RowCount - 2].Value = PodiyCurr.Nzayvka;
dataGridView1[1, dataGridView1.RowCount - 2].Value = "покидання системи";
dataGridView1[2, dataGridView1.RowCount - 2].Value = Tmodel;
dataGridView1.RowCount++;
ListPodij.Remove(PodiyCurr);
if (queueLength == 0)
{
KanalBusy = false;
}
else
{
double time = Tmodel + ChergaZayvok[0].Harak.Tserv;
addPodiy(new Podiy(Podiy.TypPodij.Free, ChergaZayvok[0].Harak.Nzayvka, time));
delayTime = Tmodel - ChergaZayvok[0].Harak.Tpost;
if (TochMax < delayTime)
{
TochMax = delayTime;
}
Toch += delayTime;
ChergaZayvok.RemoveAt(0);
}
}
public void NewStatistika()
{
double timeSinceLastEvent;
timeSinceLastEvent = Tmodel - TOstanPodij;
TOstanPodij = Tmodel;
Lcher += ChergaZayvok.Count * timeSinceLastEvent;
TZagalnObslug += (KanalBusy == true) ? 1 : 0 * timeSinceLastEvent;
}
private void button1_Click(object sender, EventArgs e)
{
dataGridView1.RowCount = 2;
X = Convert.ToInt32(textBox1.Text);
TZagalnImit = Convert.ToInt32(textBox2.Text);
A = X;
TSpost = Convert.ToInt32(textBox3.Text);
TSserv = Convert.ToInt32(textBox4.Text);
Tmodel = 0.0;
KanalBusy = false;
LcherMax = 0;
TOstanPodij = 0.0;
ZagalnKilkZamovl = 0;
Toch = 0.0;
TochMax = 0.0;
Lcher = 0.0;
TZagalnObslug = 0.0;
ZagalnKilkZamovl++;
double time = Tmodel + exponent(TSpost);
addPodiy(new Podiy(Podiy.TypPodij.Post, ZagalnKilkZamovl, time));
while (Tmodel < TZagalnImit)
{
PodiyCurr = ListPodij[0];
TypePodijNext = PodiyCurr.typ;
Tmodel = PodiyCurr.Time;
NewStatistika();
switch (TypePodijNext)
{
case Podiy.TypPodij.Post:
QueryResourse();
break;
case Podiy.TypPodij.Give:
GiveResourse();
break;
case Podiy.TypPodij.Free:
FreeResourse();
break;
}
}
label12.Text = Convert.ToString(TZagalnObslug / Tmodel);
label13.Text = Convert.ToString(TZagalnObslug / (ZagalnKilkZamovl - 1));
label14.Text = Convert.ToString((TZagalnObslug / (ZagalnKilkZamovl - 1))
+ (Toch / (ZagalnKilkZamovl - 1)));
label15.Text = Convert.ToString(Toch / (ZagalnKilkZamovl - 1));
label16.Text = Convert.ToString(TochMax);
label17.Text = Convert.ToString(LcherMax);
label18.Text = Convert.ToString(Lcher / Tmodel);
}
private void Form1_Load(object sender, EventArgs e)
{
m = Convert.ToInt64(Math.Pow(2.0, 20.0));
dataGridView1.RowCount = 2;
dataGridView1.ColumnCount = 3;
dataGridView1.Columns[0].Name = "№ of application";
dataGridView1.Columns[0].Width = 50;
dataGridView1.Columns[1].Name = "The type of event";
dataGridView1.Columns[1].Width = 200;
dataGridView1.Columns[2].Name = "The modeling time";
dataGridView1.Columns[2].Width = 200;
}
}
}
Результат виконання:
/
Висновок: Під час виконання даної лабораторної роботи я ознайомився з методом імітаційного моделювання по подіях із змінним приростом кроку часової змінної для дослідження систем масового обслуговування. На основі отриманих знань написав програму яка методом імітаційного моделювання із змінним приростом кроку досліджує систему масового обслуговування.