Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Camilo Bernal
27 de agosto de 2015
ndice
1. Introduccin
3. Qu es SimPy?
4. Qu es Python?
5. Qu es GNU/Linux?
7. Conclusiones
11
15
1.
Introduccin
Cuando se intenta resolver problemas sumamente complejos, es posible que una modelacin matemtica sea inadecuada. Esto se debe no solamente a la complejidad intrnseca
del modelo que se est tratando, sino tambin a la dificultad que representa resolver
numricamente el problema planteado.
Ante estas situaciones es posible hacer uso de una tcnica de Investigacin de Operaciones llamada Simulacin Discreta. Esta tcnica intenta modelar sistemas del mundo real
a travs de la construccin de simulaciones basadas en los principales elementos de las
percepciones que se tienen sobre un problema en particular.
El objetivo de usar estas tcnicas es hacer anlisis del tipo Qu pasara si. . . donde
. . . representa cambios en los parmetros, variables y restricciones del modelo que se
est considerando. Este tipo de experimentos puede resultar muy til en caso de pruebas
destructivas y/o muy costosas sobre el objeto de estudio, con lo cual se combinan en un
mismo modelo elementos objetivos, elementos subjetivos, recomendaciones de expertos
y bases de datos de conocimiento.
En el presente documento se presenta una herramienta para hacer simulacin de eventos
discretos basados en procesos para el sistema operativo Linux. Se plantea un ejemplo
muy sencillo a modo de ilustracin.
2.
La simulacin discreta sirve para analizar sistemas en los cuales la experimentaci directa
resulta destructiva y/o muy costosa. En algunas ocasiones tambin se puede usar para
modelar problemas complejos de produccin, redes logsticas y administracin,. . . en los
que los modelos matemticos son muy difciles de construir y/o resolver con tcnicas
ms convencionales de Investigacin de Operaciones.
La simulacin discreta tambin ayuda a combinar diversos enfoques de solucin de problemas como minera 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 herramientas ms flexibles y verstiles para codificar y resolver problemas.
3.
Qu es SimPy?
4.
Qu es Python?
Python es un lenguaje de programacin multiparadigma (soporta programacin orientada a objetos, programacin imperativa y programacin funcional). Es un lenguaje
interpretado multiplataforma (se puede usar en Microsoft Windows, GNU/Linux, Unix
y MacOS) y de tipado dinmico.
El intrprete de Python viene pre-instalado en los sistemas tipo Unix (GNU/Linux y
MacOS). Para los que usan Microsoft Windows deben buscarlo en google.
5.
Qu es GNU/Linux?
GNU/Linux es el mejor sistema operativo que el dinero no puede comprar. A diferencia de otras alternativas, lo puedes usar no slo para desperdiciar el tiempo en tu PC
personal, sino tambin en entornos de sper-computacin y granjas de servidores.
Comparado con Microsoft Windows, es ms rpido, no tiene virus, es multitarea y multiusuario, no cobra por la licencia, no cobra por actualizaciones, no roba tu informacin
personal para enviarla a servidores remotos,... y ms.
Comparado con Mac OS, es multitarea y multiusuario, no te deja en la ruina econmica,
no te dice qu tipo de persona eres por usarlo (t decides quin eres, por ejemplo una
persona autntica),... y ms, aunque se reconoce la superioridad de Mac OS sobre Microsoft Windows, ambos sistemas te cobran cifras astronmicas por darte mucho menos
de lo que GNU/Linux te dara a precios ridculamente bajos (Ojo: no confundir valor
con precio).
Concretamente, Linux es un sistema operativo: un conjunto de programas que le permiten interactuar con su ordenador y ejecutar otros programas. Un sistema operativo
consiste en varios programas fundamentales que necesita el ordenador para poder comunicar y recibir instrucciones de los usuarios; tales como leer y escribir datos en el disco
duro, cintas, e impresoras; controlar el uso de la memoria; y ejecutar otros programas. La
parte ms importante de un sistema operativo es el ncleo. En un sistema GNU/Linux,
Linux es el ncleo. El resto del sistema consiste en otros programas, muchos de los cuales
fueron escritos por o para el proyecto GNU.
6.
Fuente: Elaboracin propia
En el modelo planteado, el estudiante llega y espera (si es necesario) a que cada estacin
est disponible. Una vez que esto se cumple, el estudiante ocupa el recurso (la estacin
particular), lo utiliza durante algunos segundos y despus lo libera para ir a la siguiente
estacin. Cuando no quedan ma estaciones el estudiante abandona el auto-servicio y se
dirige a disfrutar de su almuerzo.
El elemento activo del modelo es el estudiante. Los elementos inactivos (las estaciones)
se pueden modelar como recursos. El tiempo de servicio en cada estacin se plantea
como una demora.
SimPy permite modelar las entidades del modelo como objetos (instancias de clases)
con caractersticas (atributos) y acciones (mtodos). Los eventos se modelan utilizando
generadores1 .
A continuacin se describen los principales elementos de SimPy para realizar la modelacin.
yield hold,self,t_demora: Sentencia de un mtodo perteneciente a un objeto
(instancia de clase). Con esto se expresa una espera (demora) de t_demora unidades de tiempo.
activate(objeto, mtodo(name=mi_objeto), at=0, delay=0, prior=False).
Esta sentencia se aplica a un objeto (instancia de clase). Con esta expresin se activan las acciones (mtodos) de un objeto activo (una entidad modelada como
instancia de clase en SimPy) con algunos parmetros opcionales como el momento
de activacin (at=...), demora(at=...), y prioridad(prior=...).
resource(capacity=1, name=a_resource, unitName=units, qType=FIFO,
preemptable=False, monitored=False, monitorType=Monitor). Permite
modelar una recurso (objeto pasivo). Se puede definir su capacidad (capacity=...),
un identificador(name=...), y otros parmetros opcionales.
yield request, self, resouce_name. Sentencia de un mtodo perteneciente a un
objeto (instancia de clase). Con esto se solicita el uso de un recurso. La entidad
se pone en espera hasta que el recurso est disponible. Una vez disponible, toma
el recurso (con lo cual no estar disponible para las entidades precedentes que lo
soliciten) durante algn tiempo y lo libera.
yield release, self, resource_name. Sentencia de un mtodo perteneciente a
un 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 un
gran nmero de opciones adicionales que pueden consultarse en el manual. En el anexo
1
Por favor, leer el manual de Python y de SimPy para entender lo que estoy diciendo
A se puede ver la aplicacin prctica de algunas de estas opciones usadas para modelar
el restaurante universitario.
7.
Conclusiones
Es posible usar SimPy para realizar simulacin discreta de una manera intuitiva
y escalable, a fin de que se puedan construir modelos tanto para propsitos pedaggicos como en ambientes de produccin real sin incurrir en costos ni licencias
adicionales.
A diferencia de otras herramientas, SimPy permite usar toda la potencia y versatilidad de un autntico lenguaje de programacin profesional como Python.
Referencias
[1] Wikipedia: La enciclopedia libre. GNU/Linux.
http://es.wikipedia.org/wiki/GNU/Linux?oldid=78087514. Fecha de acceso: 11 nov
2014.
[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.
def simular_restaurante():
initialize()
# Definir el nmero de estudiantes
N_estudiantes = 300
11
# Estaciones de servicio
estaciones = []
for i in range(6):
estaciones.append(Resource(capacity=1, name = "Estacin" + str(i+1),\
monitored = True, monitorType=Monitor))
# Tiempos de servicio
t_servicio = []
#-T. servicio para estacin 1
t_servicio.append(normalvariate(0.48,
#-T. servicio para estacin 2
t_servicio.append(normalvariate(0.42,
#-T. servicio para estacin 3
t_servicio.append(normalvariate(0.38,
#-T. servicio para estacin 4
t_servicio.append(normalvariate(0.55,
#-T. servicio para estacin 5
t_servicio.append(normalvariate(0.31,
#-T. servicio para estacin 6
0.15))
0.18))
0.21))
0.14))
0.22))
t_servicio.append(normalvariate(0.15, 0.08))
# creacin de estudiantes
estudiantes = []
for i in range(N_estudiantes):
estudiantes.append(Estudiante(name="Estudiante" + str(i+1)))
# tiempos de llegada de estudiantes
t_llegada = []
for i in range(N_estudiantes):
# Llegadas entre 12:00 y 12:20
if now() in [0,20]:
t_llegada.append(i*0.5) # 1 llegada cada 30 segundas
# Llegadas entre 12:20 y 14:00
elif now() in [20,120]:
t_llegada.append(i*1.0) # 1 llegada cada minuto
# Llegadas entre 14:00 y 14:20
elif now() in [120,140]:
t_llegada.append(i*0.5) # 1 llegada cada 30 segundos
# Llegadas despus de las 14:20
else:
t_llegada.append(i*1.0) # 1 llegada cada minuto
12
13
14
B.
El mdulo SimPy.SimulationTrace permite hacer un seguimiento detallado a la ocurrencia de eventos en la simulacin. Al ejecutarlo en el script propuesto (con slo 10
estudiantes por motivos de extensin) se obtienen los siguientes resultados:
0 activate <Estudiante1> at time: 0 prior: False
0 activate <Estudiante2> at time: 0.5 prior: False
0 activate <Estudiante3> at time: 1.0 prior: False
0 activate <Estudiante4> at time: 1.5 prior: False
0 activate <Estudiante5> at time: 2.0 prior: False
0 activate <Estudiante6> at time: 2.5 prior: False
0 activate <Estudiante7> at time: 3.0 prior: False
0 activate <Estudiante8> at time: 3.5 prior: False
0 activate <Estudiante9> at time: 4.0 prior: False
0 activate <Estudiante10> at time: 4.5 prior: False
0 request <Estudiante1> <Estacin1> priority: default
. . .waitQ: []
. . .activeQ: [Estudiante1]
0 hold <Estudiante1> delay: 0.3821464630824958
0.3821464630824958 release <Estudiante1> <Estacin1>
. . .waitQ: []
. . .activeQ: []
0.3821464630824958 request <Estudiante1> <Estacin2> priority: default
. . .waitQ: []
. . .activeQ: [Estudiante1]
0.3821464630824958 hold <Estudiante1> delay: 0.23617154751125521
0.5 request <Estudiante2> <Estacin1> priority: default
. . .waitQ: []
. . .activeQ: [Estudiante2]
0.5 hold <Estudiante2> delay: 0.3821464630824958
0.618318010593751 release <Estudiante1> <Estacin2>
. . .waitQ: []
. . .activeQ: []
0.618318010593751 request <Estudiante1> <Estacin3> priority: default
15
. . .waitQ: []
. . .activeQ: [Estudiante1]
0.618318010593751 hold <Estudiante1> delay: 0.4173366787133764
0.8821464630824958 release <Estudiante2> <Estacin1>
. . .waitQ: []
. . .activeQ: []
0.8821464630824958 request <Estudiante2> <Estacin2> priority: default
. . .waitQ: []
. . .activeQ: [Estudiante2]
0.8821464630824958 hold <Estudiante2> delay: 0.23617154751125521
1.0 request <Estudiante3> <Estacin1> priority: default
. . .waitQ: []
. . .activeQ: [Estudiante3]
1.0 hold <Estudiante3> delay: 0.3821464630824958
1.0356546893071275 release <Estudiante1> <Estacin3>
. . .waitQ: []
. . .activeQ: []
1.0356546893071275 request <Estudiante1> <Estacin4> priority: default
. . .waitQ: []
. . .activeQ: [Estudiante1]
1.0356546893071275 hold <Estudiante1> delay: 0.5160911426896564
1.118318010593751 release <Estudiante2> <Estacin2>
. . .waitQ: []
. . .activeQ: []
1.118318010593751 request <Estudiante2> <Estacin3> priority: default
. . .waitQ: []
. . .activeQ: [Estudiante2]
1.118318010593751 hold <Estudiante2> delay: 0.4173366787133764
1.3821464630824958 release <Estudiante3> <Estacin1>
. . .waitQ: []
. . .activeQ: []
1.3821464630824958 request <Estudiante3> <Estacin2> priority: default
. . .waitQ: []
. . .activeQ: [Estudiante3]
1.3821464630824958 hold <Estudiante3> delay: 0.23617154751125521
16
17
. . .activeQ: []
1.8672206789994914 <Estudiante1> terminated
1.8821464630824958 release <Estudiante4> <Estacin1>
. . .waitQ: []
. . .activeQ: []
1.8821464630824958 request <Estudiante4> <Estacin2> priority: default
. . .waitQ: []
. . .activeQ: [Estudiante4]
1.8821464630824958 hold <Estudiante4> delay: 0.23617154751125521
2.0 request <Estudiante5> <Estacin1> priority: default
. . .waitQ: []
. . .activeQ: [Estudiante5]
2.0 hold <Estudiante5> delay: 0.3821464630824958
2.0356546893071275 release <Estudiante3> <Estacin3>
. . .waitQ: []
. . .activeQ: []
2.0356546893071275 request <Estudiante3> <Estacin4> priority: default
. . .waitQ: [Estudiante3]
. . .activeQ: [Estudiante2]
2.0678369746864402 reactivate <Estudiante3> time: 2.0678369746864402 prior: 1
2.0678369746864402 release <Estudiante2> <Estacin4>
. . .waitQ: []
. . .activeQ: [Estudiante3]
2.0678369746864402 request <Estudiante2> <Estacin5> priority: default
. . .waitQ: []
. . .activeQ: [Estudiante2]
2.0678369746864402 hold <Estudiante2> delay: 0.15312650336171893
2.0678369746864402 hold <Estudiante3> delay: 0.5160911426896564
2.118318010593751 release <Estudiante4> <Estacin2>
. . .waitQ: []
. . .activeQ: []
2.118318010593751 request <Estudiante4> <Estacin3> priority: default
. . .waitQ: []
. . .activeQ: [Estudiante4]
2.118318010593751 hold <Estudiante4> delay: 0.4173366787133764
18
19
20
. . .waitQ: [Estudiante5]
. . .activeQ: [Estudiante4]
3.100019260065753 reactivate <Estudiante5> time: 3.100019260065753 prior: 1
3.100019260065753 release <Estudiante4> <Estacin4>
. . .waitQ: []
. . .activeQ: [Estudiante5]
3.100019260065753 request <Estudiante4> <Estacin5> priority: default
. . .waitQ: []
. . .activeQ: [Estudiante4]
3.100019260065753 hold <Estudiante4> delay: 0.15312650336171893
3.100019260065753 hold <Estudiante5> delay: 0.5160911426896564
3.1183180105937507 release <Estudiante6> <Estacin2>
. . .waitQ: []
. . .activeQ: []
3.1183180105937507 request <Estudiante6> <Estacin3> priority: default
. . .waitQ: []
. . .activeQ: [Estudiante6]
3.1183180105937507 hold <Estudiante6> delay: 0.4173366787133764
3.253145763427472 release <Estudiante4> <Estacin5>
. . .waitQ: []
. . .activeQ: []
3.253145763427472 request <Estudiante4> <Estacin6> priority: default
. . .waitQ: []
. . .activeQ: [Estudiante4]
3.253145763427472 hold <Estudiante4> delay: 0.1623483436409886
3.3821464630824956 release <Estudiante7> <Estacin1>
. . .waitQ: []
. . .activeQ: []
3.3821464630824956 request <Estudiante7> <Estacin2> priority: default
. . .waitQ: []
. . .activeQ: [Estudiante7]
3.3821464630824956 hold <Estudiante7> delay: 0.23617154751125521
3.4154941070684606 release <Estudiante4> <Estacin6>
. . .waitQ: []
. . .activeQ: []
21
22
. . .waitQ: []
. . .activeQ: []
3.8821464630824956 request <Estudiante8> <Estacin2> priority: default
. . .waitQ: []
. . .activeQ: [Estudiante8]
3.8821464630824956 hold <Estudiante8> delay: 0.23617154751125521
3.931585249758117 release <Estudiante5> <Estacin6>
. . .waitQ: []
. . .activeQ: []
3.931585249758117 <Estudiante5> terminated
4.0 request <Estudiante9> <Estacin1> priority: default
. . .waitQ: []
. . .activeQ: [Estudiante9]
4.0 hold <Estudiante9> delay: 0.3821464630824958
4.035654689307127 release <Estudiante7> <Estacin3>
. . .waitQ: []
. . .activeQ: []
4.035654689307127 request <Estudiante7> <Estacin4> priority: default
. . .waitQ: [Estudiante7]
. . .activeQ: [Estudiante6]
4.118318010593751 release <Estudiante8> <Estacin2>
. . .waitQ: []
. . .activeQ: []
4.118318010593751 request <Estudiante8> <Estacin3> priority: default
. . .waitQ: []
. . .activeQ: [Estudiante8]
4.118318010593751 hold <Estudiante8> delay: 0.4173366787133764
4.132201545445065 reactivate <Estudiante7> time: 4.132201545445065 prior: 1
4.132201545445065 release <Estudiante6> <Estacin4>
. . .waitQ: []
. . .activeQ: [Estudiante7]
4.132201545445065 request <Estudiante6> <Estacin5> priority: default
. . .waitQ: []
. . .activeQ: [Estudiante6]
4.132201545445065 hold <Estudiante6> delay: 0.15312650336171893
23
24
25
. . .waitQ: []
. . .activeQ: []
5.118318010593751 request <Estudiante10> <Estacin3> priority: default
. . .waitQ: []
. . .activeQ: [Estudiante10]
5.118318010593751 hold <Estudiante10> delay: 0.4173366787133764
5.164383830824379 reactivate <Estudiante9> time: 5.164383830824379 prior: 1
5.164383830824379 release <Estudiante8> <Estacin4>
. . .waitQ: []
. . .activeQ: [Estudiante9]
5.164383830824379 request <Estudiante8> <Estacin5> priority: default
. . .waitQ: []
. . .activeQ: [Estudiante8]
5.164383830824379 hold <Estudiante8> delay: 0.15312650336171893
5.164383830824379 hold <Estudiante9> delay: 0.5160911426896564
5.317510334186098 release <Estudiante8> <Estacin5>
. . .waitQ: []
. . .activeQ: []
5.317510334186098 request <Estudiante8> <Estacin6> priority: default
. . .waitQ: []
. . .activeQ: [Estudiante8]
5.317510334186098 hold <Estudiante8> delay: 0.1623483436409886
5.479858677827086 release <Estudiante8> <Estacin6>
. . .waitQ: []
. . .activeQ: []
5.479858677827086 <Estudiante8> terminated
5.535654689307128 release <Estudiante10> <Estacin3>
. . .waitQ: []
. . .activeQ: []
5.535654689307128 request <Estudiante10> <Estacin4> priority: default
. . .waitQ: [Estudiante10]
. . .activeQ: [Estudiante9]
5.680474973514036 reactivate <Estudiante10> time: 5.680474973514036 prior: 1
5.680474973514036 release <Estudiante9> <Estacin4>
. . .waitQ: []
26
. . .activeQ: [Estudiante10]
5.680474973514036 request <Estudiante9> <Estacin5> priority: default
. . .waitQ: []
. . .activeQ: [Estudiante9]
5.680474973514036 hold <Estudiante9> delay: 0.15312650336171893
5.680474973514036 hold <Estudiante10> delay: 0.5160911426896564
5.833601476875755 release <Estudiante9> <Estacin5>
. . .waitQ: []
. . .activeQ: []
5.833601476875755 request <Estudiante9> <Estacin6> priority: default
. . .waitQ: []
. . .activeQ: [Estudiante9]
5.833601476875755 hold <Estudiante9> delay: 0.1623483436409886
5.995949820516743 release <Estudiante9> <Estacin6>
. . .waitQ: []
. . .activeQ: []
5.995949820516743 <Estudiante9> terminated
6.196566116203693 release <Estudiante10> <Estacin4>
. . .waitQ: []
. . .activeQ: []
6.196566116203693 request <Estudiante10> <Estacin5> priority: default
. . .waitQ: []
. . .activeQ: [Estudiante10]
6.196566116203693 hold <Estudiante10> delay: 0.15312650336171893
6.3496926195654115 release <Estudiante10> <Estacin5>
. . .waitQ: []
. . .activeQ: []
6.3496926195654115 request <Estudiante10> <Estacin6> priority: default
. . .waitQ: []
. . .activeQ: [Estudiante10]
6.3496926195654115 hold <Estudiante10> delay: 0.1623483436409886
6.5120409632064 release <Estudiante10> <Estacin6>
. . .waitQ: []
. . .activeQ: []
6.5120409632064 <Estudiante10> terminated
27
REPORTE DE LA SIMULACIN
Reporte para la
Tiempo promedio
Tiempo promedio
Reporte para la
Tiempo promedio
Tiempo promedio
Reporte para la
Tiempo promedio
Tiempo promedio
Reporte para la
Tiempo promedio
Tiempo promedio
Reporte para la
Tiempo promedio
Tiempo promedio
Reporte para la
Tiempo promedio
Tiempo promedio
estacin 1
de servicio: 0.5868305577954078
de espera: 0.0
estacin 2
de servicio: 0.362669013978329
de espera: 0.0
estacin 3
de servicio: 0.6408692467866298
de espera: 0.0
estacin 4
de servicio: 0.7925182682443438
de espera: 0.11119423620425224
estacin 5
de servicio: 0.23514364271800034
de espera: 0.0
estacin 6
de servicio: 0.2493048562781942
de espera: 0.0
28