30
Simulación discreta en Linux Camilo Bernal 27 de agosto de 2015

Simulación Discreta en Linux

Embed Size (px)

DESCRIPTION

Se presenta un ejemplo de cómo usar la simulación discreta usando herramientas GNU/Linux

Citation preview

Simulación discreta en Linux

Camilo Bernal

27 de agosto de 2015

Índice1. Introducción 1

2. ¿Para qué sirve la simulación discreta? 2

3. ¿Qué es SimPy? 3

4. ¿Qué es Python? 4

5. ¿Qué es GNU/Linux? 5

6. Ejemplo de simulación de un restaurante universitario 6

7. Conclusiones 9

A. Modelo de restaurante universitario 11

B. Resultado con seguimiento de eventos 15

I

1. Introducción

Cuando se intenta resolver problemas sumamente complejos, es posible que una modela-ción matemática sea inadecuada. Esto se debe no solamente a la complejidad intrínsecadel modelo que se esté tratando, sino también a la dificultad que representa resolvernuméricamente el problema planteado.

Ante estas situaciones es posible hacer uso de una técnica de Investigación de Operacio-nes llamada Simulación Discreta. Esta técnica intenta modelar sistemas del mundo reala través de la construcción de simulaciones basadas en los principales elementos de laspercepciones que se tienen sobre un problema en particular.

El objetivo de usar estas técnicas es hacer análisis del tipo ’Qué pasaría si. . . ’ donde’. . . ’ representa cambios en los parámetros, variables y restricciones del modelo que seestá considerando. Este tipo de experimentos puede resultar muy útil en caso de pruebasdestructivas y/o muy costosas sobre el objeto de estudio, con lo cual se combinan en unmismo modelo elementos objetivos, elementos subjetivos, recomendaciones de expertosy bases de datos de conocimiento.

En el presente documento se presenta una herramienta para hacer simulación de eventosdiscretos basados en procesos para el sistema operativo Linux. Se plantea un ejemplomuy sencillo a modo de ilustración.

1

2. ¿Para qué sirve la simulación discreta?

La simulación discreta sirve para analizar sistemas en los cuales la experimentaciń directaresulta destructiva y/o muy costosa. En algunas ocasiones también se puede usar paramodelar problemas complejos de producción, redes logísticas y administración,. . . en losque los modelos matemáticos son muy difíciles de construir y/o resolver con técnicasmás convencionales de Investigación de Operaciones.

La simulación discreta también ayuda a combinar diversos enfoques de solución de pro-blemas como minería de datos, juicios de expertos y bases de datos de conocimiento,. . .todo esto se puede combinar en algoritmos auto-adaptativos a fin de contar con herra-mientas más flexibles y versátiles para codificar y resolver problemas.

2

3. ¿Qué es SimPy?

SimPy es un lenguaje de simulación de eventos discretos basados en procesos y que usael lenguaje de programación Python. Permite modelar componentes de una simulacióncomo son procesos para componentes activos tales como clientes, mensajes y vehículos,y recursos para componentes pasivos que actúan como servidores que satisfacen lasnecesidades de los usuarios.

SimPy tiene varias ventajas sobre otras herramientas de simulación discreta como Pro-model. Entre otras, estas son algunas ventajas:

Es software libre, con lo cual no debes gastar dinero para instalar y actualizar laherramienta.

Usa python para construir los modelos, lo que permite usar todas las inmensascapacidades y características de este lenguaje de programación.

Está pensado para ser usado en ambientes de producción real (como grandes in-dustrias y/o laboratorios de investigación, por ejemplo), ya que permite su trabajoen servidores y grandes equipos de cómputo.

Para obtener el programa, los usuarios de sistemas operativos basados en Debian GNU/Linuxlo pueden buscar en el repositorio de software. Los demás pueden buscarlo en google.

3

4. ¿Qué es Python?

Python es un lenguaje de programación multiparadigma (soporta programación orien-tada a objetos, programación imperativa y programación funcional). Es un lenguajeinterpretado multiplataforma (se puede usar en Microsoft Windows, GNU/Linux, Unixy MacOS) y de tipado dinámico.

El intérprete de Python viene pre-instalado en los sistemas tipo Unix (GNU/Linux yMacOS). Para los que usan Microsoft Windows deben buscarlo en google.

4

5. ¿Qué es GNU/Linux?

GNU/Linux es el mejor sistema operativo que el dinero no puede comprar. A diferen-cia de otras alternativas, lo puedes usar no sólo para desperdiciar el tiempo en tu PCpersonal, sino también en entornos de súper-computación y granjas de servidores.

