Desafio 26: acrescente à função final um comando para armazenar quem venceu e em que tempo. Simule para 10 replicações e calcule a média e a porcentagem de vitórias de cada corredor.
Neste caso, podemos criar uma lista resultadoList para armazenar a tuple (tempo, vencedor) de cada replicação. Os valores podem ser armazenados no instante em que a função campeão identifica o vencedor, isto é:
defcampeao(event):global vencedorifnot vencedor:# imprime a faixa de campeãoprint('%3.1f \o/ Tan tan tan (musica do Senna) A %s é a campeã!'%(env.now, event.value))# atualiza a variável global vencedor vencedor =True# armazena o resultado na lista resultadoList resultadoList.append((env.now, event.value))else:# imprime o perdedorprint('%3.1f A %s chega em segundo lugar...'%(env.now, event.value))
Como o desafio pede que sejam executadas 10 replicações da corrida, devemos modificar a chamada do modelo para refletir isso. Inicialmente, criamos a lista resultadoList e, a seguir, criamos um laço para executar o modelo 10 replicações:
# lista para armazenar os resultados das corridas/replicaçõesresultadoList = []random.seed(10)# processa 10 replicaçõesfor i inrange(10):# True, se já temos um vencedor na corrida, False caso contrário vencedor =False env = simpy.Environment() proc = env.process(corrida(env)) proc.callbacks.append(final)# executa até que o processo corrida termine env.run(proc)
Note que a variável global vencedor é atualizada dentro do laço (na seção seguinte, ela era criada logo no cabeçalho do modelo), afinal, a cada replicação precisamos garantir que as variáveis do modelo sejam reinicializadas.
Uma vez que as 10 replicações tenham sido executadas, basta calcular as estatísticas desejadas. O número de vitórias é facilmente extraída da lista de vencedores:
# separa a lista de resultados em duas listastempos, vencedores =zip(*resultadoList)# conta o número de vitóriaslebreWin = vencedores.count('lebre')tartarugaWin = vencedores.count('tartaruga')# calcula a percentagem de vitórias da lebrelebreP = lebreWin/(lebreWin+tartarugaWin)
Para o cálculo da média do tempo de corrida, temos diversas possibilidades. A escolhida aqui foi utilizar a função mean da biblioteca numpy:
# importa a função para cálculo da média a partir biblioteca numpyfrom numpy import meanprint('Tempo médio de corrida: %3.1f\tLebre venceu: %3.1f%%\tTartaruga venceu: %3.1f%%'% (mean(tempos), lebreP*100, (1-lebreP)*100))
Quando executado, o modelo fornece como resposta:
0.0 Iniciada a corrida!5.3\o/ Tan tan tan (música do Senna) A tartaruga é a campeã!5.3 Ok pessoal, a corrida acabou.0.0 Iniciada a corrida!5.1\o/ Tan tan tan (música do Senna) A tartaruga é a campeã!5.1 Ok pessoal, a corrida acabou.0.0 Iniciada a corrida!4.4\o/ Tan tan tan (música do Senna) A tartaruga é a campeã!4.4 Ok pessoal, a corrida acabou.0.0 Iniciada a corrida!6.1\o/ Tan tan tan (música do Senna) A lebre é a campeã!6.1 Ok pessoal, a corrida acabou.0.0 Iniciada a corrida!5.4\o/ Tan tan tan (música do Senna) A lebre é a campeã!5.4 Ok pessoal, a corrida acabou.0.0 Iniciada a corrida!0.5\o/ Tan tan tan (música do Senna) A lebre é a campeã!0.5 Ok pessoal, a corrida acabou.0.0 Iniciada a corrida!4.8\o/ Tan tan tan (música do Senna) A lebre é a campeã!4.8 Ok pessoal, a corrida acabou.0.0 Iniciada a corrida!3.5\o/ Tan tan tan (música do Senna) A lebre é a campeã!3.5 Ok pessoal, a corrida acabou.0.0 Iniciada a corrida!4.9\o/ Tan tan tan (música do Senna) A lebre é a campeã!4.9 Ok pessoal, a corrida acabou.0.0 Iniciada a corrida!5.4\o/ Tan tan tan (música do Senna) A tartaruga é a campeã!5.4 Ok pessoal, a corrida acabou.Tempo médio de corrida:4.5 Lebre venceu:60.0% Tartaruga venceu:40.0%
Teste seu conhecimento
Acrescente o cálculo do intervalo de confiança ao resultados do tempo médio de corrida e simule um número de replicações suficientes para garantir que este intervalo seja no máximo de 5% em torno da média, para um nível de significância de 95%.
Reformule o modelo para que ele aceite uma lista de corredores diferentes, não só uma lebre e uma tartaruga.