Sei sulla pagina 1di 9

REVISTA DO DETUA, VOL.

2, N 3, SETEMBRO 1998

Demonstrador Animado das Tcnicas de Programao de Simuladores de


Eventos Discretos, utilizando o MATLAB

Elizabeth Fernandez, Rui Valadas

Resumo Este artigo descreve um demonstrador


animado concebido para ilustrar as tcnicas de programao
de um modelo de simulao de eventos discretos. O
demonstrador foi desenvolvido no MATLAB e a ilustrao
feita com base num modelo M/M/1.
Abstract This paper describes an animated demo that
ilustrates the programming techniques for discrete-event
simulators. The demo is based on an M/M/1 queuing system
and was developed using MATLAB.

I. INTRODUO
A simulao em computador consiste na reproduo
da operao de um sistema realizada com o objectivo de
avaliar diferentes caractersticas desse sistema. Na prtica,
a forma como o sistema modelado depende das
caractersticas deste que se pretendem analisar. Por
exemplo, se relativamente cantina da Universidade de
Aveiro, quisermos estimar o tempo mdio que decorre
desde que um aluno chega bicha at que servido por
uma das senhoras, o modelo deve incluir descries dos
processos de chegada dos alunos cantina e do servio
efectuado pelo conjunto das senhoras. No entanto, se
quisermos tambm determinar o nmero de mesas
necessrio para garantir que a probabilidade de um aluno
no encontrar um lugar vago aps ser servido seja
reduzida, o nmero de lugares e o processo que descreve o
tempo de cada refeio devem tambm ser includos no
modelo do sistema.
O estado do sistema, num dado instante de tempo,
pode ser caracterizado atravs de variveis de estado.
Exemplos de variveis de estado no caso da cantina, so o
nmero de senhoras ocupadas (note que podem haver
senhoras desocupadas caso, momentaneamente, no haja
alunos na bicha) e o nmero de alunos na bicha. Podem
distinguir-se dois tipos de sistemas: discretos, em que as
variveis de estado mudam instantaneamente em pontos
separados no tempo e contnuos, em que as variveis de
estado mudam continuamente no tempo.
A simulao de eventos discretos (discrete-event
simulation) [1] [2] [3] consiste na modelao da evoluo
temporal de um sistema, atravs de uma representao na
qual as variveis de estado do sistema mudam de valor em
pontos separados no tempo. Estes instantes de tempo so

aqueles em que ocorre um evento. Um evento ento


definido como uma ocorrncia instantnea que pode
alterar o estado de um sistema.
A simulao de eventos discretos encontra aplicao
em reas to diversificadas como sejam as redes de
telecomunicaes, as arquitecturas de computadores, os
sistemas de trfego rodovirio e os sistemas fabris.
A programao de simuladores de eventos discretos
pode ser feita recorrendo a linguagens especializadas,
designadas por linguagens de simulao, de que so
exemplos, a SIMAN, a GPSS, a SLAM II e a SIMSCRIPT
II.5. Como natural, estas linguagens simplificam
significativamente a tarefa de programar um simulador de
eventos discretos. No entanto, no contexto do ensino da
simulao de eventos discretos importante dar a
conhecer ao aluno as tcnicas de programao que
recorrem s linguagens de programao tradicionais
(FORTRAN, PASCAL, C). Isto porque as linguagens de
simulao escondem do programador o processo de gesto
dos eventos, o que dificulta a percepo das
consequncias (por exemplo, em termos do tempo de
simulao) de programar um modelo, utilizando mais
eventos do que os estritamente necessrios.
O MATLAB pode ser utilizado como ambiente de
desenvolvimento, uma vez que dispe das facilidades
necessrias para a programao de modelos simples.
Este artigo descreve um demonstrador animado
concebido para ilustrar as tcnicas de programao de um
modelo de simulao de eventos discretos. A ilustrao
feita com base num modelo M/M/1 (no caso da cantina, o
modelo M/M/1 corresponderia a um sistema onde as
chegadas de alunos so de Poisson e existe apenas uma
senhora que serve com um tempo exponencialmente
distribudo). Na seco II so descritas as tcnicas de
programao para simuladores de eventos discretos,
utilizando uma linguagem de programao tradicional. Na
seco III apresentado o demonstrador animado para o
MATLAB. Na seco IV apresentam-se as rotinas
utilizadas para programar o simulador.
II. TCNICAS DE PROGRAMAO
Os elementos principais de uma simulao de eventos
discretos so os eventos e as variveis. As variveis so

normalmente de trs tipos: relgio de simulao,


contadores estatsticos e variveis de estado. O relgio de
simulao a varivel que indica, em cada instante, o
tempo de simulao. Em geral, no existe qualquer relao
entre o tempo de simulao e o tempo necessrio para
executar a simulao em computador. Os contadores
estatsticos armazenam a informao estatstica relativa ao
desempenho do sistema. As variveis de estado descrevem
o estado do sistema. Os instantes de ocorrncia dos
eventos futuros so armazenados numa lista designada por
lista de eventos. Nesta lista os eventos so ordenados por
instante de ocorrncia.

