Como se deve abordar o problema 213 do Projeto Euler (“Flea Circus”)?

11

Gostaria de resolver o Projeto Euler 213, mas não sei por onde começar, porque sou um leigo no campo da Estatística, observe que é necessária uma resposta precisa para que o método de Monte Carlo não funcione. Você poderia recomendar alguns tópicos estatísticos para eu ler? Por favor, não publique a solução aqui.

Flea Circus

Uma grade de quadrados 30 × 30 contém 900 pulgas, inicialmente uma pulga por quadrado. Quando um sino é tocado, cada pulga pula para um quadrado adjacente aleatoriamente (geralmente 4 possibilidades, exceto as pulgas na borda da grade ou nos cantos).

Qual é o número esperado de quadrados desocupados após 50 toques da campainha? Dê sua resposta arredondada para seis casas decimais.

grokus
fonte
7
Os métodos de Monte Carlo podem fornecer respostas muito precisas, desde que você faça simulações suficientes.
Rob Hyndman
3
Se você quer uma solução de programação, monte carlo é a única abordagem. Não vejo nenhuma razão para você não obter respostas precisas usando o monte carlo. Uma solução matemática / analítica pode não ser fácil.
Eu já vi discussões sobre Monte Carlo e as pessoas disseram que se você quiser obter 6 casas decimais, levará muito tempo ou talvez eu esteja confuso com outros problemas semelhantes. Como é bastante fácil codificar uma abordagem de Monte Carlo, acho que vale a pena experimentá-la primeiro.
grokus
4
Não discuto nenhuma das três respostas anteriores, mas a análise (simples) da resposta que ofereci coloca essas observações em perspectiva: se você deseja precisão com seis casas decimais para uma estimativa de um número que estará na casa das centenas, a simulação de Monte Carlo levará pelo menos um ano em uma máquina com 10.000 CPUs rodando em paralelo.
whuber
Todas as pulgas estão presas (ou seja, o problema é realmente sobre quadrados com mais de uma pulga) ou é sobre pulgas nas bordas pulando e desaparecendo?
MissMonicaE

Respostas:

10

Você está certo; Monte Carlo é impraticável. (Em uma simulação ingênua - isto é, que reproduz exatamente a situação do problema sem simplificações - cada iteração envolveria 900 movimentos de pulga. Uma estimativa bruta da proporção de células vazias é , implicando a variação do Monte - A estimativa de Carlo após dessas iterações é de aproximadamente Para fixar a resposta em seis casas decimais, é necessário estimar em 5.E -7 e, para obter uma confiança de 95 +% (digamos), seria necessário reduzir pela metade essa precisão para 2,5E-7. Resolver forneceN 1 / N 1 / e ( 1 - 1 / e ) = 0,2325 ... / N 1/eN1/N1/e(11/e)=0.2325/NN>4E12(0.2325/N)<2.5E7N>4E12, aproximadamente. Seriam cerca de 3,6E15 movimentos de pulgas, cada um tomando vários carrapatos de uma CPU. Com uma CPU moderna disponível, você precisará de um ano inteiro de computação (altamente eficiente). E eu assumi de maneira um tanto incorreta e super-otimista que a resposta é dada como uma proporção, em vez de uma contagem: como contagem, serão necessários mais três números significativos, implicando um aumento de um milhão de vezes no cálculo ... Você pode esperar muito tempo?)

No que diz respeito a uma solução analítica, algumas simplificações estão disponíveis. (Eles também podem ser usados ​​para reduzir o cálculo de Monte Carlo.) O número esperado de células vazias é a soma das probabilidades de vazio em todas as células. Para descobrir isso, você pode calcular a distribuição de probabilidade dos números de ocupação de cada célula. Essas distribuições são obtidas somando-se as contribuições (independentes!) De cada pulga. Isso reduz o problema de encontrar o número de caminhos de comprimento 50 ao longo de uma grade de 30 por 30 entre qualquer par de células nessa grade (uma é a origem da pulga e a outra é uma célula para a qual você deseja calcular a probabilidade da ocupação da pulga).

whuber
fonte
2
Por diversão, fiz um cálculo de força bruta no Mathematica. Sua resposta é uma proporção de um número inteiro de 21.574 dígitos para um número inteiro de 21.571 dígitos; como decimal está confortavelmente próximo de 900 / e conforme o esperado (mas, como somos solicitados a não publicar uma solução, não darei mais detalhes).
whuber
6

