Моделирование процесса обслуживания в СМО
Министерство образования и науки РФ
ГОУ ВПО
Воронежский ГАСУ
Кафедра Прикладной информатики и информационных систем
Отчет по лабораторной работе №4
По дисциплине: «Теория информационных процессов и систем»
Выполнил: Дудкин И.С.
Студент гр.2341Б
Принял:Сысоев Д.В.
Воронеж 2013
Цель работы:
Сравнить значения характеристик качества для СМО с явными потерями, полученных в результате моделирования и рассчитанных по первой формуле Эрланга.
Моделирование процесса обслуживания в СМО
Функция распределения промежутка между вызовами , а функция распределения длительности обслуживания
. Программа моделирования содержит два генератора случайных величин Z и x в соответсвтии с заданными функциями A(t) и B(t), переменные to хранения момента поступления очередного вызова и t1, t2,..., tv для хранения момента освобождения i-го (
) канала.
Для упрощения пояснений примем v=3 и проанализируем работу алгоритма с момента поступления пятого вызова. Первый генератор формирует очередное случайное число z5, что соответствует поступлению пятого вызова to = z1 + z2 + z3 + z4 + z5. Предположим, что до момента to первый канал был занят четвертым вызовом, а второй и третий, соответственно вторым и третьим. Тогда: t1 = z1 + z2 + z3 + z4 + x4, t2 = z1 + z2 + x2, t3 = z1 + z2 + z3 + x3. Каждое из чисел t1 , t2,, t3 определяет момент освобождения соответствующего канала.
При последовательном занятии каналов значение to поочередно сравнивается с t1 , t2,, tv, пока не обнаруживается ячейка с моментом освобождения . Пусть окажется что
и
, а
. Это означает, что к моменту поступления пятого вызова первый и второй канал оставались занятыми, а третий уже освободился и может принять на обслуживание поступивший пятый вызов. Тогда t3 присваивается t0 . Затем генерируется случайное число x5, определяющее длительность обслуживания пятого вызова. Добавлением числа x5 к t3 пятый цикл завершается.
Шестой цикл начинается с генерации случайного числа z6. Как и прежде, t0 = t0+z6. Затем осуществляется поочередное сравнение содержимого нулевой ячейки с содержимым остальных ячеек. Если теперь окажется что, ,
и
, то шестой вызов будет потерян и на этом цикл закончится.
Для подсчета числа поступивших Квыз и потерянных Кпот. вызовов используются два счетчика. В первый добавляется единица при каждой генерации числа z, а во второй - при каждой потере вызова. Отношение Квыз/Кпот. даст по окончании очередной серии статистическую оценку потерь вызовов.
Листинг программы :
unit Unit1;
interface
uses
Windows, Messages, Math, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls;
type
TForm1 = class(TForm)
Label1: TLabel;
Button1: TButton;
Label2: TLabel;
Edit1: TEdit;
ListBox1: TListBox;
Edit2: TEdit;
Label3: TLabel;
Edit3: TEdit;
Label4: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
var
Pb
,T1,T2,Z,E
,L
,SJ
:real;
n,i,j,v,k,h:integer;
T:array[0..100] of real;
t_true:Boolean;
function fact(n : integer) : integer;
begin
if n <= 1 then fact := 1
else fact := n * fact(n - 1);
end;
function r1 : real;
begin
r1:=-ln(random)/L;
end;
function r2 : real;
begin
r2:=-h*ln(random);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
n:=StrToInt(Edit1.Text);
v:=StrToInt(Edit2.Text);
h:=StrToInt(Edit3.Text);
With Form1.ListBox1.Items do
Begin
Clear;
Add(#13#10);
L:=(n+1)*10/(n+4);
T1:=n+1;
T2:=n+200;
Randomize;
for i:=0 to v do
t[i]:=0;
i:=0;
k:=0;
SJ:=0;
t[1]:=r1;
t[2]:=t[1];
t[1]:=t[1]+r2;
t[2]:=t[2]+r1+r2;
j:=3;
while T1<T2 do
begin
i:=i+1;
z:= r1;
E:= r2:
t[0]:=t[0]+z;
t_true:=False;
while (j<=v) and (t_true=false) do
begin
if t[0]>t[j] then
begin
t[j]:=t[0]+E;
t_true:=True;
Add('K['+IntToStr(j)+']z[0]..'+'z['+IntToStr(i)+']E');
end;
j:=j+1;
end;
T1:=T1+Z;
j:=1;
if t_true then
T1:=T1+E
else k:=k+1;
end;
L:=L*h;
Add(#13#10);
Add('Квыз: '+IntToStr(i));
Add(#13#10);
Add('Кпот: '+IntToStr(k));
Add(#13#10);
Add('Pb модульное: '+FloatToStr(k/i));
Add(#13#10);
for j:=0 to v do
SJ:=SJ+power(L,j)/fact(j);
Add('Pb по форм. Эрланга: '+FloatToStr((power(L,v)/fact(v))/SJ));
Add(#13#10);
end;
end;
end.
Результаты работы программы :