Vingadores - Visualizando diversos futuros simultaneamente

Vingadores - Visualizando diversos futuros simultaneamente
Guilherme Silveira
Guilherme Silveira

Compartilhe

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?

Imersão dev Back-end: mergulhe em programação hoje, com a Alura e o Google Gemini. Domine o desenvolvimento back-end e crie o seu primeiro projeto com Node.js na prática. O evento é 100% gratuito e com certificado de participação. O período de inscrição vai de 18 de novembro de 2024 a 22 de novembro de 2024. Inscreva-se já!

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.

Guilherme Silveira
Guilherme Silveira

Co-fundador da Alura, da Caelum e do GUJ. Com 18 anos de ensino nas áreas de programação e dados, criou mais de 100 cursos. Possui formação em engenharia de software, viés matemático e criativo, além de ser medalhista de ouro em competições nacionais de computação, tendo representado o Brasil nos mundiais. Participante de comunidades open source e de educação em tecnologia, tendo escrito 7 livros. Faz mágica e fala coreano no tempo livre.

Veja outros artigos sobre Data Science