Comparado con Microsoft Windows, es más rápido, no tiene virus, es multitarea y mul-tiusuario, no cobra por la licencia, no cobra por actualizaciones, no roba tu informaciónpersonal para enviarla a servidores remotos,... y más.

Comparado con Mac OS, es multitarea y multiusuario, no te deja en la ruina económica,no te dice qué tipo de persona eres por usarlo (tú decides quién eres, por ejemplo unapersona auténtica),... y más, aunque se reconoce la superioridad de Mac OS sobre Mi-crosoft Windows, ambos sistemas te cobran cifras astronómicas por darte mucho menosde lo que GNU/Linux te daría a precios ridículamente bajos (Ojo: no confundir valorcon precio).

Concretamente, Linux es un sistema operativo: un conjunto de programas que le per-miten interactuar con su ordenador y ejecutar otros programas. Un sistema operativoconsiste en varios programas fundamentales que necesita el ordenador para poder comu-nicar y recibir instrucciones de los usuarios; tales como leer y escribir datos en el discoduro, cintas, e impresoras; controlar el uso de la memoria; y ejecutar otros programas. Laparte más importante de un sistema operativo es el núcleo. En un sistema GNU/Linux,Linux es el núcleo. El resto del sistema consiste en otros programas, muchos de los cualesfueron escritos por o para el proyecto GNU.

5

6. Ejemplo de simulación de un restauranteuniversitario

El ejemplo planteado es muy sencillo y tiene propósitos ilustrativos únicamente.

Se diseña la simulación de un restaurante de auto-servicio para una universidad u otrainstitución educativa. Se plantea una serie de estaciones por las cuales pasará cadaestudiante a fin de servirse su almuerzo Figura (1).

Figura 1: Restaurante universitario�

�Fuente: Elaboración propia

En el modelo planteado, el estudiante llega y espera (si es necesario) a que cada estaciónesté disponible. Una vez que esto se cumple, el estudiante ocupa el recurso (la estaciónparticular), lo utiliza durante algunos segundos y después lo libera para ir a la siguienteestación. Cuando no quedan maś estaciones el estudiante abandona el auto-servicio y sedirige a disfrutar de su almuerzo.

6

El elemento activo del modelo es el estudiante. Los elementos inactivos (las estaciones)se pueden modelar como recursos. El tiempo de servicio en cada estación se planteacomo una demora.

SimPy permite modelar las entidades del modelo como objetos (instancias de clases)con características (atributos) y acciones (métodos). Los eventos se modelan utilizandogeneradores1.

A continuación se describen los principales elementos de SimPy para realizar la mode-lación.

yield hold,self,t_demora: Sentencia de un método perteneciente a un objeto(instancia de clase). Con esto se expresa una espera (demora) de t_demora uni-dades de tiempo.

activate(objeto, método(name=’mi_objeto’), at=0, delay=0, prior=False).Esta sentencia se aplica a un objeto (instancia de clase). Con esta expresión se ac-tivan las acciones (métodos) de un objeto activo (una entidad modelada comoinstancia de clase en SimPy) con algunos parámetros opcionales como el momentode activación (at=...), demora(at=...), y prioridad(prior=...).

resource(capacity=1, name=’a_resource’, unitName=’units’, qType=FIFO,preemptable=False, monitored=False, monitorType=Monitor). Permitemodelar una recurso (objeto pasivo). Se puede definir su capacidad (capacity=...),un identificador(name=...), y otros parámetros opcionales.

yield request, self, resouce_name. Sentencia de un método perteneciente a unobjeto (instancia de clase). Con esto se solicita el uso de un recurso. La entidadse pone en espera hasta que el recurso esté disponible. Una vez disponible, tomael recurso (con lo cual no estará disponible para las entidades precedentes que losoliciten) durante algún tiempo y lo libera.

yield release, self, resource_name. Sentencia de un método perteneciente aun objeto (instancia de clase). Permite a una entidad liberar el recurso que estáutilizando a fin de que puede ser usado por otra.

Estas son algunas de las estructuras esenciales de SimPy. Esta herramienta permite ungran número de opciones adicionales que pueden consultarse en el manual. En el anexo

1Por favor, leer el manual de Python y de SimPy para entender lo que estoy diciendo

7

A se puede ver la aplicación práctica de algunas de estas opciones usadas para modelarel restaurante universitario.

8

7. Conclusiones

Es posible usar SimPy para realizar simulación discreta de una manera intuitivay escalable, a fin de que se puedan construir modelos tanto para propósitos peda-gógicos como en ambientes de producción real sin incurrir en costos ni licenciasadicionales.