REVISTA DO DETUA, VOL. 2, N 3, SETEMBRO 1998

Incio

rotina de iniciao

programa principal

0. Relgio de simulao = 0
1. Iniciar as variveis de estado e os
contadores estatsticos
2. Iniciar a lista de eventos

Invocar a rotina de iniciao

rotina de temporizao
1. Invocar a rotina de temporizao
2. Invocar a rotina do evento i

1. Determinar o tipo de evento


seguinte
2. Avanar o relgio de simulao

rotina do evento i
livrarias
1. Actualizar as variveis de estado
2. Actualizar os contadores estatsticos
3. Gerar os eventos futuros e
acrescent-los lista de eventos

A simulao
terminou?

Gerador de
distribuies

sim

no

O programa de simulao determina qual o prximo


evento da lista e avana o relgio de simulao para o
instante de ocorrncia desse evento. Executa ento as
aces associadas a esse evento (por exemplo,
programao de novos eventos, actualizao das variveis
de estado e dos contadores estatsticos) e volta a consultar
a lista de eventos para avanar o relgio de simulao para
o prximo evento.

gerador do relatrio
1. Calcular as estimativas de interesse
2. Escrever o relatrio

Fim

Figura 1: Interaco dos componentes de um modelo de simulao.

III. DESCRIO DO DEMONSTRADOR


Um programa de simulao tem normalmente os
seguintes componentes:
Estado do sistema: conjunto de variveis de estado
necessrias para descrever o sistema num dado
instante de tempo.
Relgio de simulao: varivel que indica o tempo
de simulao.
Contadores estatsticos: variveis utilizadas para
armazenar a informao estatstica acerca do
desempenho do sistema.
Rotina de iniciao: subprograma que inicia o
modelo de simulao no instante de tempo zero.
Rotina de temporizao: subprograma que
determina qual o prximo evento da lista de eventos e
que avana o relgio de simulao para o instante de
ocorrncia desse evento.
Rotina do evento: subprograma que actualiza as
variveis de estado quando ocorre determinado tipo
de evento (existe uma rotina por cada tipo de evento).
Livrarias: conjunto de sub-rogarmos utilizados para
gerar observaes aleatrias de distribuies
probabilsticas.
Gerador do relatrio: subprograma que calcula (a
partir dos contadores estatsticos) as estimativas das
medidas de desempenho desejadas e produz um
relatrio quando a simulao termina.
Programa principal: subprograma que invoca a
rotina de temporizao para determinar o prximo
acontecimento e que transfere o controle para a
correspondente rotina do acontecimento para
actualizao do estado do sistema. O programa
principal pode tambm controlar o fim da simulao e
invocar o gerador do relatrio quando a simulao
termina.
A Figura 1 ilustra a forma como interagem os
componentes de um programa de simulao.

A. Modelo
O demonstrador animado concebido para ilustrar as
tcnicas de programao de simuladores de eventos
discretos baseado num sistema M/M/1. Neste caso, os
instantes entre chegadas de clientes, C1, C2, , so
variveis
aleatrias
(v.a.)
independentes
e
exponencialmente distribudas, os tempos de servio dos
sucessivos clientes, S1, S2, , so tambm v.a.
independentes e exponencialmente distribudas, sendo
ainda os instantes entre chegadas e os tempos de servio
independentes entre si.
Um cliente que chega ao sistema e encontra o servidor
livre entra imediatamente em servio; se encontrar o
servidor ocupado junta-se a uma fila de espera; logo que
um cliente complete o seu servio, entra em servio o
prximo cliente da fila de espera (se existir algum).
Admite-se que a ordenao dos clientes na fila de espera
do tipo First-In First-Out (FIFO).
A simulao comear no instante t=0, no qual nenhum
cliente se encontra no sistema. A chegada do primeiro
cliente ocorrer em t=C1. O sistema ser simulado at que
um nmero fixo e pr-definido de n clientes completem os
seus atrasos na fila de espera, ou seja, a simulao
terminar quando o n-simo cliente entrar em servio.
B. Medidas de desempenho
Neste demonstrador, o sistema M/M/1 caracterizado
atravs de trs medidas de desempenho: atraso mdio na
fila de espera, nmero mdio de clientes na fila de espera
e taxa de utilizao mdia do servidor.

REVISTA DO DETUA, VOL. 2, N 3, SETEMBRO 1998

O atraso mdio na fila de espera, d(n), estimado


atravs de

d (n ) =

i =0

q (n ) =

Q (t )dt

T (n )

Note-se que o numerador de q (n ) representa a rea sob a


