Solução dos desafios 2 e 3
Desafio 2: é comum que os comandos de criação de entidades nos softwares proprietários tenham a opção de limitar o número máximo de entidades geradas durante a simulação. Modifique a função
geraChegadas
de modo que ela receba como parâmetro onumeroMaxChegadas
e limite a criação de entidades a este número.
Neste caso, o script em Python é autoexplicativo, apenas note que limitei o número de chegadas em 5 e fiz isso antes da chamada do processo gerado pela função geraChegadas()
:
Desafio 3: modifique a função
geraChegadas
de modo que as chegadas entre entidades sejam distribuídas segundo uma distribuição triangular de moda 1, menor valor 0,1 e maior valor 1,1.
Neste caso, precisamos verificar na documentação da biblioteca random
, quais são nossas opções. A tabela a seguir, resume as distribuições disponíveis:
Função | Distribuição |
| gera números aleatórios no intervalo [0.0, 1.0) |
| uniforme no intervalo [a, b] |
| triangular com menor valor low, maior valor high e moda mode |
| beta com parâmetros alpha e beta |
| exponencial com média 1/lambd |
| gamma com parâmetros alpha e beta |
| normal com média mu e desvio padrão sigma |
| lognormal com média mu e desvio padrão sigma |
| equivalente à random.gauss, mas um pouco mais lenta |
| distribuição de von Mises com parâmetros mu e kappa |
| pareto com parâmetro alpha |
| weibull com parâmetros alpha e beta |
A biblioteca NumPy, que veremos oportunamente, possui mais opções para distribuições estatísticas. Por enquanto, o desafio 3 pode ser solucionado de maneira literal:
Dica
Os modelos de simulação com muitos processos de chegadas e atendimento, tendem a utilizar diversas funções diferentes de distribuição de probabilidades, deixando as coisas meio confusas para o programador.
Uma dica bacana é criar uma função que armazene todas as distribuições do modelo em um único lugar, como uma prateleira de distribuições.
Por exemplo, imagine um modelo em SimPy que possui 3 processos: um exponencial com média 10 min, um triangular com parâmetros (10, 20, 30) min e um normal com média 0 e desvio 1 minuto. A função distribution()
a seguir, armazena todos os geradores de números aleatórios em um único local:
O próximo exemplo testa como chamar a função:
O qual produz a saída:
Essa foi a nossa dica do dia!
Fique a vontade para implementar funções de geração de números aleatórios ao seu gosto. Note, e isso é importante, que praticamente todos os seus modelos de simulação em SimPy precisarão deste tipo de função!
Uma última observação:
Atenção à eficiência do código. Como a finalidade deste texto é prioritariamente didática, as chamadas às funções de geração de números aleatórios respeitam a lógica do aprendizado. Contudo, tais chamadas não são exatamente eficientes... Por exemplo, você consegue descobrir qual das duas chamadas a seguir é a mais eficiente e por quê?
Ou:
Resposta: note que, no primeiro caso, a cada novo número gerado é realizada uma operação de divisão. No segundo caso, isso não ocorre, deixando o tempo de processamento bem mais rápido.
Teste seus conhecimentos:
Acrescente ao programa inicial, uma função
distribution
como a proposta na Dica do Dia e faça o tempo entre chegadas sucessivas de entidades chamar a função para obter o valor correto.Considere que 50% das entidades geradas durante a simulação são do sexo feminino e 50% do sexo masculino. Modifique o programa para que ele sorteie o gênero dos clientes. Faça esse sorteio dentro da função
distribution
já criada.
Last updated