Você não poderia percorrer as probabilidades de ocupação das células para cada pulga. Ou seja, a pulga k está inicialmente na célula (i (k), j (k)) com probabilidade 1. Após 1 iteração, ele tem probabilidade de 1/4 em cada uma das 4 células adjacentes (supondo que ele não esteja no limite ou uma esquina). Em seguida, na próxima iteração, cada um desses quartos é "manchado" por sua vez. Após 50 iterações, você tem uma matriz de probabilidades de ocupação para os pulga. Repita sobre todas as 900 pulgas (se você tirar proveito das simetrias, isso reduz em quase um fator de 8) e adicione as probabilidades (você não precisa armazenar todas de uma só vez, apenas a matriz da pulga atual (hmm, a menos que você esteja muito inteligente, você pode querer uma matriz de trabalho adicional) e a soma atual de matrizes). Parece-me que existem muitas maneiras de acelerar isso aqui e ali.

Isso não envolve nenhuma simulação. No entanto, envolve muita computação; não deve ser muito difícil calcular o tamanho da simulação necessário para fornecer respostas com uma precisão um pouco melhor que 6 dp com alta probabilidade e descobrir qual abordagem será mais rápida. Espero que essa abordagem supere a simulação por alguma margem.

Glen_b -Reinstate Monica
fonte
2
Você está respondendo uma pergunta um pouco diferente da pergunta. A questão é perguntar o número esperado de células que ficariam vazias após 50 saltos. Corrija-me se estiver errado, mas não vejo caminho direto a partir da probabilidade de uma pulga terminar em um determinado quadrado após 50 saltos até a resposta de quantas células se espera que estejam vazias.
Andy W
1
@ Andy W - ótimo comentário; ainda Monte Carlo pode ser usado para fazer este último passo ;-)
4
@ Andy W: Na verdade, a parte mais difícil foi obter todas essas probabilidades. Em vez de adicioná-los a cada célula, multiplique seus complementos: essa é a probabilidade de que a célula fique vazia. A soma desses valores em todas as células fornece a resposta. A abordagem de Glen_b supera a simulação em sete ou oito ordens de magnitude ;-).
whuber
@ Whuber, obrigado pela explicação. De fato, obter essas probabilidades em menos de um minuto seria um desafio. É um quebra-cabeça divertido e obrigado pela sua contribuição.
Andy W
5

Embora não me oponha à impossibilidade prática (ou impraticabilidade) de uma resolução de Monte Carlo deste problema com uma precisão de 6 casas decimais apontada pelo whuber , eu pensaria que uma resolução com seis dígitos de precisão pode ser alcançada.

t+1tK

K2

p^050(X(t))

p^0=1450i=1450I0(Xi(50))
(X(t))t=50π

i=1450(1πi)450
166.1069
pot=rep(c(rep(c(0,1),15),rep(c(1,0),15)),15)*c(2,
    rep(3,28),2,rep(c(3,rep(4,28),3),28),2,rep(3,28),2)
pot=pot/sum(pot)
sum((1-pot)^450)-450
[1] 166.1069

166.11

Como comentado por whuber , as estimativas precisam ser multiplicadas por 2 para responder corretamente à pergunta, portanto, um valor final de 332,2137,

Xi'an
fonte
1
+1 muito perspicaz. Acredito que você precise dobrar sua resposta final, porque a pergunta é sobre todas as 900 células.
whuber
1
Eu acredito que você pode estar começando mais longe da distribuição estacionária do que pensa. Os cálculos de força bruta que fiz originalmente calcularam a 50ª potência da matriz de transição usando aritmética exata (racional). A partir dele, obtive um valor de 330,4725035083710 ... Talvez eu tenha cometido um erro .... Cometi um erro e agora obtenho 330.7211540144080 .... A verificação extensiva sugere que a matriz de transição está correta.
whuber
@ whuber: Obrigado, é realmente uma possibilidade. Tentei encontrar um argumento de acoplamento para determinar a velocidade da estacionariedade, mas não consegui. Uma simulação de Monte Carlo com o processo original me proporcionou 333,96 ao longo de 10⁶ réplicas e 57 horas de computação. Sem mais garantia sobre a precisão.
Xian
1
Aqui está o meu raciocínio. A matriz de transição para as 50 etapas é a 50ª potência da matriz de transição, de onde seus valores próprios são os 50º poderes dos valores próprios. Somente os autovetores correspondentes a valores cujas 50ª potências são de qualquer tamanho apreciável aparecerão como componentes no final de suas 50 etapas. Além disso, essas 50ª potências nos informam sobre o erro relativo cometido ao parar na 50ª etapa, em vez de realmente atingir um estado estacionário.
whuber
1
900×900
4