curva Q(t) entre o incio e o fim da simulao.
A taxa de utilizao mdia do servidor, u(n), pode ser
vista como a proporo do tempo de simulao em que o
servidor est ocupado. Para estimar a taxa de utilizao do
servidor define-se a funo
1 se servidor ocupado no instante t
B (t ) =
0 se servidor livre no instante t
Agora, (n) pode ser considerado como a proporo de
tempo em que B(t) igual a 1, ou seja,

u (n ) =

T (n )

Os contadores estatsticos so o nmero de


atrasos, o atraso total, a rea sob Q(t) e a
rea sob B(t).

Di

onde D1, D2, , Dn so os atrasos de cada cliente na fila


de espera observados pelo simulador.
Para estimar o nmero mdio de clientes na fila de
espera, q(n), define-se a funo Q(t) como sendo o nmero
mdio de clientes na fila de espera no instante t, para t 0,
e T(n) o tempo requerido para observar os n atrasos na fila
de espera. Uma estimativa de q(n) dada por
T (n )

B (t )dt

T (n )

Tal como anteriormente, o denominador de (n)


corresponde rea sob a curva B(t) entre o incio e o fim
da simulao.
C. Eventos, variveis de estado e contadores estatsticos

Para simular este sistema s necessrio conhecer o


estado do sistema aps as chegadas e as partidas de
clientes. Assim, os eventos necessrios para programar
este sistema so: a chegada de um cliente e a partida de
um cliente.
As variveis de estado necessrias para estimar as
medidas de desempenho descritas anteriormente so: o
estado do servidor (livre ou ocupado), o nmero
de clientes na fila de espera, o instante
de chegada de cada cliente fila de espera e o
instante do ltimo evento. O estado do
servidor corresponde, em cada instante, a B(t); o
nmero de clientes na fila de espera
corresponde, em cada instante, a Q(t); o instante de
chegada de cada cliente permite calcular o atraso na
fila de espera.

D. Interface com o utilizador

O demonstrador consiste numa interface grfica onde se


mostram os parmetros de entrada, o relgio de simulao,
as variveis de estado, a lista de eventos, as curvas Q(t) e
B(t), as estimativas das medidas de desempenho e uma
representao grfica animada da fila de espera e do
servidor, conforme representado na Figura 2. Todos os
valores so actualizados imediatamente aps o
processamento de cada evento. A passagem dos clientes
pelo sistema animada da seguinte forma: os clientes so
representados por pequenas superfcies quadradas; a
chegada de um cliente representada atravs do
deslocamento no monitor, da esquerda para a direita, de
uma dessas superfcies. Se o servidor no estiver ocupado,
a superfcie desloca-se para dentro da moldura azul que
representa o servidor, e a moldura muda a sua cor para
vermelho; caso contrrio junta-se a uma fila de espera. A
partida de um cliente representada atravs do
deslocamento no monitor, da esquerda para a direita, da
superfcie que terminou o seu servio.
O utilizador pode introduzir os parmetros de entrada
(taxa de chegada, taxa de servio e nmero
de atrasos requeridos) ou pode optar por valores
por defeito. Tem tambm a opo de executar o programa
evento-a-evento.
E. Execuo passo-a-passo

No
pargrafos
seguintes
iremos
explicar
detalhadamente a evoluo do modelo de simulao nos
instantes de tempo t=0, t1, t2, , t10 nos quais so
observados 4 atrasos na fila de espera, utilizando, para o
efeito, o demonstrador desenvolvido em MATLAB.
Assumiremos para instantes entre chegadas e tempos de
servio dos clientes os seguintes valores: C1=0.6354,
C2=0.3988,
C3=0.9586,
C4=2.7054,
C5=0.8735,
C6=0.0721,
C7=0.1670,
C8=0.6407;
S1=4.3805,
S2=0.3382, S3=0.4765, S4=2.1479. Note-se que, num
programa de simulao, estes valores so gerados por
geradores de nmeros aleatrios.
Iniciao (t = 0, Figura 2). A simulao comea e a
rotina que inicia as variveis necessrias simulao do
modelo invocada. Inicialmente o sistema est vazio e o
servidor est livre. As variveis de estado que
caracterizam esta situao so iniciadas: o estado do
servidor zero, B(t)=0, e o nmero de clientes
na fila de espera zero, Q(t)=0. Os contadores
estatsticos nmero de atrasos, atraso total e
a rea sob Q(t), e a rea sob B(t), so todos
colocados zero. O relgio de simulao colocado a
zero e lista de eventos so atribudos os
instantes de tempo da prxima ocorrncia de cada um dos

REVISTA DO DETUA, VOL. 2, N 3, SETEMBRO 1998

tipos de eventos. O instante de tempo da primeira chegada