A diferencia de otras herramientas, SimPy permite usar toda la potencia y versa-tilidad de un auténtico lenguaje de programación profesional como Python.

9

Referencias

[1] Wikipedia: La enciclopedia libre. GNU/Linux.http://es.wikipedia.org/wiki/GNU/Linux?oldid=78087514. Fecha de acceso: 11 nov2014.

[2] Wikipedia: La enciclopedia libre. Software libre.http://es.wikipedia.org/wiki/Software_libre?oldid=78063707. Fecha de acceso:mié 12 nov 2014.

[3] Wikipedia: La enciclopedia libre. Python. http://es.wikipedia.org/w/index.php?oldid=75999492.Fecha de acceso: vie 15 ago 2014.

10

A. Modelo de restaurante universitario

>�> A continuación se muestra el script utilizado para simular el restaurante universitarioen un día normal de operaciones. Tanto el modelaje como el reporte son solamentebosquejos con propósitos ilustrativos.

################################################### Simulación de un restaurante para una universidad u otra# entidad educativa en la cual cada estudiante# pasa por una serie de estaciones para# recoger sus alimentos.## Programa realizado con el programa SimPy V2.3.1# usando el lenguaje de programación Python V3.3.3# bajo el entorno Linux,# Sistema Operativo Linux Mint Debian Edition (LMDE)

#####################################################from SimPy.Simulation import *

from random import normalvariate

class Estudiante(Process):"""Entidad que representa a un estudiante"""def __init__(self, name):

Process.__init__(self, name)def servirse(self, estaciones, t_servicio):

for i in range(6):estacion = estaciones[i]tiempo = t_servicio[i]# Solicita servicio en la estaciónyield request, self, estacion# Toma el tiempo necesario en la estaciónyield hold, self, tiempo# Libera la estaciónyield release, self, estacion

def simular_restaurante():initialize()# Definir el número de estudiantesN_estudiantes = 300

11

# Estaciones de servicioestaciones = []for i in range(6):

estaciones.append(Resource(capacity=1, name = "Estación" + str(i+1),\

monitored = True, monitorType=Monitor))

# Tiempos de serviciot_servicio = []#-T. servicio para estación 1t_servicio.append(normalvariate(0.48, 0.15))#-T. servicio para estación 2t_servicio.append(normalvariate(0.42, 0.18))#-T. servicio para estación 3t_servicio.append(normalvariate(0.38, 0.21))#-T. servicio para estación 4t_servicio.append(normalvariate(0.55, 0.14))#-T. servicio para estación 5t_servicio.append(normalvariate(0.31, 0.22))#-T. servicio para estación 6

t_servicio.append(normalvariate(0.15, 0.08))

# creación de estudiantesestudiantes = []for i in range(N_estudiantes):

estudiantes.append(Estudiante(name="Estudiante" + str(i+1)))

# tiempos de llegada de estudiantest_llegada = []for i in range(N_estudiantes):

# Llegadas entre 12:00 y 12:20if now() in [0,20]:

t_llegada.append(i*0.5) # 1 llegada cada 30 segundas# Llegadas entre 12:20 y 14:00elif now() in [20,120]:

t_llegada.append(i*1.0) # 1 llegada cada minuto# Llegadas entre 14:00 y 14:20elif now() in [120,140]:

t_llegada.append(i*0.5) # 1 llegada cada 30 segundos# Llegadas después de las 14:20else:

t_llegada.append(i*1.0) # 1 llegada cada minuto

12

# Cada estudiante solicita el servicio de restaurantefor i in range(N_estudiantes):

activate(estudiantes[i], estudiantes[i].servirse(estaciones, t_servicio),\at=t_llegada[i])

simulate(until=150) # La simulación continúa máximo hasta el periodo 150# Realiza el reporte de la simulación de un díaprint(’\n\nREPORTE DE LA SIMULACIÓN\n\n’)for i in range(6):

print(’\n\nReporte para la estación %s\n’ % (i+1))estacion = estaciones[i]print(’Tiempo promedio de servicio: %s’ % estacion.actMon.timeAverage())print(’Tiempo promedio de espera: %s’ % estacion.waitMon.timeAverage())

print(’\n\n’)

# Se asegura de encontrar una simulación exitosadef simulacion_segura():

"""En ocasiones el tiempo de espera es negativo y el problemase vuelve infactible, así que se debe encontrar un punto de inicio adecuado"""while True:

try:simular_restaurante()break

except:

continue

# Realiza la simulación de un díasimulacion_segura()

13

Al ejecutar el script anterior se obtiene el resultado mostrado a continuación:

REPORTE DE LA SIMULACIÓN

Reporte para la estación 1Tiempo promedio de servicio: 0.9970678389295233Tiempo promedio de espera: 0.0

Reporte para la estación 2Tiempo promedio de servicio: 0.9966764405369016Tiempo promedio de espera: 47.816905102669025

Reporte para la estación 3Tiempo promedio de servicio: 0.1025974892555861Tiempo promedio de espera: 0.0

Reporte para la estación 4Tiempo promedio de servicio: 0.8871040144436216Tiempo promedio de espera: 0.0

Reporte para la estación 5Tiempo promedio de servicio: 0.3466970875544188Tiempo promedio de espera: 0.0

Reporte para la estación 6Tiempo promedio de servicio: 0.257103025029875Tiempo promedio de espera: 0.0

14

B. Resultado con seguimiento de eventos

El módulo SimPy.SimulationTrace permite hacer un seguimiento detallado a la ocu-rrencia de eventos en la simulación. Al ejecutarlo en el script propuesto (con sólo 10estudiantes por motivos de extensión) se obtienen los siguientes resultados:

0 activate <Estudiante1> at time: 0 prior: False0 activate <Estudiante2> at time: 0.5 prior: False0 activate <Estudiante3> at time: 1.0 prior: False0 activate <Estudiante4> at time: 1.5 prior: False0 activate <Estudiante5> at time: 2.0 prior: False0 activate <Estudiante6> at time: 2.5 prior: False0 activate <Estudiante7> at time: 3.0 prior: False0 activate <Estudiante8> at time: 3.5 prior: False0 activate <Estudiante9> at time: 4.0 prior: False0 activate <Estudiante10> at time: 4.5 prior: False0 request <Estudiante1> <Estación1> priority: default. . .waitQ: []. . .activeQ: [’Estudiante1’]0 hold <Estudiante1> delay: 0.38214646308249580.3821464630824958 release <Estudiante1> <Estación1>. . .waitQ: []. . .activeQ: []0.3821464630824958 request <Estudiante1> <Estación2> priority: default. . .waitQ: []. . .activeQ: [’Estudiante1’]0.3821464630824958 hold <Estudiante1> delay: 0.236171547511255210.5 request <Estudiante2> <Estación1> priority: default. . .waitQ: []. . .activeQ: [’Estudiante2’]0.5 hold <Estudiante2> delay: 0.38214646308249580.618318010593751 release <Estudiante1> <Estación2>. . .waitQ: []. . .activeQ: []0.618318010593751 request <Estudiante1> <Estación3> priority: default

15

. . .waitQ: []

. . .activeQ: [’Estudiante1’]0.618318010593751 hold <Estudiante1> delay: 0.41733667871337640.8821464630824958 release <Estudiante2> <Estación1>. . .waitQ: []. . .activeQ: []0.8821464630824958 request <Estudiante2> <Estación2> priority: default. . .waitQ: []. . .activeQ: [’Estudiante2’]0.8821464630824958 hold <Estudiante2> delay: 0.236171547511255211.0 request <Estudiante3> <Estación1> priority: default. . .waitQ: []. . .activeQ: [’Estudiante3’]1.0 hold <Estudiante3> delay: 0.38214646308249581.0356546893071275 release <Estudiante1> <Estación3>. . .waitQ: []. . .activeQ: []1.0356546893071275 request <Estudiante1> <Estación4> priority: default. . .waitQ: []. . .activeQ: [’Estudiante1’]1.0356546893071275 hold <Estudiante1> delay: 0.51609114268965641.118318010593751 release <Estudiante2> <Estación2>. . .waitQ: []. . .activeQ: []1.118318010593751 request <Estudiante2> <Estación3> priority: default. . .waitQ: []. . .activeQ: [’Estudiante2’]1.118318010593751 hold <Estudiante2> delay: 0.41733667871337641.3821464630824958 release <Estudiante3> <Estación1>. . .waitQ: []. . .activeQ: []1.3821464630824958 request <Estudiante3> <Estación2> priority: default. . .waitQ: []. . .activeQ: [’Estudiante3’]1.3821464630824958 hold <Estudiante3> delay: 0.23617154751125521

16

