Моделирование процесса обслуживания в СМО

Министерство образования и науки РФ

ГОУ ВПО

Воронежский ГАСУ

Кафедра Прикладной информатики и информационных систем

 

 

Отчет по лабораторной работе №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.

 

 

Результаты работы программы :