0+C1=0.6354. Uma vez que no existem clientes em
servio o evento partida eliminado, colocando-o a
infinito para garantir que o primeiro evento seja uma
chegada. Aps a iniciao do sistema a rotina de
temporizao que determina o instante de tempo e o tipo
do prximo evento invocada. Visto que 0.6354< , o
prximo evento uma chegada e ocorrer no instante
0.6354, pelo que a rotina avana o relgio de simulao
para este instante de tempo.

Figura 3: Caracterizao do sistema do instante de tempo t=0.6354.

Figura 2: Iniciao do modelo do sistema.

Chegada do cliente 1 (t = 0.6354). A Figura 3 mostra


as alteraes feitas ao sistema at ao instante
imediatamente antes ao processamento do evento. Uma
vez que o cliente encontra o servidor livre, ele inicia
imediatamente o seu servio e tem um atraso na
fila de espera nulo, D1=0. O relgio foi
avanado para o instante de tempo actual e a lista de
eventos actualizada. A prxima chegada ocorrer
dentro de C2=0.3988 unidades de tempo, ou seja, em
t=0.6354+0.3988=1.0342, e a prxima partida ser dentro
de S1=4.3805 unidades de tempo, ou seja, em
t=0.6354+4.3805=5.0159. O nmero de atrasos
incrementado de 1 e D1=0 adicionada ao atraso
total. A rea sob Q(t) actualizada adicionando
ao seu valor anterior, 0, o produto do nmero de
clientes na fila de espera, 0, com o intervalo
de tempo desde o ltimo evento que calculado
subtraindo o valor do relgio de simulao, 0.6354, ao
valor do instante de tempo do ltimo evento, 0,
isto , 0.6354-0=0.6354. Analogamente, a rea sob
B(t) actualizada, adicionando ao seu valor anterior, 0,
o produto do estado do servidor, 0, com o
intervalo de tempo desde o ltimo evento. Tal como
anteriormente, invocada a rotina de temporizao que
escolhe a menor das quantidades da lista de
eventos e determina que o prximo evento ser outra
chegada que ocorrer no instante de tempo t=1.0342 e
avana o relgio de simulao para esse instante.

Chegada do cliente 2 (t = 1.0342). A Figura 4 mostra as


alteraes feitas ao sistema at o instante imediatamente
antes do processamento do evento. Este cliente encontra o
servidor ocupado e a fila de espera vazia pelo que ocupa a
primeira posio na fila de espera e o seu instante de
chegada, t=1.0342, armazenado para posterior clculo
do atraso na fila de espera, D2. O instante de tempo do
prximo evento chegada incrementado de C3=0.9586
unidades de tempo, e ser t=1.0342+0.9586=1.9928; o
prximo evento ser esta chegada, uma vez que, a partida do
cliente em servio ser apenas no instante t=5.0159. O
instante do ltimo evento actualizado para
0.6354. A rea sob Q(t) incrementada de 0
resultante do produto de Q(t)=0 com o intervalo de tempo
desde o ltimo evento, 1.0342-0.6354=0.3988. A rea
sob B(t) incrementado de 0.3988 resultante do produto
de B(t)=1 com 0.3988.

Figura 4: Caracterizao do sistema no instante de tempo t=1.0342.

Chegada do cliente 3 (t = 1.9928). A Figura 5 mostra o


estado do sistema at o instante imediatamente antes do
processamento do evento. O cliente encontra o servidor
ocupado e junta-se fila de espera. O seu instante de
chegada, 1.9928, tal como o sucedido para o cliente
anterior, armazenado com o propsito de calcular o seu

REVISTA DO DETUA, VOL. 2, N 3, SETEMBRO 1998

atraso na fila de espera, D3. O instante de tempo da


prxima chegada incrementado de C3=2.7054 e
actualizado para t=1.9928+2.7054=4.6982 e o instante de
tempo da prxima partida mantm-se inalterado. O
instante do ltimo evento actualizado para
1.0342. Os acumuladores das reas so actualizados
adicionado-lhes o produto de 1 (o valor de B(t) e Q(t) no
instante t=1.0342) com o tempo desde o ltimo evento,
1.9928-1.0342=0.9586.

Figura 6: Caracterizao do sistema no instante de tempo t=5.0159.

Partida do cliente 2 (t = 5.3541). As alteraes ao


estado do sistema inerentes a esta partida so semelhantes
quelas que foram feitas aquando da partida do cliente 1
no instante de tempo t=5.0159, discutidas anteriormente.
Note-se que os prximos trs eventos so do tipo chegada
e ocorrero nos instantes t=5.5717, 5.6438 e 5.8108.
Figura 5: Caracterizao do sistema no instante de tempo t=1.9928.

Chegada do cliente 4 (t = 4.6982) . As alteraes ao