1.5 request <Estudiante4> <Estación1> priority: default. . .waitQ: []. . .activeQ: [’Estudiante4’]1.5 hold <Estudiante4> delay: 0.38214646308249581.5356546893071272 release <Estudiante2> <Estación3>. . .waitQ: []. . .activeQ: []1.5356546893071272 request <Estudiante2> <Estación4> priority: default. . .waitQ: [’Estudiante2’]. . .activeQ: [’Estudiante1’]1.5517458319967838 reactivate <Estudiante2> time: 1.5517458319967838 prior: 11.5517458319967838 release <Estudiante1> <Estación4>. . .waitQ: []. . .activeQ: [’Estudiante2’]1.5517458319967838 request <Estudiante1> <Estación5> priority: default. . .waitQ: []. . .activeQ: [’Estudiante1’]1.5517458319967838 hold <Estudiante1> delay: 0.153126503361718931.5517458319967838 hold <Estudiante2> delay: 0.51609114268965641.618318010593751 release <Estudiante3> <Estación2>. . .waitQ: []. . .activeQ: []1.618318010593751 request <Estudiante3> <Estación3> priority: default. . .waitQ: []. . .activeQ: [’Estudiante3’]1.618318010593751 hold <Estudiante3> delay: 0.41733667871337641.7048723353585027 release <Estudiante1> <Estación5>. . .waitQ: []. . .activeQ: []1.7048723353585027 request <Estudiante1> <Estación6> priority: default. . .waitQ: []. . .activeQ: [’Estudiante1’]1.7048723353585027 hold <Estudiante1> delay: 0.16234834364098861.8672206789994914 release <Estudiante1> <Estación6>. . .waitQ: []

17

. . .activeQ: []1.8672206789994914 <Estudiante1> terminated1.8821464630824958 release <Estudiante4> <Estación1>. . .waitQ: []. . .activeQ: []1.8821464630824958 request <Estudiante4> <Estación2> priority: default. . .waitQ: []. . .activeQ: [’Estudiante4’]1.8821464630824958 hold <Estudiante4> delay: 0.236171547511255212.0 request <Estudiante5> <Estación1> priority: default. . .waitQ: []. . .activeQ: [’Estudiante5’]2.0 hold <Estudiante5> delay: 0.38214646308249582.0356546893071275 release <Estudiante3> <Estación3>. . .waitQ: []. . .activeQ: []2.0356546893071275 request <Estudiante3> <Estación4> priority: default. . .waitQ: [’Estudiante3’]. . .activeQ: [’Estudiante2’]2.0678369746864402 reactivate <Estudiante3> time: 2.0678369746864402 prior: 12.0678369746864402 release <Estudiante2> <Estación4>. . .waitQ: []. . .activeQ: [’Estudiante3’]2.0678369746864402 request <Estudiante2> <Estación5> priority: default. . .waitQ: []. . .activeQ: [’Estudiante2’]2.0678369746864402 hold <Estudiante2> delay: 0.153126503361718932.0678369746864402 hold <Estudiante3> delay: 0.51609114268965642.118318010593751 release <Estudiante4> <Estación2>. . .waitQ: []. . .activeQ: []2.118318010593751 request <Estudiante4> <Estación3> priority: default. . .waitQ: []. . .activeQ: [’Estudiante4’]2.118318010593751 hold <Estudiante4> delay: 0.4173366787133764

18

2.220963478048159 release <Estudiante2> <Estación5>. . .waitQ: []. . .activeQ: []2.220963478048159 request <Estudiante2> <Estación6> priority: default. . .waitQ: []. . .activeQ: [’Estudiante2’]2.220963478048159 hold <Estudiante2> delay: 0.16234834364098862.3821464630824956 release <Estudiante5> <Estación1>. . .waitQ: []. . .activeQ: []2.3821464630824956 request <Estudiante5> <Estación2> priority: default. . .waitQ: []. . .activeQ: [’Estudiante5’]2.3821464630824956 hold <Estudiante5> delay: 0.236171547511255212.383311821689148 release <Estudiante2> <Estación6>. . .waitQ: []. . .activeQ: []2.383311821689148 <Estudiante2> terminated2.5 request <Estudiante6> <Estación1> priority: default. . .waitQ: []. . .activeQ: [’Estudiante6’]2.5 hold <Estudiante6> delay: 0.38214646308249582.5356546893071275 release <Estudiante4> <Estación3>. . .waitQ: []. . .activeQ: []2.5356546893071275 request <Estudiante4> <Estación4> priority: default. . .waitQ: [’Estudiante4’]. . .activeQ: [’Estudiante3’]2.5839281173760966 reactivate <Estudiante4> time: 2.5839281173760966 prior: 12.5839281173760966 release <Estudiante3> <Estación4>. . .waitQ: []. . .activeQ: [’Estudiante4’]2.5839281173760966 request <Estudiante3> <Estación5> priority: default. . .waitQ: []. . .activeQ: [’Estudiante3’]

19

