Desafio 13 Considere que existam dois tipos de paradas: uma do R2D2 e outra do canhão de combate. A parada do canhão de combate ocorre sempre depois de 25 horas de viagem (em quebra ou não) e seu reparo dura 2 horas. Contudo, para não perder tempo, a manutenção do canhão só é realizada quando o R2D2 quebra.
Inicialmente, precisamos de uma variável global para verificar a situação do canhão:
import simpycanhao =True# variável global que avisa se o canhão está funcionandoviajando =False# variável global que avisa se o x-wing está operandoduracaoViagem =30# variável global que marca a duração atual da viagem
A função viagem, agora deve lidar com um tempo de parada do canhão. Contudo, não existe uma interrupção para o canhão, pois nosso indomável piloto jedi apenas verifica a situação do canhão ao término do concerto do R2D2:
defviagem(env,tempoParada,tempoParadaCanhao):# processo de viagem do x-wingglobal viajando, duracaoViagem, canhao partida = env.now # início da viagemwhile duracaoViagem >0:# enquanto ainda durar a viagem, execute:try: viajando =True# (re)inicio da viagem inicioViagem = env.now print("%5.1f Viagem iniciada"%(env.now))# tempo de viagem restanteyield env.timeout(duracaoViagem) duracaoViagem -= env.now - inicioViagemexcept simpy.Interrupt:# se o processo de viagem foi interrompido execute# atualiza o tempo restante de viagem duracaoViagem -= env.now - inicioViagem print("%5.1f Falha do R2D2\tTempo de viagem restante: %4.1f horas"%(env.now, duracaoViagem))# tempo de manutenção do R2D2yield env.timeout(tempoParada)print("%5.1f R2D2 operante"%env.now)# se o canhão não estiver funcionandoifnot canhao:print("%5.1f R2, ligue o canhão!"% env.now)# tempo de manutenção do canhãoyield env.timeout(tempoParadaCanhao) canhao =Trueprint("%5.1f Pi..bi...bi\tTradução: canhão operante!"% env.now)# ao final avisa o término da viagem e sua duraçãoprint("%5.1f Viagem concluida\tDuração total da viagem: %4.1f horas"%(env.now, env.now-partida))
Além da função de parada técnica (já pertencente ao nosso modelo desde a seção anterior), precisamos de uma função que tire de operação o canhão, ou seja, apenas desligue a variável global canhao:
defquebraCanhao(env,intervaloCanhao):# processo de quebra do canhao entre intervalos definidosglobal canhao, duracaoViagemwhile duracaoViagem >0:# este processo só ocorre durante a viagemyield env.timeout(intervaloCanhao)# aguarda a próxima quebra do canhaoif canhao: canhao =Falseprint("%5.1f Pi uiui...bi\tTradução: canhão inoperante!"% (env.now))
Por fim, o processo de quebra do canhão deve ser inciado juntamente com o resto do modelo de simulação:
Quando o modelo completo é executado, ele fornece como saída:
0.0 Viagem iniciada10.0 Falha do R2D2 Tempo de viagem restante:20.0 horas25.0 Pi uiui...bi Tradução: canhão inoperante!25.0 R2D2 operante25.0 R2, ligue o canhão!27.0 Pi..bi...bi Tradução: canhão operante!27.0 Viagem iniciada30.0 Falha do R2D2 Tempo de viagem restante:17.0 horas45.0 R2D2 operante45.0 Viagem iniciada50.0 Pi uiui...bi Tradução: canhão inoperante!50.0 Falha do R2D2 Tempo de viagem restante:12.0 horas65.0 R2D2 operante65.0 R2, ligue o canhão!67.0 Pi..bi...bi Tradução: canhão operante!67.0 Viagem iniciada70.0 Falha do R2D2 Tempo de viagem restante:9.0 horas75.0 Pi uiui...bi Tradução: canhão inoperante!85.0 R2D2 operante85.0 R2, ligue o canhão!87.0 Pi..bi...bi Tradução: canhão operante!87.0 Viagem iniciada90.0 Falha do R2D2 Tempo de viagem restante:6.0 horas100.0 Pi uiui...bi Tradução: canhão inoperante!105.0 R2D2 operante105.0 R2, ligue o canhão!107.0 Pi..bi...bi Tradução: canhão operante!107.0 Viagem iniciada110.0 Falha do R2D2 Tempo de viagem restante:3.0 horas125.0 Pi uiui...bi Tradução: canhão inoperante!125.0 R2D2 operante125.0 R2, ligue o canhão!127.0 Pi..bi...bi Tradução: canhão operante!127.0 Viagem iniciada130.0 Falha do R2D2 Tempo de viagem restante:0.0 horas145.0 R2D2 operante145.0 Viagem concluida Duração total da viagem:145.0 horas150.0 Pi uiui...bi Tradução: canhão inoperante!
Desafio 14 Você não acha que pode viajar pelo espaço infinito sem encontrar alguns TIEs das forças imperiais, não é mesmo? Considere que a cada 25 horas, você se depara com um TIE imperial. O ataque dura 30 minutos e, se nesse tempo você não estiver com o canhão funcionando, a sua próxima viagem é para o encontro do mestre Yoda.
Dica: construa uma função executaCombate que controla todo o processo de combate. Você vai precisar também de uma variável global que informa se o X-Wing está ou não em combate.
Incialmente, precisamos de uma variável global para verificar a situação do combate:
import simpyemCombate =False# variável global que avisa se o x-wing está em combatecanhao =True# variável global que avisa se o canhão está funcionandoviajando =False# variável global que avisa se o x-wing está operandoduracaoViagem =30# variável global que marca a duração atual da viagem
A função executaCombate a seguir, incia o processo de combate e verifica quem foi o vitorioso:
defexecutaCombate(env,intervaloCombate,duracaoCombate):# processo de execução do combateglobal emCombate, canhao, duracaoViagemwhile duracaoViagem >0:# este processo só ocorre durante a viagem# aguarda o próximo encontro com as forças imperiraisyield env.timeout(intervaloCombate)# inicio do combate emCombate =Trueifnot canhao:print("%5.1f Fim da viagem\tO lado negro venceu"%env.now)breakelse:print("%5.1f Combate iniciado\tReze para que o canhão não quebre!"%env.now)try:yield env.timeout(duracaoCombate) emCombate =Falseprint("%5.1f Fim do combate\tR2D2 diz: tá tudo tranquilo, tá tudo normalizado."%env.now)except simpy.Interrupt:print("%5.1f OPS... O canhão quebrou durante o combate."%env.now)print("%5.1f Fim da viagem\tO lado negro venceu"%env.now)break
A quebra de canhão agora deve verificar se a nave está em combate, pois, neste caso, o X-Wing será esmagado pelo TIE:
defquebraCanhao(env,intervaloCanhao,combate):# processo de quebra do canhao entre intervalos definidosglobal canhao, duracaoViagem, emCombatewhile duracaoViagem >0:# este processo só ocorre durante a viagemyield env.timeout(intervaloCanhao)# aguarda a próxima quebra do canhaoif canhao: canhao =Falseprint("%5.1f Pi uiui...bi\tTradução: canhão inoperante!"% (env.now))if emCombate: combate.interrupt()
Finalmente, a incialização do modelo deve contar com uma chamada para o processo executaCombate:
A última linha do código anterior tem algo importante: optei por executar a simulação enquanto durar o processo de combate, afinal, ele mesmo só é executado caso a X-Wing esteja ainda em viagem.
Por fim, quando executado, o modelo completo fornece como saída:
0.0 Viagem iniciada10.0 Falha do R2D2 Tempo de viagem restante:20.0 horas20.0 Combate iniciado Reze para que o canhão não quebre!20.5 Fim do combate R2D2 diz: tá tudo tranquilo, tá tudo normalizado.25.0 Pi uiui...bi Tradução: canhão inoperante!25.0 R2D2 operante25.0 R2, ligue o canhão!27.0 Pi..bi...bi Tradução: canhão operante!27.0 Viagem iniciada30.0 Falha do R2D2 Tempo de viagem restante:17.0 horas40.5 Combate iniciado Reze para que o canhão não quebre!41.0 Fim do combate R2D2 diz: tá tudo tranquilo, tá tudo normalizado.45.0 R2D2 operante45.0 Viagem iniciada50.0 Pi uiui...bi Tradução: canhão inoperante!50.0 Falha do R2D2 Tempo de viagem restante:12.0 horas61.0 Fim da viagem O lado negro venceu
Teste seus conhecimentos
Não colocamos distribuições aleatórias nos processos. Acrescente distribuições nos diversos processos e verifique se o modelo precisa de alterações;
Acrescente a tentativa da destruição da Estrela da Morte ao final da viagem: com 50% de chances, nosso intrépido jedi consegue acertar um tiro na entrada do reator e explodir a Estrela da Morte (se ele erra, volta ao combate). Replique algumas vezes o modelo e estime a probabilidade de sucesso da operação.