Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Моделирование работы системы массового обслуживания

Поиск

1) Постановка задачи

Требуется произвести расчет режимов работы следующей системы: есть касса, кассир продает билет, время обслуживания случайно, клиенты подходят и становятся в очередь, очередь ограничена. Требуется построить имитационную СМО и поиграв параметрами найти зависимости длины средней очереди от среднего времени обслуживания клиентов, определить вероятность простоя кассира, % обслуженных клиентов зависит от интенсивности работы кассира.

2) Посторенние физической модели

1). Генератор

Входной поток клиентов простейший. Генератор посылает заявку в очередь, генерирует промежуток времени до следующей заявки.

2). Очередь ремонта

Входные сигналы:

- от генератора в очередь пришла заявка, тогда состояние очереди увеличится на1;

- забрать заявку из очереди при этом состояние очереди уменьшается на 1.

Выходные сигналы:

- очередь выдает сигнал кассиру, что на очереди есть заявка;

- передача заявки в кассу;

- очередь перегружена, заявку принять не может.

3). Касса

Z=1 – простой

Z=2 – работа

Кассир простаивает в режиме ожидания, пришел клиент, становится в очередь, очереди нет, следовательно, в очереди 1ая заявка. Кассир генерирует выходной сигнал забрать заявку из очереди. Очередь посылает на обслуживание. В момент обслуживания на сигналы из очереди касса не реагирует. В состоянии обслуживания кассир находится в течение случайного времени. Время обслуживания закончилось, нужно подать автомату сигнал о том, что он освободился. При этом также должны подаваться сигналы из очереди, что там находятся клиенты.


3) Создание математической модели

Касса

Входные сигналы:

- 1 – закончить работу СМО;

- 2 – из очереди пришла информация, что в ней появилась заявка;

- 3 - из очереди на обслуживание пришла реальная заявка.

Выходные сигналы:

- 1 – кассир приступил к работе по обслуживанию заявки;

- 2 – запрос у очереди взять заявку;

- 3 – заявка обслужена, ушла из системы, и одновременно идет сигнал забрать заявку из очереди.

Автоматная таблица состояний:

S            
Z
             
             

Очередь

Входные сигналы:

- 1 – заявка пришла в очередь;

- 2 – забрать заявку из очереди.

Выходные сигналы:

- 1 – очередь сообщает кассиру, что в пустой очереди появился заявка;

- 2 – передача заявки из очереди кассиру;

- 3 – очередь отказывается ставить клиента, переполнена.

Пришла заявка в очередь при 3ёх ситуциях:

1) если очередь пустая, то очередь с состоянием 0 и на выходе 1;

2) если промежуточная, то число заявок увеличилось на 1, на выходе ничего не изменилось;

3) если очередь максимальна, то на выходе = 3.

Генератор

Входные сигналы:

- 1 - сгенерировать заявку;

Выходные сигналы:

- 1 – отправить заявку на очередь.

Модельное время

В нашей модели используется принцип изменения модельного времени по особым состояниям. Это состояние – смена состояний под воздействием входных и выходных сигналов.

Для организации передачи сигналов используется понятие событие.

Событие – это массив из 3ёх чисел

Sob=[time, kto, sign]

time – время события

kto – кто получает сигнал

sign – номер входного сигнала

Список событий –это матрица вида

  time kto sign
       
       
k timek ktok signk
     
Nsob      

 

Sob[k,:)=[timek, ktok, signk]

 

 

Вносим в список событий событие с заданными параметрами:

function putsob(time,kto,Sign);

global Nsob sob;

 

Nsob=Nsob+1; % Число записей в списке увеличиваем на 1

sob(Nsob,1:3)=[time,kto,Sign]; % Заносим в последнюю строку списка информацию о событии

 

Получить очередное событие с наименьшим временем из списка:

function z=getsob;

global Nsob sob

 

if Nsob==0 % Если список пуст

z=[]; return;

else

[tmin,k]=min(sob(:,1)); % Ищем индекс "к" у события с минимальным временем

z=sob(k,:); % Возвращаем найденное событие (строка с номером к)

sob(k,:)=[]; % Вычеркиваем найденную строку из списка

Nsob=Nsob-1; % Уменьшаем количество записей в списке

end

Программа моделирования самой СМО:

function model_smo

global t Tmod

init; % Инициализация исходных данных

 

while t < Tmod; % Цикл по времени до конца моделирования

sob=getsob; % Получение очередного события с наименьшим временем sob=[t,kto,Sign]

 

t=sob(1); % Коррекция модельного времени

kto=sob(2); % Кто получает текущий сигнал

sign=sob(3); % Номер сигнала

 

switch kto

 

case {1} % Работа генератора заявок

generator(sign);

 

case {2} % Работа накопителя

ochered(sign);

 

case {3} % Работа канала обслуживания

kassa(sign);

 

end % end switch

end % end while

 

pprint; % Вывод результатов

 

Инициализация исходных данных:

function init;

global t Kas Tmod Och otk lambda mju obsl Nsob sob

 

t=0; % Текущее модельное время

Tmod=1000; % Время окончания моделирования

otk=0; % Количество заявок, которым отказано в обслуживании

obsl=0; % Количество обслуженных заявок

 

mju=1; % Интенсивность обслуживания каналом заявок

lambda=1; % Интенсивность появления заявок

 

Nsob=1; % Количество событий в списке

sob(Nsob,1:3)=[0,1,1]; % Инициализация первого события

 

