SimPy

SimPy
Surgido em2002
Última versão3.0.9 (12 de junho de 2016; há 9 anos)
Criado porKlaus G. Müller, Tony Vignaux
LicençaMIT
Página oficialsimpy.readthedocs.org

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

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

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

Referências

  1. 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.

Ligações externas

Content Disclaimer

Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.

  1. The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
  2. There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
  3. It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
  4. Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
  5. Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.