estado do sistema inerentes a esta chegada so
semelhantes quelas feitas aquando da chegada do cliente
3 no instante de tempo t=1.9928, discutidas anteriormente.
O prximo evento ser uma partida no instante de tempo
t=5.0159.
Partida do cliente 1 (t = 5.0159). A Figura 6 mostra o
sistema e a sua caracterizao imediatamente aps o
processamento do evento. O servidor mantm-se ocupado,
uma vez que o cliente 2 entra em servio; os restantes 2
clientes movem-se um lugar na fila de espera. O cliente que
acaba de entrar em servio requer um tempo de servio
S2=0.3382 pelo que o instante de tempo da prxima partida
actualizado para t=5.3541. O instante de tempo da
prxima chegada mantm-se inalterado, uma vez que os
eventos de chegada so agendados apenas quando se do
chegadas de clientes ao sistemas. O atraso total
actualizado, adicionando ao seu valor anterior, 0, o atraso
que o cliente 2 sofreu na fila de espera, que dado pela
diferena entre o instante de tempo actual e o instante
de chegada do cliente ao sistema, D2=5.01591.0342=3.9817. O instante do ltimo evento
actualizado para 4.6982. O nmero de atrasos
incrementado de 1 e os contadores estatsticos so
actualizados, adicionando 3(5.0159-4.6982)=0.9531
rea sob Q(t) e 1(5.0159-4.6982)=0.3177 rea
sob B(t). A rotina de temporizao determina que o
prximo evento uma partida no instante de tempo
t=5.3541.

Chegada dos clientes 5, 6 e 7 (t = 5.5717, 5.6438,


5.8108). As alteraes ao estado do sistema inerentes as
estas chegadas so semelhantes quelas que foram feitas
aquando da chegada do clientes 3. O prximo evento ser
uma partida no instante t=5.8306.
Partida do cliente 3 (t = 5.8306). As alteraes ao
estado do sistema inerentes a esta partida so apresentadas
na Figura 7 e so semelhantes quelas que foram feitas
aquando das partidas dos cliente 1 e 2. O atraso
total actualizado, adicionando ao seu valor anterior,
7.3430, o atraso que o cliente 4, que acabou de entrar em
servio, sofreu na fila de espera, D4=5.83064.6982=1.1324, para 7.3430+1.1324=8.4754. Com a
partida do cliente 3, o cliente 4 deixa a fila de espera e
entra em servio, instante em que o nmero de
atrasos incrementado para 4 e a simulao termina.
Neste momento o programa de simulao invoca a rotina
que gera o relatrio para o clculo das medidas de
desempenhos do sistema: o atraso mdio dos
clientes na fila de espera, d (4 ) = 8.4754/4 =

2.1189, o nmero mdio de clientes na fila


de espera, q (4 ) = 8.9409/4 = 1.5334 e a taxa mdia
de utilizao do servidor, u (4 ) = 5.1952/5.8306
= 0.8910.

REVISTA DO DETUA, VOL. 2, N 3, SETEMBRO 1998

Tabela 1: Rotinas e variveis do programa em MATLAB do modelo fila


de espera M/M/1.
Rotina

Definio

inicia

Rotina de iniciao das variveis de


simulao

temp

Rotina que actualiza o relgio de simulao

chegada

Rotina do evento chegada

partida

Rotina do evento partida

relator

Rotina que gera o relatrio final

actcont

Rotina que
estatsticos

Varivel

Definio

actualiza

os

contadores

Parmetros de entrada:
lambda
Figura 7: Caracterizao do sistema no instante de tempo t=5.8306.

IV. PROGRAMA EM MATLAB


Nesta seco faz-se uma descrio da implementao
do programa de simulao da fila de espera M/M/1,
utilizando o MATLAB.
O programa principal mm1.m formado pelas seguintes
rotinas: inicia.m, temp.m, chegada.m, partida.m, relator.m e
actcont.m. A Tabela 1 contm uma descrio das principais
variveis e rotinas utilizadas na programao do modelo. O
cdigo do programa principal apresentado na Figura 9 e
segue o fluxograma da Figura 8. As constantes Ocupado e
Livre so definidas para serem utilizadas com a varivel
EstServ, por forma a tornar o cdigo de fcil
compreenso. O programa comea por invocar a rotina
inicia que, tal como o nome indica, inicia as variveis
necessrias simulao. O ciclo while executado at
que um nmero requerido de NumAtrasReq clientes
completem a sua passagem pela fila de espera. Esta a
condio de paragem da simulao. Dentro deste ciclo a
rotina temp invocada para determinar o tipo do prximo
evento e avanar o relgio de simulao para o instante em
que esse ocorrer. Antes do processamento deste evento a
rotina actcont invocada para actualizar as reas sob as
curvas B(t) e Q(t). O comando if, cujo teste baseado na
varivel TipProxEvent que assume o valor 1 quando o
evento do tipo chegada e o valor 2 quando do tipo
partida, passa o controlo rotina do evento adequado.
Aps o ciclo while terminar a rotina relator invocada e
a simulao termina.
O cdigo da rotina inicia apresentado na Figura 10.
Esta rotina invocada apenas uma vez no incio da
simulao, avanando o relgio de simulao para o
instante de tempo de chegada do primeiro cliente,
TempProxEvent(1). Este instante determinado
adicionando uma v.a. exponencial com mdia 1/lambda
ao relgio de simulao, Relogio=0. Para esse efeito
utilizada a funo exprnd.m da Statistics Toolbox do
MATLAB que gera v.a. exponencialmente distribudas.

