Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥

Simulação Discreta Utilizando SimPy

Simulação Discreta Utilizando SimPy

Apresentação sobre o SimPy para o I Workshop de Modelagem Matemático-Estatística do PPGME/UFPA.

Filipe Saraiva

October 09, 2019
Tweet

More Decks by Filipe Saraiva

Other Decks in Programming

Transcript

  1. Conteúdo WHOAMI O que é Simulação SimPy Ferramentas Computacionais para

    Simulação Execução Básica Environments Events Resources Exemplo Complexo Conclusões Filipe Saraiva | UFPA | 2 / 67
  2. Conteúdo WHOAMI O que é Simulação SimPy Ferramentas Computacionais para

    Simulação Execução Básica Environments Events Resources Exemplo Complexo Conclusões Filipe Saraiva | UFPA | 3 / 67
  3. WHOAMI Filipe Saraiva • Dr. & Me. Engenharia Elétrica (USP),

    Bel. Ciência da Computação (UFPI) • FACOMP & PPGCC - ICEN/UFPA • Membro do LAAI • Pesquisador de Inteligência Computacional Aplicada • Disciplinas de Fundamentos da Computação e Matemática Computacional • Desenvolvedor de Software Livre Filipe Saraiva | UFPA | 4 / 67
  4. Conteúdo WHOAMI O que é Simulação SimPy Ferramentas Computacionais para

    Simulação Execução Básica Environments Events Resources Exemplo Complexo Conclusões Filipe Saraiva | UFPA | 5 / 67
  5. Simulação Algumas “definições de dicionário” possíveis: 1. Fingimento, disfarce, dissimulação;

    2. Teste, experiência, ensaio; 3. Imitação do funcionamento de um processo por meio do funcionamento de outro. Filipe Saraiva | UFPA | 7 / 67
  6. Simulação Um conceito mais preciso: Simulação é a experimentação de

    um sistema real através de modelos. A possibilidade de criar e simular fenômenos desejados permite conferir quão representativas seriam as mudanças, colaborando, dessa forma, com a tomada de decisões [BATEMAN et al, 2013]. Filipe Saraiva | UFPA | 8 / 67
  7. Simulação Vamos pensar sobre filas de supermercado: • Quanto maiores

    as filas, maior o tempo de espera dos clientes; • Quanto maior o tempo de espera dos clientes, menos atrativo fica o supermercado; • Quanto maior o número de caixas, mais rápido é o atendimento aos clientes; • Quanto maior o número de caixas, maior os custos de mantê-los; • Nem sempre a disponibilidade da quantidade máxima de caixas é necessária; Como avaliar a tomada de decisão sobre dimunir/manter/aumentar o número de caixas? Filipe Saraiva | UFPA | 10 / 67
  8. Simulação Porque simular: • A simulação pode adicionar criatividade à

    resolução de problemas; • A simulação pode prever resultados; • A simulação considera variâncias do sistema; • A simulação promove soluções totais; • A simulação pode ser financeiramente viável. Filipe Saraiva | UFPA | 11 / 67
  9. Simulação O que a simulação não é: • A simulação

    não prevê o futuro; • A simulação não é uma ferramenta estritamente de otimização; • A simulação não substitui o processo de tomada de decisão; • A simulação não é uma panaceia. Filipe Saraiva | UFPA | 12 / 67
  10. Simulação • Simulação Discreta - eventos ocorrem em determinados instantes

    de tempo, modificando o estado do sistema. Não há modificação do estado do sistema entre eventos consecutivos. • Simulação Contínua - a simulação acompanha a dinâmica do sistema ao longo do tempo, sem saltos discretos de um evento a outro. Normalmente simulações contínuas são descritas em forma de equações. Filipe Saraiva | UFPA | 13 / 67
  11. Conteúdo WHOAMI O que é Simulação SimPy Ferramentas Computacionais para

    Simulação Execução Básica Environments Events Resources Exemplo Complexo Conclusões Filipe Saraiva | UFPA | 14 / 67
  12. Conteúdo WHOAMI O que é Simulação SimPy Ferramentas Computacionais para

    Simulação Execução Básica Environments Events Resources Exemplo Complexo Conclusões Filipe Saraiva | UFPA | 15 / 67
  13. Ferramentas Computacionais para Simulação Alguns exemplos de conhecidas tecnologias específicas

    para Simulação Discreta: • Simula (linguagem de programação); • Arena (software); • ProModel (software); • Simul8 (software); • SimEvents (toolbox para Matlab); • Xcos (módulo para Scilab); • SimPy (framework para Python). Filipe Saraiva | UFPA | 16 / 67
  14. SimPy O SimPy é um framework em Python para simulação

    discreta. É de fácil uso e disponibilizado como software livre, sendo portanto amplamente adotado na academia e indústria. Website: https://simpy.readthedocs.io/ Filipe Saraiva | UFPA | 17 / 67
  15. SimPy Instalação - No Linux, abra o terminal e logado

    como root utilize o gerenciador de pacotes pip, conforme abaixo: # pip install simpy Após instalado, execute o interpretador Python e tente importar o SimPy para verificar se funcionou. $ python > > > import simpy > > > Filipe Saraiva | UFPA | 18 / 67
  16. Conteúdo WHOAMI O que é Simulação SimPy Ferramentas Computacionais para

    Simulação Execução Básica Environments Events Resources Exemplo Complexo Conclusões Filipe Saraiva | UFPA | 19 / 67
  17. Execução Básica O SimPy é composto por uma série de

    componentes que nos permite modelar e simular sistemas de maneira discreta. Fundamentalmente, o SimPy é um escalonador de processos que agenda eventos das entidades a serem executados em uma linha de tempo comum. Filipe Saraiva | UFPA | 20 / 67
  18. Execução Básica Em termos de implementação, temos um Environment (um

    componente do SimPy) que registra os Events, que são as funções que devem ser executadas. Assim, o Environment registra os eventos e cuida de acompanhar o tempo de simulação, executando-o e suspendendo-os no momento correto. Filipe Saraiva | UFPA | 21 / 67
  19. Exemplo Básico Vamos exemplificar a partir do código abaixo. Nele

    temos uma classe Python Pessoa que recebe como argumento no método construtor a variável env. env é um Environment do SimPy. Ela registrará o método run da classe na instrução self.env.process(self.run()). class Pessoa : def __init__ ( self , env ) : s e l f . env = env s e l f . env . process ( s e l f . run ( ) ) Filipe Saraiva | UFPA | 22 / 67
  20. Exemplo Básico O método run() é o método que codifica

    a atividade que a classe Pessoa irá executar para a simulação. Nele, a pessoa passará 2 tempos da simulação estudando e em seguida 5 tempos nas redes sociais. Após isso, ela voltará aos estudos e continuará nesse ciclo, indefinidamente. O método run é implementado da seguinte maneira: Filipe Saraiva | UFPA | 23 / 67
  21. Exemplo Básico def run ( s e l f )

    : while True : print ( ’Comecou a estudar em ’ , s e l f . env . now) tempo_estudo = 2 y i e l d s e l f . env . timeout ( tempo_estudo ) print ( ’ Foi para as redes sociais em ’ , s e l f . env . now) tempo_redes_sociais = 5 y i e l d s e l f . env . timeout ( tempo_redes_sociais ) Filipe Saraiva | UFPA | 24 / 67
  22. Exemplo Básico Alguns destaques do código anterior: • A instrução

    while True: destaca que aquele bloco é um loop infinito; • Perceba o uso do yield, para suspender a execução de processos; • O yield lança um self.env.timeout($variavel). O método timeout de uma env significa que o relógio global de simulação mudará para o tempo em que aquela atividade terá sido finalizada. Filipe Saraiva | UFPA | 25 / 67
  23. Exemplo Básico Para rodar a simulação, basta agora inicializar o

    interpretador Python, carregar o SimPy, o arquivo da classe, instanciar objetos e executar. $ python >>> import simpy >>> exec(open(’pessoa.py’).read()) >>> env = simpy.Environment() >>> p = Pessoa(env) >>> env.run(until=20) Começou a estudar em 0 Foi para as redes sociais em 2 Começou a estudar em 7 Foi para as redes sociais em 9 Começou a estudar em 14 Foi para as redes sociais em 16 Filipe Saraiva | UFPA | 26 / 67
  24. Exemplo Básico Alguns destaques do código anterior: • import simpy

    importa o módulo SimPy para o interpretador; • exec(open(’pessoa.py’).read()) é o comando usado para carregar o arquivo com a classe “Pessoa” no interpretador Python; • env = simpy.Environment() instancia a classe Environment; • p = Pessoa(env) instancia um objeto Pessoa passando env como argumento; • env.run(until=20) executa a simulação. O argumento until fixa o tempo em que a simulação irá terminar. • Em itálico temos a saída da simulação. Filipe Saraiva | UFPA | 27 / 67
  25. Conteúdo WHOAMI O que é Simulação SimPy Ferramentas Computacionais para

    Simulação Execução Básica Environments Events Resources Exemplo Complexo Conclusões Filipe Saraiva | UFPA | 28 / 67
  26. Environments Environments Environments (“Ambientes”) é o ambiente onde a simulação

    ocorre, sendo o responsável por cadastrar os processos e eventos que serão executados durante a simulação, sequenciá-los, e registrar o tempo global de simulação. Filipe Saraiva | UFPA | 29 / 67
  27. Environments No SimPy instanciamos um Environment a partir da instrução

    simpy.Environment(), passando-a para alguma variável. No SimPy também há uma classe voltada para simulações em tempo-real chamada RealtimeEnvironment. Filipe Saraiva | UFPA | 30 / 67
  28. Environments Após declarado, é necessário registrar os processos e eventos

    que serão simulados no Environment. Para isso, utiliza-se o método process, passando como argumento o método que será registrado. Por exemplo: class Pessoa : def __init__ ( self , env ) : . . . s e l f . env . process ( s e l f . run ( ) ) Temos o registro do método run no Environment que foi passado como argumento para a classe. Filipe Saraiva | UFPA | 31 / 67
  29. Environments Após registrar os processos e eventos, é chegada a

    hora de realizar a simulação. Fazendo env ser nossa instância do Environment, há 2 possibilidades de rodar a simulação: • env.run() executará a simulação até que não haja mais processos e eventos a serem simulados. É possível passar o parâmetro until=$valor para ser usado como o limite máximo do tempo de simulação a ser executado. • env.step() executa a próxima atividade da simulação. É necessário chamar novamente o step() para realizar a atividade seguinte. Filipe Saraiva | UFPA | 32 / 67
  30. Environments O Environment irá gerenciar o relógio global de simulação,

    que pode ser acessado através do atributo now em env.now. Vale recordar que o “tempo de simulação” não tem uma unidade de tempo determinada, sendo mais como um meio de verificar momentos discretos quando uma atividade inicia ou finaliza. Também cabe destacar que, apesar de estarmos utilizando programação orientada a objetos, não há impedimentos de que uma função convencional, da programação imperativa, possa ser cadastrada como um processo ou evento no SimPy. Filipe Saraiva | UFPA | 33 / 67
  31. Conteúdo WHOAMI O que é Simulação SimPy Ferramentas Computacionais para

    Simulação Execução Básica Environments Events Resources Exemplo Complexo Conclusões Filipe Saraiva | UFPA | 34 / 67
  32. Events Events Events são atividades (ou eventos) que ocorrem durante

    as simulações. No SimPy os processos também são tratados como eventos. Filipe Saraiva | UFPA | 35 / 67
  33. Events A forma mais básica de eventos no SimPy ocorre

    quando realizamos um yield em um processo enviando um timeout. Dessa forma, estamos determinando que um evento foi executado. Para o exemplo do método “run” da classe “Pessoa”, o yield utilizado representa esse tipo de uso de eventos. . . . def run ( s e l f ) : while True : print ( ’Comecou a estudar em ’ , s e l f . env . now) tempo_estudo = 2 y i e l d s e l f . env . timeout ( tempo_estudo ) Filipe Saraiva | UFPA | 36 / 67
  34. Events Entretanto, também é possível criar instâncias de env.event() que

    servirão para modificar o fluxo de eventos do SimPy. Para utilizar esse recurso, basta instanciar um atributo com env.event() e passá-lo com um yield. Isso suspenderá a execução de uma dada função até que o evento mude de estado para succeed. Nesse momento, o fluxo de execução retornará para o yield que lançou o evento. Filipe Saraiva | UFPA | 37 / 67
  35. Events Supomos o exemplo de uma oficina, onde um carro

    entra na mesma e fica no aguardo da chegada do mecânico. class Oficina : def __init__ ( self , env ) : s e l f . env = env s e l f . mecanico_disponivel = s e l f . env . event ( ) s e l f . env . process ( s e l f . chegou_carro ( ) ) s e l f . env . process ( s e l f . chegou_mecanico ( ) ) Filipe Saraiva | UFPA | 38 / 67
  36. Events A linha self.mecanico_disponivel = self.env.event() criou um evento no

    atributo mecanico_disponivel – a ideia é que quando o mecânico estiver disponível, será disparado um evento que poderá ser utilizado em nosso código. Passamos para as funções, que já foram registradas no construtor da classe. def chegou_carro ( s e l f ) : y i e l d s e l f . mecanico_disponivel print ( ’ Desmonte do carro em ’ , s e l f . env . now) def chegou_mecanico ( s e l f ) : y i e l d s e l f . env . timeout (13) s e l f . mecanico_disponivel . succeed ( ) Filipe Saraiva | UFPA | 39 / 67
  37. Events A função chegou_carro() é a primeira a ser executada

    pois ela foi escalonada primeiro no construtor. Percebemos que nela há um yield self.mecanico_disponivel, que posterga a continuação da execução da função para após o evento self.mecanico_disponivel ser lançado. A próxima função a ser executada é a chegou_mecanico, que contabiliza um tempo de execução no yield e em seguida lança o evento com a função succeed do evento instanciado, utilizada na instrução self.mecanico_disponivel.succeed(). Filipe Saraiva | UFPA | 40 / 67
  38. Events Com o lançamento do evento em self.mecanico_disponivel.succeed(), o fluxo

    de execução retorna ao yield da função chegou_carro(), permitindo então a execução do resto daquela função. Como exemplo, remova a instrução que torna sucesso o evento self.mecanico_disponivel. O que ocorre com o código e porque isso acontece? Filipe Saraiva | UFPA | 41 / 67
  39. Events Eventos também podem falhar, utilizando a função fail(exception), que

    recebe um Exception do Python como argumento que será lançado assim que a função for chamada. Outro detalhe importante é que os próprios processos são Eventos: é possível fazer um yield env.process(funcao) que o yield permitirá a execução da parte posterior da função apenas após o processo ter sido finalizado com sucesso. Filipe Saraiva | UFPA | 42 / 67
  40. Events Outro detalhe importante é que é possível utilizar os

    operadores lógicos no yield de eventos. Dessa forma, tem-se: • Para que uma ação seja executada apenas após algum evento a dispare, basta utilizar o operador lógico ou (“|”). Ex.: yield envent1 | event2; • Para que uma ação seja executada apenas após que todos os eventos sejam executados, basta utilizar o operador lógico and (“&”). Ex.: yield envent1 & event2; • Operações lógicas mais complexas são possíveis a partir do uso dos operadores lógicos citados. Filipe Saraiva | UFPA | 43 / 67
  41. Events Vamos exemplificar com um código que simula uma pessoa

    no vídeo game esperando uma ligação para sair. No exemplo, ela sairá assim que terminar de jogar ou receber uma ligação. O início do código: class Sair : def __init__ ( self , env , t_video_game , t_ligacao ) : s e l f . env = env s e l f . ev_video_game = s e l f . env . event ( ) s e l f . ev_ligacao = s e l f . env . event ( ) s e l f . env . process ( s e l f . decide_sair ( ) ) s e l f . env . process ( s e l f . video_game ( t_video_game ) ) s e l f . env . process ( s e l f . ligacao ( t_ligacao ) ) Filipe Saraiva | UFPA | 44 / 67
  42. Events No construtor, temos a criação de 2 eventos, ev_video_game

    e ev_ligacao, que simbolizam o momento em que a pessoa pára de jogar vídeo game ou recebe uma ligação, respectivamente. Em seguida, são cadastrados os processos decide_sair(), video_game e ligacao, que representam a decisão de sair, a função que processa a atividade de jogar vídeo game, e a que processa o recebimento de uma ligação. Filipe Saraiva | UFPA | 45 / 67
  43. Events Os métodos da classe são então dados por: def

    decide_sair ( s e l f ) : y i e l d s e l f . ev_video_game | s e l f . ev_ligacao print ( ’ Saio em ’ , s e l f . env . now) def video_game ( self , t_video_game ) : y i e l d s e l f . env . timeout ( t_video_game ) s e l f . ev_video_game . succeed ( ) def ligacao ( self , t_ligacao ) : y i e l d s e l f . env . timeout ( t_ligacao ) s e l f . ev_ligacao . succeed ( ) Filipe Saraiva | UFPA | 46 / 67
  44. Events No escalonamento dos processos do SimPy, o primeiro método

    a ser executado é o decide_sair(), que na primeira instrução já lança um yield para os 2 eventos da classe. Como eles tem uma operação lógica “ou”, o método aguardará que um dos eventos seja lançado para continuar a execução. Os outros 2 métodos apenas lançam os respectivos tempos para suas atividades, e em seguida, lançam os respectivos eventos. Esse lançamento retornará o fluxo de execução do programa para o método decide_sair(). Como exercício, transforme a execução para que a decisão de sair aconteça apenas após todas as atividades terem sido realizadas. Filipe Saraiva | UFPA | 47 / 67
  45. Conteúdo WHOAMI O que é Simulação SimPy Ferramentas Computacionais para

    Simulação Execução Básica Environments Events Resources Exemplo Complexo Conclusões Filipe Saraiva | UFPA | 48 / 67
  46. Resources Resources Recursos são maneiras de modelar interação entre processos

    a partir da formação de um ponto de congestão no sistema. Dessa forma, processos que necessitam de um recurso devem formar uma fila e aguardar que o recurso esteja liberado para poder usá-lo. Filipe Saraiva | UFPA | 49 / 67
  47. Resources SimPy tem 3 tipos de recursos, que modelam diferentes

    maneiras de utilização: • Resources – recursos que podem ser utilizados por um número limitado de processos por vez (exemplo: bombas em um posto de combustível); • Containers – recursos que modelam a produção ou consumo de algo homogêneo e não diferenciável (exemplo: combustível, minério); • Store – recurso que permite a produção e consumo de objetos Python. Filipe Saraiva | UFPA | 50 / 67
  48. Resources Apesar desses tipos diferentes de recursos, todos eles tem

    uma mesma concepção básica. Um recurso é um tipo de estrutura com uma capacidade máxima. Processos podem tentar colocar algo na estrutura ou retirar algo dela. Caso a estrutura esteja cheia ou vazia, os processos precisarão fazer uma fila e esperar que vague algum espaço para iniciar uma operação. Filipe Saraiva | UFPA | 51 / 67
  49. Resources O processo que for utilizar um Resource precisará solicitá-lo

    e, após processar a atividade, disponibilizá-lo para o próximo processo em espera (exemplo: bomba em um posto de combustível). Para tanto são utilizados 2 métodos de uma instância de Resources: • request() para solicitar o recurso; • release() para liberar o recurso (normalmente feito de maneira automática ao fim da atividade). Filipe Saraiva | UFPA | 52 / 67
  50. Resources Para o primeiro tipo de Resource há 3 subtipos

    disponíveis no SimPy: • Resource – padrão, convencional; • PriorityResource – que atribui prioridades aos processos da fila e utiliza essa característica para ordená-los; • PreemptiveResource – adiciona preempção às prioridades, permitindo que processos com prioridades maiores finalizem a execução de um processo com prioridade menor que esteja na sua frente. Filipe Saraiva | UFPA | 53 / 67
  51. Resources Para criar um Resource é necessário instânciar uma classe

    simpy.Resource(env, capacity=), que recebe um ambiente e tem uma capacidade como parâmetro no construtor. Demais classes Resource são instanciadas de maneira similar, inclusive com a mesma quantidade de parâmetros. Para requisitar acesso a um recurso, utilizaremos gerenciadores de contexto do Python a partir do seguinte padrão: with recursos . request ( ) as recurso : y i e l d recurso . . . Filipe Saraiva | UFPA | 54 / 67
  52. Resources Nessa instrução, estamos solicitando o recurso e criando uma

    variável para ele com o nome “recurso”. A instrução a seguir lança um yield com a variável criada. Essa instrução aguardará que o recurso esteja disponível para então seguir com o método. with recursos . request ( ) as recurso : y i e l d recurso . . . Filipe Saraiva | UFPA | 55 / 67
  53. Resources No exemplo “posto.py”, temos um posto que recebe carros

    para abastecimento. O método da classe Posto que faz o abastecimento é a seguinte: def abastecer ( self , carro ) : y i e l d s e l f . env . timeout ( carro . tempo_chegada ) print ( carro .nome, ’ chegou em ’ , s e l f . env . now) with s e l f . bombas . request ( ) as bomba : y i e l d bomba print ( carro .nome, ’ i n i c i o u abastecimento em ’ , s e l f . env . now) y i e l d s e l f . env . timeout ( carro . tempo_abastecimento ) print ( carro .nome, ’ saiu do abastecimento em ’ , s e l f . env . now) Filipe Saraiva | UFPA | 56 / 67
  54. Resources Nesse método, “abastecer”, recebe como argumento um carro. A

    primeira instrução yield atrasa o processamento do abastecimento para o tempo de chegada do carro. Em seguida, no with ..., vemos a chamada da função “request”, que solicita o recursos “bombas”. A instrução seguinte, um yield, suspende essa execução até que alguma bomba esteja disponível. Estando disponível, temos um terceiro yield que processa o tempo de abastecimento do carro. Filipe Saraiva | UFPA | 57 / 67
  55. Resources Containers são recursos que gerenciam uma quantidade de algo

    que pode ser adicionado ou retirado. Imagine um tanque de combustível que é reduzido ao longo do tempo por conta dos abastecimentos – esse é um tipo de contêiner no SimPy. No instanciamento de um Container, utiliza-se no construtor uma referência para um Environment, um “capacity” para dizer a quantidade de algo no contêiner, e um “init” que indica qual quantidade inicia no contêiner. Filipe Saraiva | UFPA | 58 / 67
  56. Resources Como exemplo, vamos revisitar o código “Posto” e agora

    adicionar um tanque de combustível. Nosso tanque terá capacidade de 100 litros e iniciará a simulação cheio: No próximo slide temos a adição de uma lógica que chamará um caminhão tanque quando tiver menos de 50 litros no tanque: bombas = simpy . Resource ( env , capacity =1) tanque = simpy . Container ( env , i n i t =100, capacity =100) p = Posto ( env , bombas , tanque ) Filipe Saraiva | UFPA | 59 / 67
  57. Resources Código: def abastecer ( self , carro ) :

    y i e l d s e l f . env . timeout ( carro . tempo_chegada ) print ( carro .nome, ’ chegou em ’ , s e l f . env . now) with s e l f . bombas . request ( ) as bomba : y i e l d bomba print ( carro .nome, ’ i n i c i o u abastecimento em ’ , s e l f . env . now) y i e l d s e l f . tanque . get ( carro . combustivel ) print ( ’ Tanque com %d l i t r o s ’ % ( s e l f . tanque . l e v e l ) ) y i e l d s e l f . env . timeout ( carro . tempo_abastecimento ) print ( carro .nome, ’ saiu do abastecimento em ’ , s e l f . env . now) i f s e l f . tanque . l e v e l < 50: print ( ’Chama caminhao de combustivel em ’ , s e l f . env . now) s e l f . env . process ( s e l f . reabastece ( ) ) y i e l d s e l f . env . timeout (5) Filipe Saraiva | UFPA | 60 / 67
  58. Resources Importante notar no slide anterior que para reduzirmos a

    quantidade de recursos no contêiner utilizamos a função “get()”, usando como argumento um inteiro para representar a quantidade que iremos reduzir. No método reabastece, temos a função “put()”, que coloca o valor inteiro que utilizarmos como argumento no contêiner. def reabastece ( s e l f ) : y i e l d s e l f . env . timeout (5) print ( ’ Caminhao tanque chegou em ’ , s e l f . env . now) y i e l d s e l f . tanque . put ( s e l f . tanque . capacity − s e l f . tanque . l e v e l ) print ( ’ Reabastecido − tanque com %d l i t r o s ’ % ( s e l f . tanque . l e v e l ) ) Filipe Saraiva | UFPA | 61 / 67
  59. Resources Além das funções “get()” e “put()”, o contêiner tem

    as funções “capacity()”, que informa a capacidade do mesmo, e a função “level()”, que informa a quantidade atual de elementos no contêiner. Filipe Saraiva | UFPA | 62 / 67
  60. Conteúdo WHOAMI O que é Simulação SimPy Ferramentas Computacionais para

    Simulação Execução Básica Environments Events Resources Exemplo Complexo Conclusões Filipe Saraiva | UFPA | 63 / 67
  61. Exemplo Complexo Nessa parte, veremos um exemplo um pouco mais

    complexo que os vistos até agora: o gerenciamento de uso de pistas de pouso e locais de embarque/desembarque em um aeroporto. Filipe Saraiva | UFPA | 64 / 67
  62. Conteúdo WHOAMI O que é Simulação SimPy Ferramentas Computacionais para

    Simulação Execução Básica Environments Events Resources Exemplo Complexo Conclusões Filipe Saraiva | UFPA | 65 / 67
  63. Conclusões • SimPy é um framework muito completo e robusto

    para simulações discretas em Python; • Nessa apresentação vimos os principais componentes de simulações do SimPy: Environment, Events e Resources; • É importante verificar se a modelagem responde às necessidades do problema e o quanto ela está adequada para os estudos; • O SimPy fica mais interessante quando trabalhado com outras bibliotecas do Python, como as científicas SciPy, NumPy e matplotlib. Filipe Saraiva | UFPA | 66 / 67