O Problema dos 100 Prisioneiros é um problema matemático de probabilidade e combinatória, sua definição original pode ser encontrada em Gál e Miltersen (2003).
A definição aqui utilizada para O Problema dos 100 Prisioneiros foi extraída de Flajolet e Sedgewick (2009, p. 124):
"A hundred prisoners, each uniquely identified by a number between 1 and 100, have been sentenced to death. The director of the prison gives them a last chance. He has a cabinet with 100 drawers (numbered 1 to 100). In each, he’ll place at random a card with a prisoner’s number (all numbers different). Prisoners will be allowed to enter the room one after the other and open, then close again, 50 drawers of their own choosing, but will not in any way be allowed to communicate with one another afterwards. The goal of each prisoner is to locate the drawer that contains his own number. If all prisoners succeed, then they will all be spared; if at least one fails, they will all be executed."
Uma ótima definição visual pode ser vista no vídeo do canal Veritasium:
Diante do problema definido há duas estratégias de solução que serão utilizadas
Nesta estratégia os prisioneiros escolherão as gavetas de forma randômica. Diante disto a probabilidade
Para 100 prisioneiros, como os eventos são independentes, a probabilidade de todos encontrarem seus números é dada pelo seguinte produtório:
Nesta estratégia os prisioneiros seguirão o seguinte algoritmo:
- Abra a gaveta com o seu número correspondente.
- Se a gaveta aberta conter o cartão com o seu número FINALIZE. Caso não, abra a gaveta com este número.
- Caso o número de gavetas abertas seja menor ou igual a 50 repita o passo 2. Caso não, FINALIZE.
Esta estratégia se baseia no princípio de que esta configuração de gavetas e cartões geram ciclos, ou seja, cada gaveta aponta para outra gaveta de forma que se possa formar um ciclo de tamanho
Uma prova para este resultado pode ser vista no vídeo de Derek Muller, Petr Lebedev e Emily Zhang no canal Veritasium.
Desenvolver um algoritmo de simulação do Problema dos 100 Prisioneiros, de forma que se possa confirmar a eficácia da estratégia matemática em relação à estratégia randômica.
O algoritmo foi construído inteiramente em Python, na versão 3.10.2 com o uso do módulo random
. Você precisará do Python instalado para executar este algoritmo.
Para executar o algoritmo clone este repositório usando:
git clone https://github.com/ximiraxelo/one_hundred_prisoners_problem.git
Crie um arquivo .py
na pasta do projeto e execute o seguinte trecho de código:
from main import Problem
problem = Problem()
result_random = problem.start() # estratégia randômica
result_math = problem.start(math_strategy=True) # estratégia matemática
Este código executará o problema uma única vez, result_random
e result_math
são variáveis boolenas, serão True
caso todos os prisioneiros encontrem seus cartões e False
caso contrário.
Para verificar a eficácia da estratégia matemática o problema foi executada 1000 vezes, onde pôde-se comparar a performance dos métodos:
- FLAJOLET, P.; SEDGEWICK, R. Analytic combinatorics. Cambridge ; New York: Cambridge University Press, 2009.
- GÁL, A.; MILTERSEN, P. B. The Cell Probe Complexity of Succinct Data Structures. In: BAETEN, J. C. M. et al. (Eds.). Automata, Languages and Programming. Berlin, Heidelberg: Springer Berlin Heidelberg, 2003. v. 2719p. 332–344.
- MULLER, D.; LEBEDEV, P.; ZHANG, E. The Riddle That Seems Impossible Even If You Know The Answer., 2022 Disponível em: https://www.youtube.com/watch?v=iSNsgj1OCLA. Acesso em: 24 dez. 2022.