Taxa de chegada dos clientes ao sistema

niu

Taxa de servio

NumAtrasReq

Nmero total de clientes atrasados a serem


observados

Variveis auxiliares:
Livre

Estado livre do servidor (= 0)

Ocupado

Estado ocupado do servidor (=1)

TipProxEvent

Tipo do prximo evento (determinado pela


rotina temp)

TempDesdUltEvent

Armazena o intervalo de tempo desde que


ocorreu o ltimo evento (utilizado pela
rotina actcont)

Relogio

Relgio de simulao

Atraso

Atraso na fila de espera de um cliente

TotalAtras

Atraso total dos clientes na fila de espera

Variveis de estado:
EstServ

Estado do servidor (0 se livre, 1 se


ocupado)

NumNaQ

Nmero actual de clientes na fila de espera

TempUltEvent

Instante de tempo do ltimo evento

InstCheg

Vector que armazena o instante de chegada


dos clientes ao sistema

Contadores estatsticos:
NumClieAtras

Nmero de clientes que completaram os


seus atrasos na fila de espera

AreaNumNaQ

rea sob a curva B(t)

AreaEstServ

rea sob a curva Q(t)

Lista de eventos:
TemProxEvent(1)

Instante de tempo de ocorrncia do


prximo evento chegada

TemProxEvent(2)

Instante de tempo de ocorrncia do


prximo evento partida

Parmetros de sada:
NumMedNaQ

Nmero mdio de clientes na fila de espera

AtrasMedNaQ

Atraso mdio do clientes na fila de espera

TempMedUtilServ

Tempo mdio de utilizao do servidor

Visto que, inicialmente, no existem clientes no sistema o


prximo evento partida eliminado, fazendo

REVISTA DO DETUA, VOL. 2, N 3, SETEMBRO 1998

Incio
rotina de
iniciao

programa
principal

0. Relgio de simulao = 0
1. Iniciar as variveis de
estado e os contadores
estatsticos
2. Iniciar a lista de
eventos

Invocar a rotina de iniciao


rotina de temporizao
1. Invocar a rotina de
temporizao
2. Invocar a rotina do
evento i

1.
de
2.
de

rotina do
evento i
1. Actualizar as variveis de
estado
2. Actualizar os contadores
estatsticos
3. Gerar os eventos futuros e
acrescent-los lista de
eventos

A simulao
terminou?

Determinar o tipo
evento seguinte
Avanar o relgio
simulao

livrarias
Gerador de
distribuies

no

gerador
do
sim
relatrio
1. Calcular as estimativas
de interesse
2. Escrever o relatrio

Fim

do prximo cliente a entrar em servio, esteja sempre


armazenado em InstCheg(1). Uma alternativa a esta
instruo a utilizao de um ciclo for. No entanto esta
soluo, no caso de existirem muitos clientes na fila de
espera,
resulta
em
tempos
computacionais
consideravelmente elevados.
function mm1(lambda, niu, NumAtrasReq)
% MM1
fila de espera M/M/1 - sistema de uma
% fila de espera de um servidor, com intervalos entre
% chegadas exponenciais IID com mdia 1/lambda,
tempos
% de servio exponenciais IID com mdia 1/niu, e
% clientes servidos em modo First-In, First-Out(FIFO)
%
% Sintaxe: mm1(lambda, niu, NumAtrasReq)
%
lambda = taxa de chegada
%
niu = taxa de servio
%
NumAtrasReq = Nmero de Atrasos Requeridos

Figura 8: Fluxograma do programa principal.

TempProxEvent(2)=inf, de modo a garantir que o