2.5839281173760966 hold <Estudiante3> delay: 0.153126503361718932.5839281173760966 hold <Estudiante4> delay: 0.51609114268965642.6183180105937507 release <Estudiante5> <Estación2>. . .waitQ: []. . .activeQ: []2.6183180105937507 request <Estudiante5> <Estación3> priority: default. . .waitQ: []. . .activeQ: [’Estudiante5’]2.6183180105937507 hold <Estudiante5> delay: 0.41733667871337642.7370546207378155 release <Estudiante3> <Estación5>. . .waitQ: []. . .activeQ: []2.7370546207378155 request <Estudiante3> <Estación6> priority: default. . .waitQ: []. . .activeQ: [’Estudiante3’]2.7370546207378155 hold <Estudiante3> delay: 0.16234834364098862.8821464630824956 release <Estudiante6> <Estación1>. . .waitQ: []. . .activeQ: []2.8821464630824956 request <Estudiante6> <Estación2> priority: default. . .waitQ: []. . .activeQ: [’Estudiante6’]2.8821464630824956 hold <Estudiante6> delay: 0.236171547511255212.899402964378804 release <Estudiante3> <Estación6>. . .waitQ: []. . .activeQ: []2.899402964378804 <Estudiante3> terminated3.0 request <Estudiante7> <Estación1> priority: default. . .waitQ: []. . .activeQ: [’Estudiante7’]3.0 hold <Estudiante7> delay: 0.38214646308249583.035654689307127 release <Estudiante5> <Estación3>. . .waitQ: []. . .activeQ: []3.035654689307127 request <Estudiante5> <Estación4> priority: default

20

. . .waitQ: [’Estudiante5’]

. . .activeQ: [’Estudiante4’]3.100019260065753 reactivate <Estudiante5> time: 3.100019260065753 prior: 13.100019260065753 release <Estudiante4> <Estación4>. . .waitQ: []. . .activeQ: [’Estudiante5’]3.100019260065753 request <Estudiante4> <Estación5> priority: default. . .waitQ: []. . .activeQ: [’Estudiante4’]3.100019260065753 hold <Estudiante4> delay: 0.153126503361718933.100019260065753 hold <Estudiante5> delay: 0.51609114268965643.1183180105937507 release <Estudiante6> <Estación2>. . .waitQ: []. . .activeQ: []3.1183180105937507 request <Estudiante6> <Estación3> priority: default. . .waitQ: []. . .activeQ: [’Estudiante6’]3.1183180105937507 hold <Estudiante6> delay: 0.41733667871337643.253145763427472 release <Estudiante4> <Estación5>. . .waitQ: []. . .activeQ: []3.253145763427472 request <Estudiante4> <Estación6> priority: default. . .waitQ: []. . .activeQ: [’Estudiante4’]3.253145763427472 hold <Estudiante4> delay: 0.16234834364098863.3821464630824956 release <Estudiante7> <Estación1>. . .waitQ: []. . .activeQ: []3.3821464630824956 request <Estudiante7> <Estación2> priority: default. . .waitQ: []. . .activeQ: [’Estudiante7’]3.3821464630824956 hold <Estudiante7> delay: 0.236171547511255213.4154941070684606 release <Estudiante4> <Estación6>. . .waitQ: []. . .activeQ: []

21

3.4154941070684606 <Estudiante4> terminated3.5 request <Estudiante8> <Estación1> priority: default. . .waitQ: []. . .activeQ: [’Estudiante8’]3.5 hold <Estudiante8> delay: 0.38214646308249583.535654689307127 release <Estudiante6> <Estación3>. . .waitQ: []. . .activeQ: []3.535654689307127 request <Estudiante6> <Estación4> priority: default. . .waitQ: [’Estudiante6’]. . .activeQ: [’Estudiante5’]3.6161104027554094 reactivate <Estudiante6> time: 3.6161104027554094 prior: 13.6161104027554094 release <Estudiante5> <Estación4>. . .waitQ: []. . .activeQ: [’Estudiante6’]3.6161104027554094 request <Estudiante5> <Estación5> priority: default. . .waitQ: []. . .activeQ: [’Estudiante5’]3.6161104027554094 hold <Estudiante5> delay: 0.153126503361718933.6161104027554094 hold <Estudiante6> delay: 0.51609114268965643.6183180105937507 release <Estudiante7> <Estación2>. . .waitQ: []. . .activeQ: []3.6183180105937507 request <Estudiante7> <Estación3> priority: default. . .waitQ: []. . .activeQ: [’Estudiante7’]3.6183180105937507 hold <Estudiante7> delay: 0.41733667871337643.7692369061171282 release <Estudiante5> <Estación5>. . .waitQ: []. . .activeQ: []3.7692369061171282 request <Estudiante5> <Estación6> priority: default. . .waitQ: []. . .activeQ: [’Estudiante5’]3.7692369061171282 hold <Estudiante5> delay: 0.16234834364098863.8821464630824956 release <Estudiante8> <Estación1>

