47065 (608060), страница 4
Текст из файла (страница 4)
Заключение
В данной работе рассмотрены основные методы моделирования СМО и расчета показателей их эффективности.
Проведено моделирование четырехканальной СМО с максимальной длиной очереди равной 4 с помощью уравнений Колмогорова, а также, найдены финальные вероятности состояний системы. Рассчитаны показатели ее эффективности.
Проведено имитационное моделирование работы такой СМО. На языке программирования Delphi составлена программа, имитирующая ее работу. Проведена серия расчетов, по результатам которых найдены значения показателей эффективности системы и выполнена их статистическая обработка.
Полученные при имитационном моделировании результаты согласуются с результатами аналитического моделирования.
Литература
-
Вентцель Е.С. Исследование операций. – М.: Дрофа, 2004. – 208 с.
-
Волков И.К., Загоруйко Е.А. Исследование операций. – М.: Изд.-во МГТУ им. Н.Э. Баумана, 2002. – 435 с.
-
Волков И.К., Зуев С.М., Цветкова Г.М. Случайные процессы. – М.: Изд.-во МГТУ им. Н.Э. Баумана, 2000. – 447 с.
-
Гмурман В.Е. Руководство к решению задач по теории вероятностей и математической статистике. – М.: Высшая школа, 1979. – 400 с.
-
Ивницкий В.Л. Теория сетей массового обслуживания. – М.: Физматлит, 2004. – 772 с.
-
Исследование операций в экономике/ под ред. Н.Ш. Кремера. – М.: Юнити, 2004. – 407 с.
-
Таха Х.А. Введение в исследование операций. – М.: ИД «Вильямс», 2005. – 902 с.
-
Харин Ю.С., Малюгин В.И., Кирлица В.П. и др. Основы имитационного и статистического моделирования. – Минск: Дизайн ПРО, 1997. – 288 с.
Приложение 1
Листинг программы аналитического моделирования
Программа написана в математическом пакете Maple 8.
> # Дано
la:=4:
m:=1:
Находим финальные вероятности
> usl := {m*Pf[1]-la*Pf[0] = 0,
2*m*Pf[2]-la*Pf[1] = 0,
3*m*Pf[3]-la*Pf[2] = 0,
3*m*Pf[4]-la*Pf[3] = 0,
3*m*Pf[5]-la*Pf[4] = 0,
Pf[0]+Pf[1]+Pf[2]+Pf[3]+Pf[4]+Pf[5]= 1 }:
> s:=evalf(solve(usl) ):
> for i from 0 by 1 to 5 do
Pf[i]:=subs( s, Pf[i] );
end;
>
> # Уравнения Колмогорова
> del_t:=0.01: #шаг по времени
T:=10: # Время, за которое система выходит на стационарный режим
N:=trunc(T/del_t); # Число шагов
>
> # Присваиваем начальные значения
p[i,c]:=array(0..5,0..N):
p[0,0]:=1:
for i from 1 by 1 to 5 do p[i,0]:=0 end:
> # Метод Эйлера
jj:=0:
for k from 1 to N do
v:=jj:
j:=trunc(100*v):
jj:=jj+del_t:
p[0,k] := p[0,j]+( m*p[1,j]-la*p[0,j])*del_t:
p[1,k] := p[1,j]+( la*p[0,j]+2*m*p[2,j]-p[1,j]*(m+la) )*del_t:
p[2,k] := p[2,j]+( la*p[1,j]+3*m*p[3,j]-p[2,j]*(2*m+la) )*del_t:
p[3,k] := p[3,j]+( la*p[2,j]+3*m*p[4,j]-p[3,j]*(3*m+la) )*del_t:
p[4,k] := p[4,j]+( la*p[3,j]+3*m*p[5,j]-p[4,j]*(3*m+la) )*del_t:
p[5,k] := p[5,j]+( la*p[4,j]-3*m*p[5,j] )*del_t:
end:
> for i from 0 by 1 to 5 do
P[i]=p[i,N];
end;
> # Cравним финальные вероятности с вероятностями при Т=10, водно, что они близки. R-ошибка
for i from 0 by 1 to 5 do
# Pf[i]=p[i,N]:
R[i]:=abs(Pf[i]-p[i,500]);
end;
>
> # Показатели эффективности системы
# вероятность отказа
p_otk:=Pf[5];
> # относительная пропускная способность
Q := 1-p_otk;
> # абсолютная пропускная способность
A := la*Q;
> # длина очереди
lo := Pf[4]+2*Pf[5];
> # среднее время в очереди
t0 := lo/la;
> # среднее число каналов
K := (la/m)*Q;
>
> # Вывод графиков вероятностей
cur[i]:=array(0..5):
for i from 0 by 1 to 5 do
cur[i]:=CURVES([[0,p[i,0]],[0.05,p[i,5]],[0.07,p[i,7]],[0.1,p[i,10]],[0.15,p[i,15]],
[0.2,p[i,20]],[0.3,p[i,30]],[0.4,p[i,40]],[0.5,p[i,50]],[0.75,p[i,75]],[1,p[i,100]],
[1.25,p[i,125]],[1.5,p[i,150]],[1.75,p[i,175]],[2,p[i,200]],[2.5,p[i,250]],[3,p[i,300]],
[4,p[i,400]],[5,p[i,500]] ]):
end:
> i:=0: a[i]:=PLOT(cur[i],COLOR(RGB,0,0,0)): # P0 - черный
i:=1: a[i]:=PLOT(cur[i],COLOR(RGB,0,0,1)): # P1 - синий
i:=2: a[i]:=PLOT(cur[i],COLOR(RGB,1,0,0)): # P2 - красный
i:=3: a[i]:=PLOT(cur[i],COLOR(RGB,0,1,1)): # P3 - голубой
i:=4: a[i]:=PLOT(cur[i],COLOR(RGB,1,0,1)): # P4 - малиновый
i:=5: a[i]:=PLOT(cur[i],COLOR(RGB,0,1,0)): # P5 - зеленый
> display({a[0],a[1],a[2],a[3],a[4],a[5]});
Приложение 2
Листинг программы имитационного моделирования
Программа написана на языке Delphi7.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace CMO_misiagin
{
class CMO_work
{
Random R; // Генератор случайных чисел
public uint Max_dlina_ocheredi; // Максимальная длина очереди
public uint chislo_kanalov_in_system; // Число каналов в системе
public double Lamda; // Интенсивность потока поступления заявок
public double Mu; // Интенсивность потока обслуживания заявок
public double shag_by_time; // Шаг по времени
public double[] t_oconch_obsl_vo_vsex_canalax; // Время окончания обслуживания заявки во всех каналах
public double[] t_v_sostoijaniax_s_ocher; // Время пребывания СМО в состояниях с очередью
public double t_rab_sistem; // Время работы системы
public double summ_t_obsl_zaijvok; // Суммарное время обслуживания заявок
public uint chislo_post_zaijavok; // Число поступивших заявок
public uint chislo_otkaz_zaijavok; // Число отказанных заявок
public uint chislo_obslu_zaijavok; // Число обслуженных заявок
uint dlina_ocheredi; // Длина очереди
public uint Dlina_ocheredi
{
get
{ return dlina_ocheredi; }
set
{
if (value < 0)
{ dlina_ocheredi = 0; }
else if (value > 2)
{ }
else
{ dlina_ocheredi = value;}
}
}
// Состояния СМО {ССС,ССЗ,СЗС,ЗСС,СЗЗ,ЗСЗ,ЗЗС,ЗЗЗ,ЗЗЗ+1,ЗЗЗ+2}
enum Sostoijanija_sustem { S0, S1, S2, S3, S4, S5, S6, S7, S8, S9};
Sostoijanija_sustem tekushee_sost_sustem; // Текущее состояние системы
///
/// Представляет модель системы массового обслуживания (СМО)
///
/// Число каналов в системе
/// Максимальная длина очереди
/// Интенсивность потока поступления завок
/// Интенсивность потока обслуживания завок
/// Шаг по времени
public CMO_work(uint p_chislo_kanalov_in_system, uint p_Max_dlina_ocheredi, double p_Lamda, double p_Mu, double p_shag_by_time)
{
SetDefaults();
R = new Random();
chislo_kanalov_in_system = p_chislo_kanalov_in_system;
Max_dlina_ocheredi = p_Max_dlina_ocheredi;
Lamda = p_Lamda;
Mu = p_Mu;
shag_by_time = p_shag_by_time;
t_oconch_obsl_vo_vsex_canalax = new double[chislo_kanalov_in_system];
t_v_sostoijaniax_s_ocher = new double[Max_dlina_ocheredi];
}
///
/// Устанавливает значения параметров СМО по умолчанию
///
public void SetDefaults()
{
tekushee_sost_sustem = Sostoijanija_sustem.S0;
chislo_post_zaijavok = 0;
chislo_otkaz_zaijavok = 0;
chislo_obslu_zaijavok = 0;
t_rab_sistem = 0;
summ_t_obsl_zaijvok = 0;
dlina_ocheredi = 0;
for (int i = 0; i < chislo_kanalov_in_system; i++)
{ t_oconch_obsl_vo_vsex_canalax[i] = 0; }
for (int i = 0; i < Max_dlina_ocheredi; i++)
{ t_v_sostoijaniax_s_ocher[i] = 0; }
}
///
/// Определяет случайным образом, поступила ли заявка
///
/// true - поступила, false = не поступила
bool prichla_li_sluchain_zaijavka()
{
double r = R.NextDouble();
if (r < (shag_by_time * Lamda))
{ return true; }
return false;
}
///
/// Определяет случайным образом время облуживания заявки
///
/// Время облуживания заявки
double t_obslujivania_zaijvki()
{
double r = R.NextDouble();
return (-1/Mu*Math.Log(1-r, Math.E));
}
///
/// Определение текущего состояния
///
/// Состояние системы
Sostoijanija_sustem opred_tec_sost()
{
Sostoijanija_sustem _sostoijanija_sustem = Sostoijanija_sustem.S0;
int k = 0;
int zanijat_chislo_kanalov_in_system = 0;
for (int i = 0; i < chislo_kanalov_in_system; i++)
{
if (t_oconch_obsl_vo_vsex_canalax[i] > 0)
{
k = 1;
zanijat_chislo_kanalov_in_system++;
}
else
{ k = 0; }
_sostoijanija_sustem += k * (i + 1);
}
if (zanijat_chislo_kanalov_in_system > 1)
{ _sostoijanija_sustem ++; }
return _sostoijanija_sustem + (int)dlina_ocheredi;
}
///
/// Один шаг моделирования системы
///
public void modelirovanie_sustem()
{
t_rab_sistem += shag_by_time;
tekushee_sost_sustem = opred_tec_sost();
if (dlina_ocheredi > 0)
{
t_v_sostoijaniax_s_ocher[dlina_ocheredi - 1] += shag_by_time;
for (int i = 0; i < chislo_kanalov_in_system; i++)
{
if (t_oconch_obsl_vo_vsex_canalax[i] <= 0)
{
t_oconch_obsl_vo_vsex_canalax[i] = t_obslujivania_zaijvki();
summ_t_obsl_zaijvok += t_oconch_obsl_vo_vsex_canalax[i];
dlina_ocheredi--;
break;
}
}
}
if (prichla_li_sluchain_zaijavka())
{
chislo_post_zaijavok++;
if (dlina_ocheredi < Max_dlina_ocheredi)
{
chislo_obslu_zaijavok++;
if (tekushee_sost_sustem < Sostoijanija_sustem.S7)
{
for (int i = 0; i < chislo_kanalov_in_system; i++)
{
if (t_oconch_obsl_vo_vsex_canalax[i] <= 0)
{
t_oconch_obsl_vo_vsex_canalax[i] = t_obslujivania_zaijvki();
summ_t_obsl_zaijvok += t_oconch_obsl_vo_vsex_canalax[i];
break;
}
}
}
else
{ dlina_ocheredi++; }
}
else
{ chislo_otkaz_zaijavok++; }
}
for (int i = 0; i < chislo_kanalov_in_system; i++)
{
if (t_oconch_obsl_vo_vsex_canalax[i] > 0)
{
t_oconch_obsl_vo_vsex_canalax[i] -= shag_by_time;
}
}
}
}
}
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 CMO_misiagin
{
public partial class Form1 : Form
{
CMO_work work;
uint chislo_progonov;
List P, Q, A, K, Lo, To, Percents_otkaz, Percents_Prin;
uint n = 3; // Число каналов
uint m = 2; // MAX длина очереди
public Form1()
{
InitializeComponent();
work = new CMO_work(n, m, (double)numericUpDown1.Value, (double)numericUpDown2.Value, (double)numericUpDown3.Value);
chislo_progonov = 0;
P = new List();
Q = new List();
A = new List();
K = new List();
Lo = new List();
To = new List();
Percents_otkaz = new List();
Percents_Prin = new List();
}
private void Form1_Load(object sender, EventArgs e)
{
button1.Enabled = false;
}
private void Rasschitat_Click(object sender, EventArgs e)
{
if (chislo_progonov>1) button1.Enabled = true;
richTextBox1.Clear();
richTextBox1.Text += " Показатели эффективности: \n";
work.SetDefaults();
work.chislo_kanalov_in_system = n;
work.Max_dlina_ocheredi = m;
work.Lamda = (double)numericUpDown1.Value;
work.Mu = (double)numericUpDown2.Value;
work.shag_by_time = (double)numericUpDown3.Value;
double Time = (double)numericUpDown4.Value;
while (work.t_rab_sistem < Time)
{
work.modelirovanie_sustem();
}
richTextBox1.Text += "Поступило заявок: \t\t\t" + work.chislo_post_zaijavok.ToString() + "\n";
richTextBox1.Text += "Очередь: \t\t\t\t" + work.Dlina_ocheredi.ToString() + "\n";
richTextBox1.Text += "Отклонено заявок: \t\t\t" + work.chislo_otkaz_zaijavok.ToString() + "\n";
// Вероятность отказа