O Jogo da Vida

O matemático John Conway faleceu na semana passada, vítima do Coronavírus.

Ele foi o criador do “Jogo da Vida”, o primeiro exemplo de autômato celular. É bastante interessante e lúdico.

O jogo faz a seguinte análise:

  1. Qualquer célula viva com menos de dois vizinhos vivos morre de solidão.
  2. Qualquer célula viva com mais de três vizinhos vivos morre de superpopulação.
  3. Qualquer célula morta com exatamente três vizinhos vivos se torna uma célula viva.
  4. Qualquer célula viva com dois ou três vizinhos vivos continua no mesmo estado para a próxima geração.

Um pouco da história

O conceito de autômato celular foi criado pela genial dupla John Von Neumann e Stanislaw Ulam, durante o Projeto Manhattan, que criou a primeira bomba atômica. Von Neumann tinha interesse em entender organismos autorreplicáveis.

John Conway inventou o Jogo da Vida enquanto um estudante de graduação. Ele gostava de jogos, e já tinha dominado vários quando quis criar um novo. Ele se inspirou nos trabalhos de Neumann e Ulam.

Ele fazia simulações num tabuleiro de Go, aquele jogo oriental que tem um tabuleiro de 19 x 19 quadrados e peças pretas e brancas, numa época que não tinha computador.

Dependendo das regras, a população pode explodir para a superpopulação, ou para a extinção total.

As regras do jogo acima foram cuidadosamente escolhidas, para entrar em equilíbrio. Rodando várias iterações, começam a surgir alguns padrões.

O Jogo da Vida ficou famoso em 1970, após artigo de Martin Gardner na Scientific American. Gardner é um dos maiores divulgadores de puzzles de todos os tempos (tenho uns 5 livros dele), e Conway enviava cartas frequentemente para contribuir.

Anos depois, em 2002, o matemático Stephen Wolfram (do Wolfram Alpha) publicou um estudo detalhado de autômatos celulares em geral, com classificação de tipos, regras, etc.

Esta técnica pode ter utilidade em diversas áreas do conhecimento: modelos biológicos, economia, etc. Inclusive, há alguns modelos de transmissão de Coronavírus baseados em autômato celular.

Em homenagem a Conway, fiz duas implementações do Jogo da Vida. Uma em Python e outra em Excel. É um bom exercício, para um nível intermediário de programação. Seguem alguns estudos.

Vide links a seguir.

https://github.com/asgunzi/JogodaVidaExcel

https://github.com/asgunzi/JogoVidaPython

https://mathworld.wolfram.com/CellularAutomaton.html

https://guiadoestudante.abril.com.br/estudo/conheca-john-conway-o-matematico-que-criou-o-jogo-da-vida

https://en.wikipedia.org/wiki/Cellular_automaton

https://mathworld.wolfram.com/ElementaryCellularAutomaton.html

Método de Monte Carlo e os perigos de ignorar o desvio padrão

Método de Monte Carlo

Este pequeno experimento visa demonstrar o efeito e perigos de fazer dimensionamento a partir da média, desconsiderando o desvio padrão. Utilizaremos o método de Monte Carlo, em Excel, para isto. Download do arquivo.

Suponha a seguinte situação. Uma fábrica produz 10 mil itens por dia, envia para um centro consumidor, e neste, 10 mil itens são consumidos por dia. Pergunta: qual o estoque necessário para suportar a demanda?

Monte01.jpg

Montando num excel, é só considerar uma coluna para produção (10 mil), outra para demanda (10 mil).
Só tem uma fórmula: estoque de hoje = estoque dia anterior + produção – consumo.

Monte02.png

Resposta: É necessário estoque zero. Nada.
Se o mundo fosse determinístico, perfeito, não seria necessário ter item algum em estoque. Produção é igual à demanda, e fim de papo.


 

Mundo não-determinístico

O único problema é que o mundo não é determinístico. É o livre-arbítrio de cada um de nós que decide o que queremos fazer, o que queremos consumir. A soma de todas essas decisões individuais é o mercado. Não controlamos o mercado. É o mercado que dita as regras, e tais regras podem ter um comportamento estatístico modelável (ou não). Para descrever este comportamento estatístico, podemos lançar mão de ferramentas como o Método de Monte Carlo.