Kas=struct(... % Структура с данными канала обслуживания

'Z',1,... % Номер текущего состояния

'Tvh',0,... % Время входа в текущее состояние

'nZ',[0,0],... % Счетчики состояний

'tZ',[0,0],... % Счетчики продолжительности состояний

'mZ',0,... % Подсчет среднего состояния

'TabZ',[1,1,2; 1,2,0],... % Автоматная таблица состояний

'TabVs',[0,2,1; 3,0,0]); % Таблица выходных сигналов

 

Och=struct(... % Структура с данными очереди

'N',0,... % Число заявок в очереди

'n0',0,... % Счетчик числа нулевых состояний очереди

'tn0',0,... % Счетчик времени нулевого состояния

'nNmax',0,... % Счетчик числа максимальных состояний

'tnNmax',0,... % Счетчик времени максимального состояния

'mN',0,... % Подсчет среднего состояния

'tvh',0,... % Время входа в текущее состояние

'Nmax',8); % Максимальное число заявок в очереди

 

Моделирование работы кассы:

function kassa(s);

global t obsl mju Kas

 

[vhd,Kas]=avtwork(Kas,s);

switch vhd

case {0}; % Нет выходного сигнала

 

case {1} % Опрелеление времени окончания обслуживания

putsob(t+pokdat(mju),3,1);

case {2} % Взять заявку из очереди на обслуживание

putsob(t,2,2);

case {3} % Заявка обслужена, забираем следующую из очереди

putsob(t,2,2);

obsl=obsl+1; % Подсчет обслуженных заявок

end

 

Моделирование работы накопителя:

function [vhd,nak]=nakwork(nak,s);

global t

 

n=nak.N; % Число заявок в очереди (номер состояния)

nst=n; % Старое количество заявок в очереди

dT=t-nak.tvh; % Время от смены посл. состояния

 

if nst==0 % Если очередь пуста

 

switch s % Входной сигнал

 

case {1} % Пришла заявка

n=n+1; % Число заявок увеличилось на 1

nak.n0=nak.n0+1; % Число нулевых состояний увеличилось на 1

nak.tn0=nak.tn0+dT; % Общее время нулевого состояния

vhd=1; % Выходной сигнал - пришла заявка

 

case {2} % Взяли заявку

vhd=0; % Пустой сигнал, т.к. в очереди не было заявок

end

end

 

if (0 < nst)&(nst < nak.Nmax) % Очередь промежуточная

 

switch s % Сигнал

 

case {1} % Пришла заявка

n=n+1; % Число заявок увеличилось на 1

vhd=0; % Пустой сигнал, т.к. об этом сообщать не надо

 

case {2} % Взяли заявку

n=n-1; % Число заявок уменьшилось на 1

vhd=2; % Выходной сигнал - пошла заявка на обслуживание

end

end

 

if nst == nak.Nmax % Максимальная очередь

 

switch s % Сигнал

case {1} % Пришла заявка

vhd=3; % Заявка не обслуживается - выходной сигнал

case {2} % Взяли заявку

n=n-1; % Число заявок уменьшилось на 1

nak.nNmax=nak.nNmax+1; % Счетчик числа максимальных состояний очереди

nak.tnNmax=nak.tnNmax+dT; % Счетчик общего времени максимального состояния

vhd=2; % Выходной сигнал - пошла заявка на обслуживание

end

end

 

if n ~= nst % Состояние изменилось

 

nak.mN=nak.mN+dT*nst; % Подсчет средней длины очереди

nak.tvh=t; % Запоминаем время входа в новое состояние

nak.N=n; % Новое состояние делаем текущим

end

 

Моделирование работы очереди:

function ochered(s);

global otk t Och

 

[vhd,Och]=nakwork(Och,s); %

 

switch vhd

case {0}; % Нет выходного сигнала

 

case {1} % Сообщение каналу о пришедшей заявке

putsob(t,3,2);

case {2} % Передача заявки в канал для обслуживания

putsob(t,3,3);

case {3} % Очередь переполнена

otk=otk+1; % Подсчет заявок, которым отказано в обслуживании

end

 


Генератор потока заявок:

function generator(s);

global t lambda

 

putsob(t+pokdat(lambda),1,1); % Определение времени следующей заявки

putsob(t,2,1); % Помещение события в список событий

 

Вывод результатов моделирования:

function pprint;

global Tmod Kas Och obsl otk

 

obsl % Число обслуженных заявок

otk % Число отказов в обслуживании

 

procOtk=otk/(otk+obsl)*100 % Процент отказанных заявок

Nz=sum(Kas.nZ); % Суммируем число всех наблюдаемых состояний

procZ=Kas.nZ/Nz % Процент количества каждого состояния среди всех

sredT=Kas.tZ./Kas.nZ % Среднее время нахождения в каждом состоянии

verZ=Kas.tZ./Tmod % Вероятность каждого состояния

Mz=Kas.mZ/Tmod % Мат. ожидание (среднее состояние)

 

sredN=Och.mN/Tmod % Средняя длина очереди

 

if Och.n0 > 0 % Если есть нулевые (пустые) состояния очереди

sredT_0=Och.tn0/Och.n0 % Среднее время нахождения в нулевом состоянии

else

sredT_0=0

end

ver_0=Och.tn0/Tmod % Вероятность нулевого состояния

 

if Och.nNmax > 0 % Если есть максимальные состояния очереди (очередь заполнена)

sredT_max=Och.tnNmax/Och.nNmax % Среднее время нахождения в максимальном состоянии

else

sredT_max=0

end

ver_max=Och.tnNmax/Tmod % Вероятность максимального состояния

 




Поделиться:


Последнее изменение этой страницы: 2016-08-16; просмотров: 255; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.135.208.189 (0.007 с.)