Categorias
Simulação

Simulações, agora vai...

Errata (de novo)

Bom, gente de novo, bugs no programa levaram a resultados incorretos. Dessa vez foi um bug no código mesmo1. Shame on me. Corrigi os gráficos e o artigo para a nova situação. Como programador estou me saindo um belo cientista político ;)2

Bom, como vocês viram a simulação do ultimo post acabou dando errado por um errinho de calculo. Tentei solucionar usando ao invés de uma busca exaustiva pela distribuição dos eleitores (que era o que eu estava fazendo), uma busca exaustiva dos eleitores em si, gerando assim cada combinação possível de  eleitores escolhidos entre o meu universo possíveis eleitores (i.e. todas as permutações possíveis da sequencia de candidatos).

Sendo o número de eleitores e o número de candidatos, preciso gerar combinações, o que com 3 candidatos e míseros 14 eleitores me dá a bagatela de 78364164096 combinações possíveis e levou mais de 8 horas pra rodar no meu computador de casa (um macmini i5). Daí já dá pra ver que era inviável continuar. Mas... tudo tem sua vantagem, e a vantagem agora é que eu sabia os valores exatos que eu queria simular, pelo menos pra eleitorados de até 14 eleitores. Se eu conseguisse aqueles valores eu estava no caminho certo.

Busca exaustiva das possíveis distribuições de eleitores

A minha nova abordagem agora era reusar as combinações de distribuição dos eleitores que eu havia feito no post anterior, mas ajustando o "peso" de cada distribuição de acordo com sua possibilidade de ocorrência. Com bastante esforço, contagem e malabarismo algébrico, consegui uma formula fechada para esse "peso". Consideremos que representa a quantidade dos eleitores do tipo a . A quantidade de vezes que essa quantidade de eleitores pode acontecer na busca exaustiva realizada lá em cima é dada por:

A cada distribuição avaliada, o valor de obtido acima é somado ao número de vezes que um dado resultado ocorreu (atualmente conto apenas as vezes em que o resultado de primeiro e segundo turno diferem, portanto a contagem de diferenças é acrescida de cada vez que o resultado do primeiro turno diverge do resultado do segundo. (E obviamente a contagem do total de combinações analisadas também é acrescida do mesmo valor).

Com essa modificação consegui reduzir o tempo de execução da simulação com 14 eleitores de uma noite inteira para alguns décimos de segundo. Uma simulação com 100 eleitores roda em pouco mais de 1 minuto.3 4

Novo gráfico e nova conclusão

O resultado desse experimento está documentado no gráfico abaixo.

O padrão de convergência se repete, como acontecia na simulação "errada", só que agora é para um valor entre 18 e 23%. Um valor bem mais razoável para se justificar a existência do segundo turno.56 Um padrão que não aparecia na simulação anterior agora fica bem óbvio tambémContinua não aparecendo7: há um aparente agrupamento dos pontos de 3 em 3, bem alinhados (a cada conjunto de 6 os tamanhos de população impares se agrupam de 3 em 3, o mesmo ocorrendo com os pares de forma quase simétrica). Não sei que relevância isso tem, mas que fica bacana, isso fica!

Simulação probabilística

Para tentar otimizar o funcionamento da simulação, implementei também um simulador probabilístico, onde gero uma população de eleitores aleatórios e aplico nela as mesmas avaliações que na população da busca exaustiva, repetindo a experiência 10 mil vezes (esse valor é configurável, claro).8 Os valores parecem bem próximos, como vemos no gráfico abaixo:


Próximos passos

Ainda devo uma análise dos dados do TSE, então esse passo fica sendo um dos objetivos pro próximo artigo sobre simulação e/ou resultados. Além disso, preciso validar o simulador probabilístico com mais de 3 eleitores. Se ele aparentar um bom desempenho passarei a usá-lo para prever o comportamento em situações onde a simulação exata for impossível. Last, but not least vou começar a descrever nossas eleições do legislativo: Senado (com 1 ou dois senadores eleitos), e câmara dos Deputados e suas similares locais (Câmaras municipais e Assembléias estaduais).

References
1 Eu usei um binary search num vetor nem sempre ordenado (os vencedores do segundo turno)
2 Brincadeirinha, não sou bom em nenhuma das duas coisas
3 O código fonte se encontra no mesmo local, https://github.com/girino/matvoto, e agora está bem mais "porco" devido a quantidade de testes e mexidas que fiz nele sem preocupar nem com performance nem com organização.
4 Além do problema de tempo de execução, o problema de estouro da precisão também teve seu momento, e com apenas 35 eleitores o número de possibilidades já estoura o valor máximo contido em um inteiro de 64 bits (tipo long, em java). A solução foi adaptar a contagem de resultados usando um BigInteger
5 Esse valor parece aumentar conforme aumenta a quantidade de candidatos
6 E também parece convergir para 25% com o aumento do eleitorado
7 com a correção do bug o padrão continua existindo, mas é bem menos visível, por isso risquei
8 O código fonte está disponível junto com to o resto no github, a classe que executa essa simulação é a RandomElectorElectionSimulator. 

Uma resposta em “Simulações, agora vai...”

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.