Basicamente, o método de Monte Carlo simula o comportamento da fábrica e o do consumidor, segundo alguma distribuição estatística.

Uma normal (ou gaussiana) é completamente definida por uma média e um desvio padrão. Quanto maior o desvio padrão, maior a chance do valor observado estar mais distante da média.

Monte03.png

No mesmo caso descrito, digamos que tanto a produção quanto o consumo sejam modelados por uma normal de média 10 mil e desvio padrão de 3 mil.

Monte04.jpg

O Monte Carlo vai sortear um valor para a produção, que vai ser próximo de 10 mil, talvez um pouco para cima ou um pouco para baixo. 65% dos valores estarão entre 7 mil e 13 mil (mais ou menos um desvio padrão), 95% dos valores estarão entre 4 mil e 16 mil (dois desvios padrões). Portanto, pode haver um dia com consumo muito acima da média, mas tais ocorrências serão raras. Por haver sorteios, este método lembra um cassino, por isso o nome “Monte Carlo”, em referência ao cassino.

Em termos de modelo Excel, usamos a função genNormal(média, desvio) para simular um sorteio de uma variável aleatória normal. Esta função é do pacote Yasai, cujas fórmulas estão contidas na planilha anexa. O Yasai é um pacote open source para simulação em planilha. Alguns pacotes mais famosos são o Cristal Ball e AtRisk.

Para um trial, ou seja, uma rodada aleatória, a produção gira em torno de 10 mil, a demanda também em torno de 10 mil. Estoque inicial igual a zero. Mas o estoque varia ao longo dos dias.

Monte05.png

No gráfico, nota-se que o estoque ficou negativo a maior parte do tempo.

Monte06.png

Para um outro trial:
(para simular outro trial no excel, apertar F9).

Monte07.png

Deve-se simular o modelo diversas vezes e guardar os resultados, para ter massa de dados para compensar o efeito da aleatoriedade de um trial.

Rodando uns 1000 trials neste caso, vai dar que 50% das vezes haverá problemas de desabastecimento e 50% sem problemas.

Na média, o consumo é igual à produção, mas o problema é o desvio padrão. Para suportar tais flutuações, são necessários os estoques.

 

Digamos, um estoque de 7 mil peças dá um aumento da garantia de abastecimento. O estoque tem que ser suficiente para cobrir o efeito somado dos desvios padrões (consumo e produção).

Monte08.jpg

Deve-se variar o estoque inicial, rodar outros tantos 1000 trials, e verificar a probabilidade de desabastecimento.

A pergunta final a responder é: qual o risco que quero correr? Qual o estoque mínimo que compense o custo do desabastecimento?

  • Se o produto não for importante, pode faltar à vontade, e é necessário pouco ou nenhum estoque.
  • Se o produto for crucial, é bom que o estoque seja bem calculado.
  • Quanto maior o custo do desabastecimento, maior o estoque de segurança necessário.

 

O método de Monte Carlo pode ser utilizado para modelar situações complexas da vida real, e fornecer uma estimativa dos riscos associados. O modelo apresentado é muito simples, mas este pode ser tão complicado quanto se queira, com outras distribuições estatísticas, etc.

Ponderar Riscos x Seguros é exatamente a mesma conta de fazer o seguro do carro. Pagar o seguro é salgado, digamos 2 mil reais, mas ter o azar de ter o carro roubado é muito pior, digamos 50 mil reais.

Um seguro, um estoque, custa caro, mas vale a pena se este for dimensionado para evitar um prejuízo ordens de grandeza maior.

 

 

 

Gerador de Bullshit Comunista

Fiz um geradorzinho de bullshit comunista em javascript, e hospedei no link a seguir (porque o servidor do blog não aceita javascript):

 

http://asgunzi.github.io/BullshitComunista/

 


 

Tutorial para criar um gerador de bullshit:

1 – Escolha um tema facilmente “bullshitável”, como textos sobre comunismo.

 


2 – Separe algumas frases para o começo, algumas para o meio, e outras para o fim.

TabelaFrases.JPG

 


3 – Combine-as aleatoriamente.

