Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Facultad de Ciencias
Escuela de Computación
ND 2010-01
!"#"$%"&'(#")*''
Simulación basada en eventos discretos, DES, Interacción de Procesos, Exploración de
Actividades.
(+,-".-+&'
• Prof. Sergio Rivas (sergio.rivas@ciens.ucv.ve)
/*.0"'
Enero de 2010
!"
0%:+%)*&);/-#&-(*/)
!"#$%&'()**+,$ ------------------------------------------------------------------------------------------------------------------------------!!
."#$%&'()**+,$"/"0/"1+2)0/*+,$"3+$42+*/ ---------------------------------------------------------------------------.!
5"1+2)0/*+,$"6/7/(/"8$"9:8$%'7"3+7*&8%'7 ------------------------------------------------------------------------5!
5-!";8&2+$'0'<=/"8$"1+2)0/*+,$">/7/(/"8$"9:8$%'7"3+7*&8%'7 ---------------------------------------------?!
5-."97@)82/"(8"%&/>/A'"<8$8&/0"8$"7+2)0/*+,$">/7/(/"8$"8:8$%'7"(+7*&8%'7------------------B!
"#$#%!&'()*+,!-(+!./01,!-(!20/!3/425++/ ################################################################################################## 6!
?"9$C'@)87"(8"387/&&'00'"8$"1+2)0/*+,$">/7/(/"8$"8:8$%'7"3+7*&8%'7----------------- !D!
?-!"1+2)0/*+,$">/7/(/"8$"E0/$+C+*/*+,$"(8"9:8$%'7 --------------------------------------------------------------- !D!
?-5"1+2)0/*+,$"6/7/(/"8$"E&'*87'7 --------------------------------------------------------------------------------------------- !D!
?-?"1+2)0/*+,$"6/7/(/"8$"0/"8FG0'&/*+,$"(8"/*%+:+(/(87 ----------------------------------------------------- !.!
7#7#%!&'()*+,8!9:,;+()/!-(+!./01,!1,0!(<*+,:/15=0!-(!/1>5?5-/-(@######################################### %"!
7#7#$!&<*+,:/15=0!-(!/1>5?5-/-(@!(0!>:(@!A/@(@ #################################################################################### %B!
H"I'$*0)7+'$87--------------------------------------------------------------------------------------------------------------------------- !J!
6+>0+'<&/C=/--------------------------------------------------------------------------------------------------------------------------------- !K!
"
"
!!"
<-*(5&)*&)=('4$%")
Figura 1: Estado de un Sistema Discreto................................................................................ 2!
!!!"
#$%&'"()"*'%+&%),!&'"()-".&/)0$"()-"1!)23$")/"4!25-&6!7/"
>)?-#$/*455(6-)
Hoy en día, el estudio de sistemas con dinámicas complejas se hace en muchos
casos con simulación. La idea es poder imitar el comportamiento de un sistema diseñando e
implantando un modelo computacional del sistema en cuestión.
8"
#$%&'"()"*'%+&%),!&'"()-".&/)0$"()-"1!)23$")/"4!25-&6!7/"
@)?-#$/*455(6-)%)+%)3(14+%5(6-)7(-81(5%)
Una Simulación es la imitación de la operación o funcionamiento de algún sistema
del mundo real (a través del tiempo) (Banks Jerry, 2005). La simulación es usada para
probar nuevas ideas o estrategias basadas en un modelo que representa una abstracción
particular de ese sistema.
La simulación también puede ser divida en dos categorías según la dependencia con el
tiempo:
9"
#$%&'"()"*'%+&%),!&'"()-".&/)0$"()-"1!)23$")/"4!25-&6!7/"
En nuestro caso, nos interesa estudiar las simulaciones del tipo dinámica y discreta.
A)3(14+%5(6-)B%"%*%)&-)!C&-#/")7("5$&#/")
Cuando en una situación donde es necesario mover el tiempo como variable
mientras se simula, existen diferentes estrategias para avanzar el reloj (emular el transcurso
del tiempo), permitiendo así simular la dinámica de las entidades en el sistema.
Una estrategia ineficiente consiste en mover el reloj en intervalos fijos del tiempo.
El tamaño de estos intervalos se definen según la precisión que se quiera tener a fin de
resolver ciertas interrogantes, por ejemplo: Simular clientes en un restaurante, situación en
la cual se avanza el reloj en segundos. Esta estrategia sencilla que parece al transcurso del
tiempo en el mundo real puede ser inadecuada, ya que avanzar el reloj sobre intervalos en
donde no sucede ninguna acción que cambie el estado del sistema estaría usando
inútilmente recursos computacionales (memoria y/o unidades de procesamiento).
Una estrategia más eficiente consiste en ubicar el próximo momento del tiempo
en donde cambiará el sistema, y luego, avanzar el reloj del sistema a ese momento del
tiempo; en este principio se fundamenta la simulación basada en eventos discretos.
:"
#$%&'"()"*'%+&%),!&'"()-".&/)0$"()-"1!)23$")/"4!25-&6!7/"
Con esta estrategia se identifican y planifican los puntos donde cambia el estado del
sistema, para así poder saltar el reloj a través de esos puntos en el tiempo, ejecutando
acciones que reflejan el cambios del sistema en dichos puntos.
123'4*%56,+#+78"'*,'965:#".6;,'$"&"<"'*,'=)*,-+&'>6&.%*-+&'
Según (Banks Jerry, 2005):
• Modelo: Una representación abstracta del sistema, que suele contener elementos,
relaciones, estructura, que describen el sistema en función de sus atributos, eventos,
actividades, etc.
• Actividad: Cualquier cosa que consuma tiempo y recursos. Una actividad consume
tiempo, el cual se sabe cuando comienza (ejemplo: el servicio de un cliente en un
cajero).
• Retardo: Una duración de tiempo de largo no definido, el cual se sabe hasta que se
termina (ejemplo: el tiempo de espera por un cliente en un banco en la línea).
• Reloj de simulación: Una variable que contiene el valor actual del tiempo de
simulación.
• Lista de eventos: Una lista que contiene los eventos a ocurrir en el futuro y su tipo.
• Rutina del tiempo: Una rutina que determina el próximo evento a ocurrir, adelanta
el Reloj de Simulación, y procesa el evento próximo.
;"
#$%&'"()"*'%+&%),!&'"()-".&/)0$"()-"1!)23$")/"4!25-&6!7/"
• Rutina de eventos: Es una rutina que actualiza el estado del sistema según el tipo de
evento, esta rutina puede crear nuevos eventos y planificarlos.
<"
#$%&'"()"*'%+&%),!&'"()-".&/)0$"()-"1!)23$")/"4!25-&6!7/"
12?'=&@:*5"'<*'-%"$"A+'7*,*%"#'*,'&65:#".6;,'$"&"<"'*,'*)*,-+&'<6&.%*-+&'
La Figura 3 muestra el esquema de trabajo para el manejo del avance del reloj en
una simulación manejada por eventos discretos.
="
#$%&'"()"*'%+&%),!&'"()-".&/)0$"()-"1!)23$")/"4!25-&6!7/"
AD@D>)!.&12+/)*&+)B%-5/)*&)4-%)0%E4(++%)
Supongamos que se presenta una situación del banco con una taquilla con las siguientes
reglas:
• Existe una sola taquilla. Si la taquilla está ocupada, el cliente se encola y cuando la
taquilla se desocupa se atiende al próximo cliente en orden de llegada) se atiende.
>"
#$%&'"()"*'%+&%),!&'"()-".&/)0$"()-"1!)23$")/"4!25-&6!7/"
La rutina ENTRAR
1. Colocar la taquilla en estado ocupado
2. Programar el evento SALIDA generando un tiempo aleatorio de ocupación y agregar a la lista de eventos
un evento del tipo SALIDA con el instante que corresponda salir a ese cliente en la taquilla
9A82G0'"(80">/$*'"+2G0828$%/('"8$"&)>L"
=begin
Rutina del banco por eventos discretos
Se tienen dos tipos de eventos LLEGADA, SALIDA
2009/07/08
=end
#variables de la simulacion
@reloj = 0
@lista_eventos = []
# rutinas de simulacion
def principal
rutina_inicializacion
while !termina_simulacion?
rutina_tiempo
rutina_eventos
end
calcular_estadisticos
mostrar_resultados
end
def rutina_inicializacion
@reloj = 0
primer_evento = { :tipo => 'LLEGADA', :tiempo=> 0, :id => (@id_cliente_actual+=1) } #crea evento
@lista_eventos << primer_evento #agrega el 1er evento
end
def termina_simulacion?
@reloj > 60 || @lista_eventos.size==0 #condicion de fin
end
def rutina_tiempo
@lista_eventos = @lista_eventos.sort_by{|x| x[:tiempo]} #ordena por el tiempo
@reloj = @lista_eventos.first[:tiempo] #adelanta el reloj al proximo
end
def rutina_eventos
@proximo_evento = @lista_eventos.first #toma el primer evento
@lista_eventos.delete_at(0) #elimina el evento de la lista
if @proximo_evento[:tipo] == 'LLEGADA'
rutina_llegada
elsif @proximo_evento[:tipo] == 'SALIDA'
rutina_salida
end
end
?"
#$%&'"()"*'%+&%),!&'"()-".&/)0$"()-"1!)23$")/"4!25-&6!7/"
def calcular_estadisticos
puts "calculando"
end
def mostrar_resultados
puts "fin"
end
def rutina_salida
puts "#{@reloj}: Sale cliente C-#{@proximo_evento[:id]}"
@clientes_en_el_sistema -= 1
if @cola.size > 0
#sacando el proximo cliente
prox_cliente = @cola.first
@cola.delete_at(0)
entrar(prox_cliente)
else
@taquilla_ocupada = false
end
end
def entrar(cte)
#programando la salida
tiempo = tiempo_aleatorio_servicio
evento_salida = { :tipo => 'SALIDA', :tiempo=> @reloj+tiempo, :id => cte }
@lista_eventos << evento_salida
end
def tiempo_aleatorio_entre_llegadas
rand(5)+1 #aleatorio uniforme 1 a 6
end
def tiempo_aleatorio_servicio
rand(3)+1 #aleatorio uniforme 1 a 4
end
#programa principal
principal
@"
#$%&'"()"*'%+&%),!&'"()-".&/)0$"()-"1!)23$")/"4!25-&6!7/"
B23'965:#".6;,'$"&"<"'*,'!#",6C6.".6;,'<*'=)*,-+&'
Este es el esquema más simple o de bajo nivel de la Simulación Basada en Eventos,
consiste en planificar los eventos que se presentan o pueden presentarse en el sistema. Las
características de este enfoque son:
2. Prever y ordenar los cambios futuros a través de una lista de eventos futuros.
B21'965:#".6;,'D"&"<"'*,'!%+.*&+&'
La simulación basada en planificación de eventos requiere que el usuario maneje los
conceptos de eventos y el esquema del tiempo muy bien, de hecho, el desarrollador debe
estar conciente de cada uno de los eventos que existen en la situación que quiere
representar.
1
CSIM: Librería de Simulación basada en eventos discretos. Sitio oficial
http://sourceforge.net/projects/csim/
8A"
#$%&'"()"*'%+&%),!&'"()-".&/)0$"()-"1!)23$")/"4!25-&6!7/"
A su vez bajo este enfoque se han hecho herramientas de uso específico y de alto
nivel que permiten definir los procesos gráficamente o de forma esquemática, tal es el caso
de WebGPSS2, y por otro lado se tienen herramientas como librerías de simulación o
lenguajes de simulación en el cual se pueden definir procesos, y modelar los retrasos y
actividades tal es el caso de SimPy3 y MODSIM4.
9A82G0'"(80">/$*'"*'$"8$C'@)8">/7/('"8$"G&'*87'7")7/$('"1+2EL"
#-------------------------------------------------------------------------------
# Nombre: banco.py
# Escenario: Rutina del banco en enfoque de interaccion de procesos
#!/usr/bin/env python
from random import *
from SimPy.Simulation import *
servidor = Resource(capacity=1)
id_cliente_actual= 0
2
WEBGPSS: Sistema de simulación versión Web de GPSS. Sitio oficial
http://www.webgpss.com/
3
SimPy: Librería de Simulación basada en Python. Sitio oficial
http://simpy.sourceforge.net/
4
MODSIM: Lenguaje de Simulación.
88"
#$%&'"()"*'%+&%),!&'"()-".&/)0$"()-"1!)23$")/"4!25-&6!7/"
class Cliente(Process):
def entrar(self):
print"%i: Llega cliente %s"%(now(),self.name)
yield request,self,servidor
yield hold,self,tiempo_aleatorio_servicio()
yield release,self,servidor
print"%i: Sale cliente %s"%(now(),self.name)
class GeneradorCliente(Process):
def generar(self):
global id_cliente_actual
while True:
c = Cliente(name=("C-%i"%id_cliente_actual))
id_cliente_actual += 1
activate(c,c.entrar())
yield hold,self,tiempo_aleatorio_entre_llegadas()
def tiempo_aleatorio_entre_llegadas():
return randint(1,6) #aleatorio uniforme 1 a 6
def tiempo_aleatorio_servicio():
return randint(1,4) #aleatorio uniforme 1 a 4
def principal():
initialize()
g = GeneradorCliente()
activate(g,g.generar())
simulate(until=60)
principal()
B2B'965:#".6;,'D"&"<"'*,'#"'*EF#+%".6;,'<*'".-6)6<"<*&'
La simulación basada en la exploración de actividades (Udo W. Pooch, 1993)
consiste en ver cómo las entidades se relacionan para llevar a cabo una actividad, pero el
enfoque está en las actividades que hay que realizar mas no en el ciclo de vida de la
entidad.
2. Verifica si existe una actividad a ejecutar dadas las condiciones para iniciarla
89"
#$%&'"()"*'%+&%),!&'"()-".&/)0$"()-"1!)23$")/"4!25-&6!7/"
FDFD>)!.&12+/H)I$/:+&1%)*&+)B%-5/)5/-)&J2+/$%5(6-)*&)%5#(C(*%*&")
Se identifican 3 eventos:
Los primeros 2 eventos son eventos relacionados con el tiempo, mientras que el último
es un evento de estado.
Programa Principal
1. Inicializar los eventos y otras variables
2. Si expira el reloj de simulación, entonces terminar la simulación
3. Si TIEMPO_LLEGADA=0, invocar a la rutina LLEGADA
4. Si TIEMPO_SALIDA=0, invocar a la rutina SALIDA
5. Si hay al menos un cliente en la cola y la taquilla está ociosa invocar a la rutina SERVICIO
6. Actualizar el reloj del sistema e ir al paso 2
Rutina LLEGADA
1. Colocar al cliente al final de la cola
8:"
#$%&'"()"*'%+&%),!&'"()-".&/)0$"()-"1!)23$")/"4!25-&6!7/"
Rutina SALIDA
1. Colocar la taquilla en modo ocioso
Rutina de SERVICIO
2. Sacar el primer cliente de la cola
En general este enfoque explora todas las actividades posibles y las llama a medida que
estén las condiciones dadas para iniciar o terminar una actividad.
Este enfoque puede ser complejo cuando existen muchas entidades interactuando. Por
otro lado, este enfoque incrementa el tiempo en pequeños quantum y revisa si existe una
actividad por realizar lo cual puede ser ineficiente en instantes donde no se inicia ninguna
actividad.
9A82G0'"(80"6/$*'"*'$"8FG0'&/*+,$"(8"/*%+:+(/(87"8$"M)>L"
=begin
Rutina del banco por exploracion de actividades
Se tienen dos tipos de eventos LLEGADA, SALIDA
2009/07/08
=end
#variables de la simulacion
@reloj = 0
# rutinas de simulacion
def principal
rutina_inicializacion
while !termina_simulacion?
rutina_tiempo
rutina_exploracion_actividades
end
calcular_estadisticos
mostrar_resultados
end
def rutina_inicializacion
@reloj = 0
@tiempo_llegada = 1 #generar la proxima llegada en el proximo decremento
end
def termina_simulacion?
@reloj > 60 #condicion de fin
end
def rutina_tiempo
@reloj += 1 #se incrementa fijo
@tiempo_llegada -= 1
@tiempo_salida -= 1
8;"
#$%&'"()"*'%+&%),!&'"()-".&/)0$"()-"1!)23$")/"4!25-&6!7/"
end
def rutina_exploracion_actividades
if @tiempo_llegada == 0 #llegada
rutina_llegada
end
if @tiempo_salida == 0 #salida
rutina_salida
end
if @cola.size>0 && !@taquilla_ocupada #servicio
rutina_servicio
end
end
def calcular_estadisticos
puts "calculando"
end
def mostrar_resultados
puts "fin"
end
def rutina_llegada
puts "#{@reloj}: Llega cliente C-#{@id_cliente_actual}"
@cola << @id_cliente_actual
@id_cliente_actual += 1
#creando nueva llegada
tiempo = tiempo_aleatorio_entre_llegadas
@tiempo_llegada = tiempo
end
def rutina_salida
puts "#{@reloj}: Sale cliente"
@taquilla_ocupada = false
end
def rutina_servicio
#programando la salida
cliente = @cola.first
@cola.delete_at(0)
tiempo = tiempo_aleatorio_servicio
@tiempo_salida = tiempo
end
def tiempo_aleatorio_entre_llegadas
rand(5)+1 #aleatorio uniforme 1 a 6
end
def tiempo_aleatorio_servicio
rand(3)+1 #aleatorio uniforme 1 a 4
end
#programa principal
principal
FDFD@)!J2+/$%5(6-)*&)%5#(C(*%*&")&-)#$&")G%"&")
Una de las mejoras para evitar avanzar el reloj a instantes de tiempo en los cuales no se
inicia ninguna actividad, es mezclar la lógica del enfoque de interacción de procesos en el
cual se avanza el reloj a los instantes donde se necesita cambiar el estado del sistema, con la
inicio de actividades por condición.
8<"
#$%&'"()"*'%+&%),!&'"()-".&/)0$"()-"1!)23$")/"4!25-&6!7/"
4. Todas las actividades C son evaluadas cada vez que se avanza el reloj por una actividad
tipo B y se inician al presentarse su condición de activación.
• Fase 2: Ejecutar todas las actividades tipo B que correspondan con ese instante y
modificar el estado del sistema.
• Fase 3: Explorar todas las condiciones de actividades tipo C que puedan activarse e
iniciarlas si es el caso.
El algoritmo de tres fases permite combinar los beneficios de planificar eventos y saltar
a instantes cuando se necesita cambiar el estado del sistema, y por otro lado, mantener la
lógica de inicio de actividades dada una condición.
Uno de los lenguajes para usar este en enfoque es STROBOSCOPE5, usado para la
simulación de sistemas de construcción.
5
STROBOSCOPE: Lenguaje de Simulación basado en exploración de actividades de tres
fases. Sitio oficial: http://www.cem.umich.edu/Ioannou/StrobWeb/index.html
8="
#$%&'"()"*'%+&%),!&'"()-".&/)0$"()-"1!)23$")/"4!25-&6!7/"
K);/-5+4"(/-&")
En esta investigacíon se mostraron los enfoques de simulación basada en eventos
discretos, donde se explica como la simulación puede ser llevada a cabo procesando sólo
los instantes donde el sistema cambia de estado.
8>"
#$%&'"()"*'%+&%),!&'"()-".&/)0$"()-"1!)23$")/"4!25-&6!7/"
B(:+(/'$%GL%)
Banks J. Discrete event system simulation. Prentice Hall. 2005.
Martínez J. State and resource based simulation of construction processes. Phd. Thesis.
University of Michigan. 1996.
8?"