_images/simpy-logo-small.png

Simulação de eventos discretos em Python

Resumo

Simpy é um framework baseado em processos com simulação de eventos discretos utilizando as bibliotecas padrão do Python.

Os processos em Simpy são definidos através de funções generator e podem, por exemplo, ser utilizadas para definir componentes como compradores, veículos ou agentes. Simpy também disponibiliza diversos tipos de recursos compartilhados para utilização de recursos propensos a congestionamento ( como servidores, caixas e túneis)

As simulações podem ser realizadas de modo “mais rápido possível ”, em tempo real (de acordo com o desenrolar do tempo) ou manualmente passo a passo por cada evento.

Apesar de que na teoria seja possível, usando o Simpy, fazer simulações contínuas, não há recursos que possam ajudá-lo nisso. Por outro lado, seria um exagero usar o Simpy em simulações com limites e processos que não interagem uns com os outros ou que não compartilhasse recursos.

Um exemplo bem simples, simular dois relógios marcando a hora em diferentes intervalos de tempo seria feito da seguinte forma:

>>> 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
slow 0
fast 0.5
slow 1
fast 1.0
fast 1.5

A documentação contém um tutorial, diversos guias explicando os conceitos chave, uma boa gama de exemplos e a documentação da API.

SimPy é distribuído sob os termos da MIT License. Desenvolvedores de modelos de simulação são encorajados a compartilhar suas técnicas de modelagem com a comunidade de usuários do Simpy. Por favor envie uma mensagem para a Lista de emails do Simpy.

Nos links a seguir há uma breve explicação sobre os conceitos do Simpy e são disponibilizados alguns exemplos: assista ao vídeo ou baixe os slides.

SimPy também foi implementando em outras linguagens de programação. Veja em portabilidade para mais informações.