Частина тексту файла (без зображень, графіків і формул):
МІНІСТЕРСТВО ОСВІТИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
КАФЕДРА ПРОГРАМНОГО ЗАБЕЗПЕЧЕННЯ
Звіт
До лабораторної роботи № 3
На тему: “ Імітаційне моделювання виробничих систем з використанням моделей систем масового обслуговування ”
З дисципліни : "Моделювання програмного забезпечення"
Мета роботи:
Сформувати реалізації випадкових потоків однорідних подій із заданим законом розподілу, необхідних для моделювання виробничої системи з використанням моделі у вигляді системи масового обслуговування.
Реалізувати моделюючий алгоритм імітаційного моделювання системи масового обслуговування, що представляє виробничу систему.
Провести імітаційне моделювання системи масового обслуговування і статистичний аналіз результатів моделювання.
Код програми
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Lab3_MPZ
{
class ExponentDistribution
{
protected Random Rand;
protected double L;
protected double Last;
protected double maxElem;
public double MaxElem
{
get { return maxElem; }
set { maxElem = value; }
}
protected List<double> sequence;
public List<double> Sequence
{
get { return sequence; }
set { ;}
}
protected ExponentDistribution()
{
}
public ExponentDistribution(int nL)
{
L = nL;
MaxElem = 0;
Rand = new Random((int)DateTime.Now.Ticks);
sequence = new List<double>();
Last = 0;
}
public ExponentDistribution(int nL, int nMaxElem)
{
L = nL;
MaxElem = nMaxElem;
Rand = new Random((int)DateTime.Now.Ticks);
sequence = new List<double>();
Last = 0;
}
public virtual double Next()
{
double Xi = (double)Rand.Next() / int.MaxValue;
Last += ((-1.0) / L) * Math.Log(1 - Xi);
Sequence.Add(Last);
return Last;
}
public virtual double NextElement()
{
double Xi = (double)Rand.Next() / int.MaxValue;
return (((-1.0) / L) * Math.Log(1 - Xi));
}
public double this[int pos]
{
get
{
if (pos <= (Sequence.Count - 1))
return Sequence[pos];
else
return Sequence[Sequence.Count - 1];
}
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Lab3_MPZ
{
class EvenDistribution : ExponentDistribution
{
protected double B;
public EvenDistribution(int nL)
: base(nL)
{
B = 2.0 / L;
}
public EvenDistribution(int nL, int nMaxElem)
: base(nL, nMaxElem)
{
B = 2.0 / L;
}
public override double Next()
{
double Xi = (double)Rand.Next() / int.MaxValue;
Last += B * Xi;
Sequence.Add(Last);
return Last;
}
public override double NextElement()
{
double Xi = (double)Rand.Next() / int.MaxValue;
return (B * Xi);
}
}
}
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 Lab3_MPZ
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void ModelingButton_Click(object sender, EventArgs e)
{
ExponentDistribution ComeTime;
ExponentDistribution WaitTime;
ExponentDistribution WorkTime;
double T;
try
{
T = double.Parse(TInputBox.Text);
}
catch
{
MessageBox.Show("Помилка при введенні часу функціонування системи");
TInputBox.Text = "";
return;
}
int L;
try
{
L = int.Parse(LInput.Text);
}
catch
{
MessageBox.Show("Помилка при введенні L");
LInput.Text = "";
return;
}
if (ComeExponent.Checked)
ComeTime = new ExponentDistribution(L);
else
ComeTime = new EvenDistribution(L);
if (WaitExponent.Checked)
WaitTime = new ExponentDistribution(L);
else
WaitTime = new EvenDistribution(L);
if (WorkExponent.Checked)
WorkTime = new ExponentDistribution(L);
else
WorkTime = new EvenDistribution(L);
int NAccepted = 0;
int NDenied = 0;
double Tj = 0;
double Tzv = 0;
double TMaxWait = 0;
double Tbegin = 0;
double Twork = 0;
double Twait = 0;
do
{
Tj = ComeTime.Next();
if(Tj < T)
{
if(Tj < Tzv)
{
TMaxWait = WaitTime.NextElement();
if( (Tj+TMaxWait) < Tzv)
{
NDenied++;
continue;
}
else
{
Twork = WorkTime.NextElement();
if ( (Tzv + Twork) < T)
{
Tbegin = Tzv;
Tzv = Tbegin + Twork;
NAccepted++;
Twait += (Tbegin - Tj);
continue;
}
else
{
NDenied++;
continue;
}
}
}
else
{
Twork = WorkTime.NextElement();
if ((Tj + Twork) < T)
{
Tbegin = Tj;
Tzv = Tbegin + Twork;
NAccepted++;
Twait += (Tbegin - Tj);
continue;
}
else
{
NDenied++;
continue;
}
}
}
else
{
break;
}
}
while(true);
OutputBox.Text = string.Format("Виконано заявок : {0}\r\nВідхилено заявок : {1}\r\nСередній час очікування в черзі : {2}" +
"\r\n\r\nПроцент відкидання заявок : {3:F2}%",
NAccepted, NDenied, Twait / (double)NAccepted, (double)NDenied / (double)(NAccepted + NDenied) * 100);
}
}
}
Результат виконання завдання:
Висновок: в даній роботі я навчився формувати реалізації випадкових потоків однорідних подій із заданим законом розподілу, необхідних для моделювання виробничої системи з використанням моделі у вигляді системи масового обслуговування. Я реалізував моделюючий алгоритм імітаційного моделювання системи масового обслуговування, що представляє виробничу систему та провів імітаційне моделювання системи масового обслуговування і статистичний аналіз результатів моделювання.