Ex 1: “Ainda que as circunstâncias tenham mudado, sob o jugo do absolutismo feudal opondo um manifesto do próprio partido à lenda do espectro do comunismo.”

Ex 2:  “Um espectro ronda a Europa – o espectro do comunismo, da mesma forma que o pequeno burguês em duas grandes classes diametralmente opostas: a burguesia e o proletariado.”

 


 

 

Talvez haja algum maluco que veja sentido nisto, mas são frases que não pé nem cabeça.

Fica a dica.

 

http://asgunzi.github.io/BullshitComunista/

 

O mesmo projetinho encontra-se no Github, para quem quiser se inspirar.

Pequeno experimento com o Dilema do Prisioneiro

O Dilema do prisioneiro é um jogo clássico da Teoria dos Jogos. É um dilema porque, se um oponente escolher trair o outro, o primeiro obtém ganhos locais. Mas, se um confiar no outro e ambos colaborarem, o resultado global é melhor para todo mundo.
 

Fiz um pequeno simulador baseado neste jogo. É em Excel, disponível para download neste link.
https://drive.google.com/file/d/0B7qV4XXADYw2bzYweWc3YkViOUk/view?usp=sharing

 

TelaDilema


 

O jogo

Você está participando de um jogo com as seguintes regras:
 

– são 12 pontos em jogo, você contra um oponente
– tanto você quanto o oponente têm duas opções: dividir os pontos (cooperar), ou tomar todos os pontos para si.
– caso ambos cooperam, cada um receberá 6 pontos (6 e 6).
– caso um escolha “cooperar” e o outro “tomar”, o primeiro não ganhará pontos, e o segundo ganhará 10 pontos (10 e 0) ou (0 e 10).
– Caso os dois oponentes escolham tomar tudo, ambos ganham um ponto (1 e 1).
– são 20 rodadas contra cada oponente.


 

Os personagens
Simulei três tipos de personagens para jogar: o avarento, o coração mole, e o assertivo.

 
O tipo avarento é alguém que sempre joga “tomar tudo”, a fim de maximizar seus ganhos imediatos.

 
O tipo coração mole sempre joga compartilhar, sabendo que a longo prazo o bolo a ser dividido é maior se houver colaboração.

 
O tipo assertivo é baseado na estratégia “tit for tat” – retribui na mesma moeda o resultado anterior do oponente. Se o oponente escolheu cooperar na rodada anterior, ele coopera também. Se o outro escolheu tomar, ele também vai fazer isto. O primeiro voto dele é sempre cooperar, dando um voto de confiança. Um assertivo é alguém que não é nem “bonzinho” nem “malvado”, e o tit for tat é o comportamento que mais se aproxima de alguém assim.


 

Duelos

O Coração Mole é massacrado pelo Avarento.

game1

 

O Avarento também ganha do Assertivo, mas a margem é menor.

game2

Um avarento contra outro avarento: todo mundo sai perdendo.

game3

Já um coração mole contra um assertivo ou outro coração mole: todos saem ganhando.

Um assertivo contra outro assertivo também resulta em cooperação plena.

games4_6


 

Portanto, o quadro final de resultados entre jogos ficaria assim:

TelaResultados

 

Neste caso, o Assertivo ganha, com o ganancioso em segundo e o coração mole em terceiro.

 

Imaginando algo mais próximo da população de verdade, digamos que 25% da população seja de Avarentos, 50% de assertivos e 25% de corações moles. Neste caso, o ranking de ganhos ponderado ficaria assim:

TelaResumo

 

E o comportamento assertivo sai ganhando, neste mini campeonato de algoritmos.

E, numa população onde a maioria é de assertivos ou corações moles, o coração também ganha do avarento.

O resultado deste joguinho é meio metafórico, mas creio que podem surgir lições daí.

Uma sociedade onde ninguém coopera dá origem à “tragédia dos comuns” – um termo da Economia, onde um resultado que seria melhor para todos nunca é alcançado.

Uma sociedade só com “bonzinhos” é vulnerável a um espertalhão, ganancioso.

De algum modo, o ideal é ficar entre estes extremos.

 

 

Arnaldo Gunzi

Jun/2015