22

. . .waitQ: []

. . .activeQ: []3.8821464630824956 request <Estudiante8> <Estación2> priority: default. . .waitQ: []. . .activeQ: [’Estudiante8’]3.8821464630824956 hold <Estudiante8> delay: 0.236171547511255213.931585249758117 release <Estudiante5> <Estación6>. . .waitQ: []. . .activeQ: []3.931585249758117 <Estudiante5> terminated4.0 request <Estudiante9> <Estación1> priority: default. . .waitQ: []. . .activeQ: [’Estudiante9’]4.0 hold <Estudiante9> delay: 0.38214646308249584.035654689307127 release <Estudiante7> <Estación3>. . .waitQ: []. . .activeQ: []4.035654689307127 request <Estudiante7> <Estación4> priority: default. . .waitQ: [’Estudiante7’]. . .activeQ: [’Estudiante6’]4.118318010593751 release <Estudiante8> <Estación2>. . .waitQ: []. . .activeQ: []4.118318010593751 request <Estudiante8> <Estación3> priority: default. . .waitQ: []. . .activeQ: [’Estudiante8’]4.118318010593751 hold <Estudiante8> delay: 0.41733667871337644.132201545445065 reactivate <Estudiante7> time: 4.132201545445065 prior: 14.132201545445065 release <Estudiante6> <Estación4>. . .waitQ: []. . .activeQ: [’Estudiante7’]4.132201545445065 request <Estudiante6> <Estación5> priority: default. . .waitQ: []. . .activeQ: [’Estudiante6’]4.132201545445065 hold <Estudiante6> delay: 0.15312650336171893

23

4.132201545445065 hold <Estudiante7> delay: 0.51609114268965644.285328048806784 release <Estudiante6> <Estación5>. . .waitQ: []. . .activeQ: []4.285328048806784 request <Estudiante6> <Estación6> priority: default. . .waitQ: []. . .activeQ: [’Estudiante6’]4.285328048806784 hold <Estudiante6> delay: 0.16234834364098864.382146463082496 release <Estudiante9> <Estación1>. . .waitQ: []. . .activeQ: []4.382146463082496 request <Estudiante9> <Estación2> priority: default. . .waitQ: []. . .activeQ: [’Estudiante9’]4.382146463082496 hold <Estudiante9> delay: 0.236171547511255214.4476763924477725 release <Estudiante6> <Estación6>. . .waitQ: []. . .activeQ: []4.4476763924477725 <Estudiante6> terminated4.5 request <Estudiante10> <Estación1> priority: default. . .waitQ: []. . .activeQ: [’Estudiante10’]4.5 hold <Estudiante10> delay: 0.38214646308249584.535654689307128 release <Estudiante8> <Estación3>. . .waitQ: []. . .activeQ: []4.535654689307128 request <Estudiante8> <Estación4> priority: default. . .waitQ: [’Estudiante8’]. . .activeQ: [’Estudiante7’]4.618318010593751 release <Estudiante9> <Estación2>. . .waitQ: []. . .activeQ: []4.618318010593751 request <Estudiante9> <Estación3> priority: default. . .waitQ: []. . .activeQ: [’Estudiante9’]

24

4.618318010593751 hold <Estudiante9> delay: 0.41733667871337644.648292688134722 reactivate <Estudiante8> time: 4.648292688134722 prior: 14.648292688134722 release <Estudiante7> <Estación4>. . .waitQ: []. . .activeQ: [’Estudiante8’]4.648292688134722 request <Estudiante7> <Estación5> priority: default. . .waitQ: []. . .activeQ: [’Estudiante7’]4.648292688134722 hold <Estudiante7> delay: 0.153126503361718934.648292688134722 hold <Estudiante8> delay: 0.51609114268965644.801419191496441 release <Estudiante7> <Estación5>. . .waitQ: []. . .activeQ: []4.801419191496441 request <Estudiante7> <Estación6> priority: default. . .waitQ: []. . .activeQ: [’Estudiante7’]4.801419191496441 hold <Estudiante7> delay: 0.16234834364098864.882146463082496 release <Estudiante10> <Estación1>. . .waitQ: []. . .activeQ: []4.882146463082496 request <Estudiante10> <Estación2> priority: default. . .waitQ: []. . .activeQ: [’Estudiante10’]4.882146463082496 hold <Estudiante10> delay: 0.236171547511255214.963767535137429 release <Estudiante7> <Estación6>. . .waitQ: []. . .activeQ: []4.963767535137429 <Estudiante7> terminated5.035654689307128 release <Estudiante9> <Estación3>. . .waitQ: []. . .activeQ: []5.035654689307128 request <Estudiante9> <Estación4> priority: default. . .waitQ: [’Estudiante9’]. . .activeQ: [’Estudiante8’]5.118318010593751 release <Estudiante10> <Estación2>

