SimPy
SimPy | |
---|---|
Surgido em | 2002 |
Última versão | 3.0.9 (12 de junho de 2016 | )
Criado por | Klaus G. Müller, Tony Vignaux |
Licença | MIT |
Página oficial | simpy |
SimPy ("Simulation in Python") é um ambiente para a simulação de eventos discretos baseado no Python. Seu despachador de eventos é baseado em funções geradoras e também pode ser usado para redes assíncronas ou para implementar sistemas de multiagentes (tanto com comunicação simulada, quando real).
Processos em SimPy são meras funções geradoras em Python e são utilizadas para modelar entidades, tais como: clientes, veículos ou agentes. SimPy também fornece vários tipos de recursos compartilhados para modelar sistemas com capacidade limitada (como servidores, guichês de atendimento, estações de trabalho etc.). A partir da versão 3.1, serão disponibilizados recursos de monitoramento, que permitirão extrair diversas estatísticas sobre recursos e processos existentes em um modelo.
As simulações podem ser realizadas "o mais rápido quanto possível", avançando o tempo de simulação ou manualmente, eventos a evento.
Embora seja teoricamente possível fazer simulações de processos contínuos com o SimPy, ele não nenhum recursos específico para realizar isso. No entanto, SimPy é excelente
para as simulações com um tamanho fixo de passo, onde os processos não interagem um com
os outros ou com recursos partilhados — um simples loop while
é suficiente neste caso.
A distribuição do SimPy contém tutoriais, documentação detalhada e um grande número de exemplos.
SimPy é um software open source sob a Licença MIT. A sua primeira versão foi lançada em Dezembro de 2002.
Exemplo: relógio
[editar | editar código-fonte]Um dos objetivos principais do SimPy é sua facilidade de uso. A seguir apresenta-se um exemplo de simulação em SimPy: um relógio imprime na tela o tempo corrente de simulação a cada passo:
>>> import simpy
>>>
>>> def clock(env, name, tick):
... while True:
... print(name, env.now)
... yield env.timeout(tick)
...
>>> env = simpy.Environment()
>>> env.process(clock(env, 'fast', 0.5))
<Process(clock) object at 0x...>
>>> env.process(clock(env, 'slow', 1))
<Process(clock) object at 0x...>
>>> env.run(until=2)
fast 0
Exemplo: fila M/M/1
[editar | editar código-fonte]Uma possível modelagem para um sistema de fila M/M/1 é dada no código a seguir[1]:
"""
Fila M/M/1
"""
import random
import simpy
qtdClientes = 10
taxaChegada = 1.0 / 6.0 #Inverso do intervalo médio entre chegadas em minutos
taxaAtendimento = 1.0 / 5.0 #Inverso do tempo de médio de atendimento em minutos
def chegadas(env):
""" Gera as chegadas dos clientes no sistema """
for i in range(qtdClientes):
yield env.timeout(random.expovariate(taxaChegada))
name = 'Cliente %d' % (i+1)
env.process(atendimento(env, name))
def atendimento(env, name):
""" Simula atendimento dos clientes no servidor 1 """
print('%7.2f\t Chegada\t %s' % (env.now, name))
atendReq = Servidor1.request()
yield atendReq
print('%7.2f\t Atendimento\t %s' % (env.now, name))
yield env.timeout(random.expovariate(taxaAtendimento))
Servidor1.release(atendReq)
print('%7.2f\t Partida\t %s' % (env.now, name))
""" Bloco principal """
print('\nM/M/1\n')
print('Tempo\t', 'Evento\t\t', 'Cliente\n')
random.seed(10)
env = simpy.Environment()
Servidor1 = simpy.Resource(env, capacity=1)
env.process(chegadas(env))
env.run()
Note-se, no exemplo anterior, a função geradora "chegada" que cria clientes no sistema com intervalos de tempo exponencialmente distribuídos entre si. A função ainda faz uma chamada à outra função geradora, "atendimento", responsável por atender o cliente e manter aqueles clientes que encontram o servidor ocupado em fila.
Ver também
[editar | editar código-fonte]Referências
- ↑ CHWIF, Leonardo; MEDINA, Afonso C. Modelagem e Simulação de Eventos Discretos: Teoria e Aplicações. 4ª edição. São Paulo: Elsevier Brasil, 2014. 320 p. ISBN 978-8535279320.