Uma abordagem analítica pode ser entediante e eu não pensei nos meandros, mas aqui está uma abordagem que você pode querer considerar. Como você está interessado no número esperado de células que estão vazias após 50 toques, você precisa definir uma cadeia markov sobre o "Não das pulgas em uma célula" em vez da posição de uma pulga (consulte a resposta de Glen_b que modela a posição de uma pulga como uma cadeia de markov. Como apontado por Andy nos comentários a essa resposta, essa abordagem pode não conseguir o que você deseja.)

Especificamente, deixe:

nij(t)ij

Em seguida, a cadeia markov começa com o seguinte estado:

nij(0)=1ij

Como as pulgas se movem para uma das quatro células adjacentes, o estado de uma célula muda dependendo de quantas pulgas estão na célula-alvo e de quantas pulgas existem nas quatro células adjacentes e da probabilidade de elas se moverem para essa célula. Usando esta observação, você pode escrever as probabilidades de transição de estado para cada célula em função do estado dessa célula e do estado das células adjacentes.

Se desejar, posso expandir a resposta ainda mais, mas isso, juntamente com uma introdução básica às cadeias de markov, deve ajudá-lo a começar.

Comunidade
fonte
1
nij
@whuber Não, você não precisa manter a posição de pulgas como uma cadeia de markov. Pense no que estou propondo como uma caminhada aleatória para uma célula. Uma célula está inicialmente na posição '1' de onde pode ir para 0, 1, 2, 3, 4 ou 5. A probabilidade de transição de estado depende dos estados das células adjacentes. Assim, a cadeia proposta é um espaço de estado redefinido (o número de células para cada célula) e não a posição da pulga. Isso faz sentido?
1
Faz sentido, mas parece um retrocesso, porque o número de estados agora não é muito maior? Em um modelo, existem 900 estados - a posição de uma única pulga - e não mais de quatro transições em cada uma. O cálculo só precisa ser feito para uma única pulga, porque todas elas se movem independentemente. No seu caso, parece que um estado é descrito pela ocupação de uma célula, juntamente com a ocupação de seus até quatro vizinhos. Seria um número extremamente grande de estados e também um número muito grande de transições entre os estados. Devo estar entendendo mal qual é o seu novo espaço de estado.
whuber
{nij}
2

se você for seguir a rota numérica, uma observação simples: o problema parece estar sujeito à paridade vermelho-preto (uma pulga em um quadrado vermelho sempre se move para um quadrado preto e vice-versa). Isso pode ajudar a reduzir o tamanho do problema pela metade (considere apenas dois movimentos de cada vez e observe apenas as pulgas nos quadrados vermelhos).

shabbychef
fonte
1
Essa é uma boa observação. No entanto, achei mais incômodo do que vale a pena explorar isso explicitamente. A maior parte da programação equivale à configuração da matriz de transição. Depois de fazer isso, apenas encaixe e trabalhe com isso. Usando matrizes esparsas, remover metade dos zeros não economiza tempo de qualquer maneira.
whuber
@ whuber: Eu suspeito que o objetivo desses problemas é aprender técnicas de resolução de problemas, em vez de consumir muitos ciclos computacionais. Simetria, paridade, etc., são técnicas clássicas do livro de Larson sobre resolução de problemas.
21810 shabbychef
1
Este é um bom ponto. Em última análise, é necessário algum julgamento. O Projeto Euler parece enfatizar as compensações entre insight matemático e eficiência computacional. Glen_b mencionou simetrias que valem a pena explorar primeiro porque há mais a ser ganho com elas. Além disso, usando a aritmética de matriz esparsa, você obterá o ganho duplo automaticamente (se você está ciente da paridade ou não!).
whuber
1

Suspeito que algum conhecimento de cadeias de Markov em tempo discreto possa ser útil.

Simon Byrne
fonte
3
Isso deveria ter sido um comentário, mas acho que podemos avô-lo neste momento.
gung - Restabelece Monica
Isso está sendo marcado automaticamente como de baixa qualidade, provavelmente porque é muito curto. Você pode expandir isso?
gung - Restabelece Monica
Não vejo o porquê: a pergunta pede tópicos que possam ser úteis, e este é o tópico que, na minha opinião, é mais relevante.
Simon Byrne
1
Isso foi sinalizado como baixa qualidade . Votei que estava tudo bem. Se você olhar para as outras respostas a esta discussão, elas são consideravelmente mais longas. Os padrões evoluíram com o tempo, mas hoje isso seria considerado um comentário, mesmo se mencionar um "tópico que pode ser útil". Como eu disse, pensei que isso poderia ser adquirido como está. Se você tentar expandir, é com você. Eu estava apenas deixando você saber.
gung - Restabelece Monica