Vingadores - Visualizando diversos futuros simultaneamente
Durante a principal batalha contra Thanos o Doutor Estranho decide qual caminho escolher: um entre 14 milhões de futuros, aquele que os levará a vitória, e o Nerdologia Tech discute o assunto.
Mas como ele é capaz de visualizar tudo ao mesmo tempo? Tentaremos resolver o problema com Python e Data Science. Demonstraremos como ele foi capaz de visualizar todos os resultados em menos de um minuto.
O trabalho original
Nosso trabalho é baseado naquele do Gabriel Schade. Os heróis são: Ironman, Spiderman, Nebula, Peter Quill, Drax, Mantis e Doctor Strange.
Cada round alguém bate em alguém: heróis batem em Thanos em uma de 3 estratégias. Depois Thanos em um dos heróis aleatoriamente. Isso gera 3 * 7
possibilidades. Com mais dois rounds são 3^2*7^2
, possibilidades crescendo exponencialmente com o número de rounds.
O trabalho original faz o teste de uma heurística específica, que nos leva a resultados super interessantes. Aqui queremos ver o que o Doutor Estranho viu. Exatamente o que ele viu? Vamos ver... ele viu todos os futuros ao mesmo tempo? Poderia ser, mas para isso o computador teria que simular todas as possibilidades sequencialmente?
Nossa implementação
Simularemos diretamente todas as possibilidades ao mesmo tempo. Para isso faremos uso de um truque tradicional de algoritmos e maratonas de programação: nem todos os estados futuros são únicos. Por exemplo, para o primeiro round:
a) 1/3 de chance, homem de ferro bate com bônus 1 => Thanos não sente nem cócegas, continua com 500hp
b) 1/3 de chance, homem de ferro bate com bônus 2 => Thanos não sente nem cócegas, continua com 500hp
c) 1/3 de chance, homem de ferro bate com bônus 3 => Thanos fica com 450hp
Opa... esses 3 futuros podem ser resumidos em 2 estados: (66% 500hp, 33% 450hp). O mesmo ocorre com os estados futuros. Portanto podemos discretizar os futuros e armazená-los na memória junto com a probabilidade de cada um deles ocorrer. Agora a cada round rodamos um round ao mesmo tempo em todos os futuros ao mesmo tempo.
Aqui a visualização após um turno:
- 66% de chance de um cenário onde Thanos possui 100% de energia, e os Avengers 100% - 33% de chance de um cenário onde Thanos possui 95% de energia, e os Avengers 100%.
Aqui a visualização da distribuição de probabilidades após 2 turnos. Note que as probabilidades reforçam que os Avengers perdem energia mais rapidamente do que Thanos. As barras vão se aproximando do 0 no eixo dos Avengers, mas ficam muito próximas do 100% no eixo Thanos.
Aqui a visualização da distribuição de probabilidades após 10 turnos... Thanos se dando bem na maior parte dos casos:
Aqui a visualização da distribuição de probabilidades após 23 turnos:
Aqui a visualização da distribuição de probabilidades após 70 turnos:
O que o Doutor Estranho viu?
Aqui o vídeo de todos os futuros acontecendo ao mesmo tempo.
Note com o passar do tempo as chances dos Avengers causarem dano aumentando, mas a chance de ganharem fica praticamente invisível a olho nu. Enquanto isso a chance de perderem é muito óbvia:
Detectamos uma possibilidade de 0.00798543% dos Avengers ganharem a batalha. A chance é tão pequena que não aparece na renderização.
Trabalho futuro:
O código pode ser atualizado para memorizar os melhores caminhos, ajudando o Doutor a percorrer o desejado.
O principal avanço seria efetuar uma busca de parâmetros iniciais (hp, ataque, defesa etc) que resultaria em exatamente 1 único sucesso e 14 milhões de estados futuros.
Desafios ao nosso estudo
Os gráficos usam surfaces para facilita a visualização mas deveriam ser pontos para ser mais realista, sem extrapolação. Os pontos, porém, não ficam fáceis de serem visualizados os personagens escolhidos pelo trabalho original, sinta-se a vontade para mudá-los e recomendar alterações.
As estatísticas dos personagens, sinta-se a vontade para mudá-las e recomendar alterações, a batalha é mesmo baseada em turnos? Em filmes, costuma ser, não há perda de poder de ataque e defesa a medida que um personagem perde energia, assumimos que o futuro é decidido somente pelo resultado de uma batalha e os pesonagens envolvidos na mesma.
Pode ser que o universo dos Vingadores não seja real, e o filme não represente o universo em que vivemos. Nesse caso é possível que os futuros encontrados não sejam futuros de verdade, mas sim um plot 3d de um jupyter notebook no cloud.
Todo o código fonte do projeto pode ser encontrado aqui no meu github.