primeiro evento seja uma chegada.
A rotina temp apresentada na Figura 11 e tem como
funo avanar o relgio de simulao para o instante de
tempo do prximo evento. O programa compara
TempProxEvent(1) e TempProxEvent(2) e
atribui varivel Relogio o instante de tempo do evento
cujo instante de ocorrncia menor e varivel
TipProxEvent o tipo desse evento. Para esse efeito
utilizada a funo min.m do MATLAB que calcula o
mnimo de um vector e retorna o seu valor e o respectivo
ndice no vector. No caso em que as quantidades
TempProxEvent(1)
(uma
chegada)
e
TempProxEvent(2) (uma partida) so iguais o
prximo evento do tipo chegada. No entanto, note-se que
da prxima vez que a rotina temp for invocada o prximo
evento do tipo partida, ou seja, a rotina invocada duas
vezes consecutivas sem que o relgio de simulao seja
avanado.
O cdigo da rotina do evento chegada est
representado na Figura 13 e segue o fluxograma da Figura
12. Note-se que varivel Relogio armazena o instante
de chegada do cliente que acabou de chegar ao sistema.
A rotina do evento partida apresentada na Figura 15
e segue o fluxograma da Figura 14. Esta invocada pelo
programa principal quando um cliente completa o seu
servio e, consequentemente, ocorre a sua partida. A
instruo TempProxEvent(2)=inf evita que o
programa entre em ciclo infinito quando se verifica que,
aps a partida de um cliente, a fila de espera fica vazia.
O atraso do cliente na fila de espera obtido
subtraindo InstCheg(1) ao valor actual do relgio de
simulao, Relogio.
A instruo InstCheg(1)=[] remove o primeiro
cliente, avanando os restantes (se existir algum) um lugar
na fila de espera, assegurando que, o instante de chegada

Ocupado = 1;
Livre = 0;
% Iniciar a simulao
inicia
% Executar a simulao enquanto forem necessrios
% atrasos
while (NumClieAtras < NumAtrasReq),
% Determinar o prximo evento
temp
% Actualizar os tempos mdios dos contadores
% estatsticos
actcont
% Invocar a rotina evento adequado
if (TipProxEvent == 1),
chegada
else
partida
end
end
% Invocar o gerador de relatrio e acabar simulao
relator
Figura 9: Cdigo MATLAB do programa principal do modelo da fila de
espera M/M/1, mm1.

O cdigo da rotina relator, invocada quando o


programa principal termina a simulao, apresentado na
Figura 16. O atraso mdio calculado, dividindo o total
de atrasos pelo nmero de clientes cujos atrasos na fila de
espera foram observados e o nmero mdio de atrasos na
fila de espera obtido, dividindo a rea sob Q(t) pelo

REVISTA DO DETUA, VOL. 2, N 3, SETEMBRO 1998

% INICIA
Rotina que INICIA as variveis de
% simulao

Evento
chegada

% Iniciar o Relgio de Simulao


Relogio = 0;
% Iniciar as Variveis de Estado
EstServ = Livre;
% Estado do Servidor
NumNaQ = 0;
% Nmero de Clientes da
fila
% de espera
TempUltEvent = 0;
% Tempo do ltimo Evento
InstCheg = [];
% Instante de Chegada
% Iniciar os
NumClieAtras
TotalAtras =
AreaNumNaQ =

Contadores Estatsticos
= 0;% Nmero de Clientes Atrasados
0; % Total de Atrasos
0; % rea do Nmero de Clientes na fila
% de espera
AreaEstServ = 0; % rea do Estado do Servidor

Agendar o prximo
evento chegada

Sim

O servidor
est ocupado?

No

Incrementar o
nmero de
clientes na fila
de espera

Fazer atraso=0
para este cliente

Armazenar o
instante de
chegada do
cliente

Incrementar o
nmero de
clientes
atrasados

Colocar o
servidor ocupado

Agendar o prximo
evento partida

% Iniciar a lista de eventos.


% Desde que no haja nenhum cliente presente o evento
% partida eliminado
TempProxEvent(1) = Relogio + exprnd(1/lambda);
TempProxEvent(2) = inf;

Retornar

Figura 10: Cdigo MATLAB da rotina inicia.


Figura 12: Fluxograma da rotina do evento chegada.

valor final do relgio de simulao, Relogio. A taxa de


utilizao do servidor calculada, dividindo a rea sob
B(t) pelo Relogio. Todas as medidas de desempenho
so mostrada no cran. mostrado tambm o valor de
Relogio por forma a sabermos quanto tempo
necessrio para observar NumAtrasReq atrasos de
clientes na fila de espera.
% TEMP
Rotina de TEMPorizao, actualiza o
% relgio de simulao e determina o tipo do prximo
% evento

% CHEGADA

Rotina do evento CHEGADA

% Agendar o instante da prxima chegada


TempProxEvent(1) = Relogio + exprnd(1/lambda);
% Verificar se o Servidor est ocupado
if (EstServ == Ocupado),
% O Servidor est ocupado, ento incrementa o
nmero
% de clientes da fila de espera
NumNaQ = NumNaQ + 1;

[Relogio,TipProxEvent] = min(TempProxEvent);
Figura 11: Cdigo MATLAB da rotina temp.

A rotina actcont apresentada na Figura 17 invocada


