Ir para o conteúdo

SimPy

Origem: Wikipédia, a enciclopédia livre.
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

    [editar | editar código]

    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]

    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]

    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

    [editar | editar código]