25

. . .waitQ: []

. . .activeQ: []5.118318010593751 request <Estudiante10> <Estación3> priority: default. . .waitQ: []. . .activeQ: [’Estudiante10’]5.118318010593751 hold <Estudiante10> delay: 0.41733667871337645.164383830824379 reactivate <Estudiante9> time: 5.164383830824379 prior: 15.164383830824379 release <Estudiante8> <Estación4>. . .waitQ: []. . .activeQ: [’Estudiante9’]5.164383830824379 request <Estudiante8> <Estación5> priority: default. . .waitQ: []. . .activeQ: [’Estudiante8’]5.164383830824379 hold <Estudiante8> delay: 0.153126503361718935.164383830824379 hold <Estudiante9> delay: 0.51609114268965645.317510334186098 release <Estudiante8> <Estación5>. . .waitQ: []. . .activeQ: []5.317510334186098 request <Estudiante8> <Estación6> priority: default. . .waitQ: []. . .activeQ: [’Estudiante8’]5.317510334186098 hold <Estudiante8> delay: 0.16234834364098865.479858677827086 release <Estudiante8> <Estación6>. . .waitQ: []. . .activeQ: []5.479858677827086 <Estudiante8> terminated5.535654689307128 release <Estudiante10> <Estación3>. . .waitQ: []. . .activeQ: []5.535654689307128 request <Estudiante10> <Estación4> priority: default. . .waitQ: [’Estudiante10’]. . .activeQ: [’Estudiante9’]5.680474973514036 reactivate <Estudiante10> time: 5.680474973514036 prior: 15.680474973514036 release <Estudiante9> <Estación4>. . .waitQ: []

26

. . .activeQ: [’Estudiante10’]5.680474973514036 request <Estudiante9> <Estación5> priority: default. . .waitQ: []. . .activeQ: [’Estudiante9’]5.680474973514036 hold <Estudiante9> delay: 0.153126503361718935.680474973514036 hold <Estudiante10> delay: 0.51609114268965645.833601476875755 release <Estudiante9> <Estación5>. . .waitQ: []. . .activeQ: []5.833601476875755 request <Estudiante9> <Estación6> priority: default. . .waitQ: []. . .activeQ: [’Estudiante9’]5.833601476875755 hold <Estudiante9> delay: 0.16234834364098865.995949820516743 release <Estudiante9> <Estación6>. . .waitQ: []. . .activeQ: []5.995949820516743 <Estudiante9> terminated6.196566116203693 release <Estudiante10> <Estación4>. . .waitQ: []. . .activeQ: []6.196566116203693 request <Estudiante10> <Estación5> priority: default. . .waitQ: []. . .activeQ: [’Estudiante10’]6.196566116203693 hold <Estudiante10> delay: 0.153126503361718936.3496926195654115 release <Estudiante10> <Estación5>. . .waitQ: []. . .activeQ: []6.3496926195654115 request <Estudiante10> <Estación6> priority: default. . .waitQ: []. . .activeQ: [’Estudiante10’]6.3496926195654115 hold <Estudiante10> delay: 0.16234834364098866.5120409632064 release <Estudiante10> <Estación6>. . .waitQ: []. . .activeQ: []6.5120409632064 <Estudiante10> terminated

27

��REPORTE DE LA SIMULACIÓN�Reporte para la estación 1Tiempo promedio de servicio: 0.5868305577954078Tiempo promedio de espera: 0.0Reporte para la estación 2Tiempo promedio de servicio: 0.362669013978329Tiempo promedio de espera: 0.0Reporte para la estación 3Tiempo promedio de servicio: 0.6408692467866298Tiempo promedio de espera: 0.0Reporte para la estación 4Tiempo promedio de servicio: 0.7925182682443438Tiempo promedio de espera: 0.11119423620425224Reporte para la estación 5Tiempo promedio de servicio: 0.23514364271800034Tiempo promedio de espera: 0.0Reporte para la estación 6Tiempo promedio de servicio: 0.2493048562781942Tiempo promedio de espera: 0.0

28