imediatamente antes de processar cada evento (de
qualquer tipo) e actualiza as reas sob as funes Q(t) e
B(t) necessrias ao clculo das mdias temporais. Para
esse efeito calculado o intervalo de tempo desde o
ltimo evento. Este atribudo a varivel
TempDesdUltEvent. A varivel TempUltEvent
actualizada, atribuindo-lhe o valor actual do relgio de
simulao. Q(t) aumentado da rea do rectngulo de
largura TempDesdUltEvent e altura NumNaQ. A rea
sob B(t) aumentada da rea do rectngulo de largura
TempDesdUltEvent e altura EstServ.

% necessrio armazenar o instante de chegada do


% cliente no fim da fila de espera
InstCheg(NumNaQ) = Relogio;
else
% Incrementar o nmero de clientes atrasados e
% colocar o Servidor ocupado
NumClieAtras = NumClieAtras + 1;
EstServ = Ocupado;
% O Servidor est livre, ento o cliente que chegar
% tem um tempo de atraso nulo
Atraso = 0;
% Agendar o instante da prxima Partida
TempProxEvent(2) = Relogio + exprnd(1/niu);
end
Figura 13: Cdigo MATLAB da rotina do evento chegada.

REVISTA DO DETUA, VOL. 2, N 3, SETEMBRO 1998

% RELATOR

Evento
partida

Rotina que gera o RELATRio final

% Calcular e escrever as estimativas das medidas de


% desempenho desejadas:
A fila de
espera est
vazia?

Sim

No

Colocar o
servidor livre

Decrementar o
nmero de
clientes na fila
de espera

Eliminar o evento
partida

Calcular o atraso
do cliente que
entrou em servio

Incrementar o
nmero de
clientes
atrasados

Agendar o evento
partida para este
cliente

Mover cada
cliente na fila
de espera (se
algum) um lugar

Retornar

% Atraso Mdio na Fila de Espera


AtrasMedNaQ = TotalAtras / NumClieAtras;
% Nmero Mdio de atraso na Fila de Espera
NumMedNaQ = AreaNumNaQ / Relogio;
% Tempo Mdio de Utilizao do Servidor
TempMedUtilServ = AreaEstServ / Relogio;
disp(sprintf('\n\t\t== RELATRIO ==\n'));
disp(sprintf('\tAtraso mdio na Fila de Espera: %6.3f
minutos\n', AtrasMedNaQ));
disp(sprintf('\tNmero mdio de Clientes na Fila de
Espera: %6.3f\n', NumMedNaQ));
disp(sprintf('\tTempo mdio de utilizao do
Servidor: %6.3f minutos\n', TempMedUtilServ));
disp(sprintf('\tTempo de simulao: %6.3f
minutos\n\n', Relogio));
Figura 16: Cdigo MATLAB da rotina relator.

% ACTCONT
ACTualizao do tempo mdio dos
% CONTadores estatsticos

Figura 14: Fluxograma da rotina do evento partida.


% Calcular o Tempo Desde o ltimo Evento
TempDesdUltEvent = Relogio - TempUltEvent;
% PARTIDA

Rotina do evento PARTIDA

% Verifica se a fila est vazia


if (NumNaQ == 0),
% A fila est vazia, ento coloca o Servidor livre
e
% elimina o evento partida
EstServ = Livre;
TempProxEvent(2) = inf;
else
% A fila no est vazia, ento decrementa o nmero
% de clientes na fila de espera
NumNaQ = NumNaQ - 1;

% Actualizar o Tempo do ltimo Evento assinalado


TempUltEvent = Relogio;
% Actualizar a rea sob a funo nmero clientes na
% fila de espera
AreaNumNaQ = AreaNumNaQ + NumNaQ * TempDesdUltEvent;
% Actualizar a rea sob a funo estado do servidor
AreaEstServ = AreaEstServ + EstServ*TempDesdUltEvent;
Figura 17: Cdigo MATLAB da rotina actcont.

V. CONCLUSES
% Incrementar o nmero de clientes atrasados e o
% instante de partida
NumClieAtras = NumClieAtras + 1;
TempProxEvent(2) = Relogio + exprnd(1/niu);
% Calcular o atraso do cliente que est comeando o
% servio
Atraso = Relogio - InstCheg(1);
% Actualizar o acumulador do atraso total
TotalAtras = TotalAtras + Atraso;

Este artigo apresenta uma descrio das tcnicas de


programao de um modelo de simulao de eventos
discretos. feita uma explicao detalhada da evoluo da
simulao de um modelo do tipo M/M/1, ilustrada passoa-passo atravs de um demonstrador animado
desenvolvido no MATLAB.
VI. BIBLIOGRAFIA
[1]

% Subir cada cliente na fila (se existir algum) um


% lugar na fila de espera
InstCheg(1) = [];
end

[2]
[3]

A. Law, D. Kelton, Simulation, modeling and analysis,


McGraw-Hill, 1991.
J. Banks, J. Carson, B. Nelson Discrete-Event System
Simulation, Academic Press, 1996.
S. Ross, Simulation, Academic Press, 1997.

Potrebbero piacerti anche