Comment aborder le problème 213 du projet Euler («Flea Circus»)?

11

Je voudrais résoudre le projet Euler 213 mais je ne sais pas par où commencer parce que je suis un profane dans le domaine des statistiques, notez qu'une réponse précise est requise pour que la méthode Monte Carlo ne fonctionne pas. Pourriez-vous me recommander quelques sujets de statistiques? Veuillez ne pas poster la solution ici.

Cirque aux puces

Une grille de carrés 30 × 30 contient 900 puces, initialement une puce par carré. Lorsqu'une cloche sonne, chaque puce saute sur une case adjacente au hasard (généralement 4 possibilités, à l'exception des puces sur le bord de la grille ou dans les coins).

Quel est le nombre attendu de cases inoccupées après 50 sonneries? Donnez votre réponse arrondie à six décimales.

grokus
la source
7
Les méthodes de Monte Carlo peuvent donner des réponses très précises à condition de faire suffisamment de simulations.
Rob Hyndman
3
Si vous voulez une solution de programmation, Monte Carlo est la seule approche. Je ne vois aucune raison pour laquelle vous n'obtiendrez pas de réponses précises en utilisant monte carlo. Une solution mathématique / analytique peut ne pas être facile.
J'ai vu des discussions sur Monte Carlo et les gens ont dit que si vous voulez atteindre 6 décimales, cela prendrait trop de temps, ou peut-être que je suis confondu avec d'autres problèmes similaires. Puisqu'il est assez facile de coder une approche Monte Carlo, je pense qu'il vaudra la peine de l'essayer d'abord.
grokus
4
Je ne conteste aucune des trois réponses précédentes, mais l'analyse (simple) dans la réponse que j'ai proposée met ces remarques en perspective: si vous voulez une précision de six décimales pour une estimation d'un nombre qui sera dans les centaines, la simulation de Monte-Carlo prendra au moins un an sur une machine avec 10 000 CPU fonctionnant en parallèle.
whuber
Toutes les puces sont-elles piégées (c'est-à-dire que le problème concerne vraiment les carrés avec plus d'une puce) ou s'agit-il de puces sur les bords qui sautent et disparaissent?
MissMonicaE

Réponses:

10

Vous avez raison; Monte-Carlo est impraticable. (Dans une simulation naïve - c'est-à-dire qui reproduit exactement la situation problématique sans aucune simplification - chaque itération impliquerait 900 mouvements de puces. Une estimation grossière de la proportion de cellules vides est , impliquant la variance du Monte - L'estimation de Carlo après N de telles itérations est d'environ 1 / N 1 / e ( 1 - 1 / e ) = 0,2325 / N1/eN1/N1/e(1-1/e)=0,2325/N. Pour épingler la réponse à six décimales, vous devez l'estimer à 5E-7 près et, pour atteindre une confiance de 95 +% (disons), vous devez diviser par deux cette précision à 2,5E-7 environ. . Résolution donneN>4E12, environ. Cela équivaudrait à environ 3,6E15 mouvements aux puces, chacun prenant plusieurs ticks d'un CPU. Avec un processeur moderne disponible, vous aurez besoin d'une année complète de calcul (très efficace). Et j'ai supposé de manière quelque peu incorrecte et trop optimiste que la réponse est donnée sous forme de proportion plutôt que de nombre: en tant que nombre, il faudra trois chiffres plus significatifs, entraînant une augmentation d'un million de fois dans le calcul ... Pouvez-vous attendre longtemps?)(0,2325/N)<2,5E-septN>4E12

En ce qui concerne une solution analytique, certaines simplifications sont disponibles. (Celles-ci peuvent également être utilisées pour raccourcir un calcul Monte Carlo.) Le nombre attendu de cellules vides est la somme des probabilités de vide sur toutes les cellules. Pour trouver cela, vous pouvez calculer la distribution de probabilité des nombres d'occupation de chaque cellule. Ces distributions sont obtenues en additionnant les contributions (indépendantes!) De chaque puce. Cela réduit votre problème à trouver le nombre de chemins de longueur 50 le long d'une grille de 30 sur 30 entre une paire de cellules donnée sur cette grille (l'une est l'origine de la puce et l'autre est une cellule pour laquelle vous souhaitez calculer la probabilité de la occupation des puces).

whuber
la source
2
Juste pour le plaisir, j'ai fait un calcul de force brute dans Mathematica. Sa réponse est un rapport d'un entier de 21 574 chiffres à un entier de 21 571 chiffres; en décimal, il est confortablement proche de 900 / e comme prévu (mais, comme on nous demande de ne pas publier de solution, je ne donnerai pas plus de détails).
whuber
6

Ne pourriez-vous pas parcourir les probabilités d'occupation des cellules pour chaque puce. Autrement dit, la puce k est initialement dans la cellule (i (k), j (k)) avec la probabilité 1. Après 1 itération, il a une probabilité 1/4 dans chacune des 4 cellules adjacentes (en supposant qu'il n'est pas sur un bord ou dans un coin). Ensuite, à la prochaine itération, chacun de ces quartiers est "barbouillé" à son tour. Après 50 itérations, vous avez une matrice de probabilités d'occupation pour la puce k. Répétez l'opération sur les 900 puces (si vous profitez des symétries, cela diminue de près d'un facteur 8) et ajoutez les probabilités (vous n'avez pas besoin de les stocker toutes en même temps, juste la matrice actuelle des puces (hmm, sauf si vous êtes très intelligent, vous voudrez peut-être une matrice de travail supplémentaire) et la somme actuelle des matrices). Il me semble qu'il existe de nombreuses façons d'accélérer cela ici et là.

Cela n'implique aucune simulation. Cependant, cela implique beaucoup de calculs; il ne devrait pas être très difficile de déterminer la taille de simulation requise pour donner les réponses avec une précision légèrement meilleure que 6 dp avec une probabilité élevée et déterminer quelle approche sera plus rapide. Je m'attends à ce que cette approche dépasse la simulation d'une certaine marge.

Glen_b -Reinstate Monica
la source
2
Vous répondez à une question légèrement différente de la question posée. La question est de savoir le nombre attendu de cellules qui seraient vides après 50 sauts. Corrigez-moi si je me trompe, mais je ne vois aucun chemin direct depuis la probabilité qu'une puce se retrouve dans un certain carré après 50 sauts jusqu'à la réponse: combien de cellules devraient être vides.
Andy W
1
@Andy W - grand commentaire; pourtant Monte Carlo peut être utilisé pour faire cette dernière étape ;-)
4
@Andy W: En fait, le plus difficile était d'obtenir toutes ces probabilités. Au lieu de les ajouter à chaque cellule, multipliez leurs compléments: c'est la probabilité que la cellule soit vide. La somme de ces valeurs sur toutes les cellules donne la réponse. L'approche de Glen_b bat la simulation de sept ou huit ordres de grandeur ;-).
whuber
@whuber, Merci pour l'explication. En effet, obtenir ces probabilités en moins d'une minute serait difficile. C'est un puzzle amusant et merci pour votre contribution.
Andy W
5

Bien que je ne m'oppose pas à l'impossibilité pratique (ou à l'impraticabilité) d'une résolution de Monte Carlo de ce problème avec une précision de 6 décimales signalée par whuber , je pense qu'une résolution à six chiffres de précision peut être obtenue.

Tout d'abord, après Glen_b , les particules sont échangeables dans un régime stationnaire, il suffit donc (comme en suffisance ) de surveiller l'occupation des différentes cellules, car cela constitue également un processus de Markov. La répartition des occupations au pas de temps suivant est terminée, déterminée par les occupations à l'instant courant t . L'écriture de la matrice de transition K n'est certainement pas pratique, mais la simulation de la transition est simple.t+1tK

Deuxièmement, comme l'a noté shabbychef , on peut suivre le processus d'occupation sur les 450 carrés impairs (ou pairs), qui reste sur les carrés impairs en ne considérant que les temps pairs, c'est-à-dire la matrice de Markov au carré .K2

En troisième lieu , le problème initial ne considère que la fréquence du zéro d' p 0 , après 50 transitions de Markov. Étant donné que le point de départ a une valeur très élevée pour la distribution de probabilité fixe de la chaîne de Markov ( X ( t ) ) , et étant donné que l' accent sur une moyenne unique pour toutes les cellules, p 0 = 1p^050(X(t))on peut considérer que la réalisation de la chaîne(X(t))au tempst=50est une réalisation à partir de la distribution de probabilité stationnaire. Cela apporte une réduction importante du coût de calcul, car nous pouvons simuler directement à partir de cette distribution stationnaireπ, qui est une distribution multinomiale avec des probabilités proportionnelles à 2, 3 et 4 sur le coin pair, d'autres cellules sur le bord et les cellules internes , respectivement.

p^0=1450je=1450je0(Xje(50))
(X(t))t=50π

Evidemment, la distribution stationnaire fournit directement le nombre attendu de cellules vides comme égal à 166.1069 ,

je=1450(1-πje)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

ce qui est assez proche d'une approximation de Monte Carlo de [basée sur des simulations 10⁸, ce qui a pris 14 heures sur ma machine]. Mais pas assez près pour 6 décimales.166.11

Comme l'a commenté whuber , les estimations doivent être multipliées par 2 pour répondre correctement à la question, d'où une valeur finale de 332.2137,

Xi'an
la source
1
+1 Très perspicace. Je pense que vous devez doubler votre réponse finale, car la question porte sur les 900 cellules.
whuber
1
Je pense que vous pourriez commencer plus loin de la distribution stationnaire que vous ne le pensez. Les calculs de force brute que j'ai faits à l'origine ont calculé la 50e puissance de la matrice de transition en utilisant l'arithmétique exacte (rationnelle). J'en ai obtenu une valeur de 330,4725035083710 .... J'ai peut-être fait une erreur .... J'ai eu une erreur et j'obtiens maintenant 330.7211540144080 .... Une vérification approfondie suggère que la matrice de transition est correcte.
whuber
@whuber: Merci, c'est en effet une possibilité. J'ai essayé de trouver un argument de couplage pour déterminer la vitesse à la stationnarité, mais je n'ai pas pu. Une simulation de Monte Carlo avec le processus d'origine m'a donné 333,96 sur 10 répliques et 57 heures de calcul. Sans autre garantie de précision.
Xi'an
1
Voici mon raisonnement. La matrice de transition pour les 50 étapes est la 50e puissance de la matrice de transition, d'où ses valeurs propres sont les 50e puissances des valeurs propres. Seuls les vecteurs propres correspondant à des valeurs dont les 50 puissances ont une taille appréciable apparaîtront comme composants à la fin de vos 50 étapes. De plus, ces 50e puissances nous renseignent sur l'erreur relative commise en s'arrêtant à la 50e étape plutôt qu'en atteignant véritablement un état stationnaire.
whuber
1
900×900
4

Une approche analytique peut être fastidieuse et je n'ai pas réfléchi aux subtilités mais voici une approche que vous voudrez peut-être envisager. Puisque vous êtes intéressé par le nombre attendu de cellules qui sont vides après 50 anneaux, vous devez définir une chaîne de Markov sur le "Non des puces dans une cellule" plutôt que la position d'une puce (Voir la réponse de Glen_b qui modélise la position de une puce comme une chaîne de Markov. Comme l'a souligné Andy dans les commentaires de cette réponse, cette approche peut ne pas obtenir ce que vous voulez.)

Plus précisément, laissez:

njej(t)jej

Ensuite, la chaîne markov commence avec l'état suivant:

njej(0)=1jej

Depuis, les puces se déplacent vers l'une des quatre cellules adjacentes, l'état d'une cellule change en fonction du nombre de puces présentes dans la cellule cible et du nombre de puces présentes dans les quatre cellules adjacentes et de la probabilité qu'elles se déplacent vers cette cellule. En utilisant cette observation, vous pouvez écrire les probabilités de transition d'état pour chaque cellule en fonction de l'état de cette cellule et de l'état des cellules adjacentes.

Si vous le souhaitez, je peux développer la réponse plus loin, mais ceci avec une introduction de base aux chaînes markov devrait vous aider à démarrer.

Communauté
la source
1
njej
@whuber Non, vous n'avez pas besoin de maintenir une position de puce en tant que chaîne markov. Pensez à ce que je propose comme marche aléatoire pour une cellule. Une cellule est initialement à la position «1» à partir de laquelle elle peut aller à 0, 1, 2, 3, 4 ou 5. La probabilité de transition d'état dépend des états des cellules adjacentes. Ainsi, la chaîne proposée est sur un espace d'état redéfini (celui du nombre de cellules pour chaque cellule) plutôt que sur la position de la puce elle-même. Cela a-t-il du sens?
1
Cela a du sens, mais cela semble être un pas en arrière, car le nombre d'États n'est-il pas maintenant beaucoup plus important? Dans un modèle, il y a 900 états - la position d'une seule puce - et pas plus de quatre transitions pour chacun. Le calcul ne doit être effectué que pour une seule puce, car ils se déplacent tous indépendamment. Dans le vôtre, il semble qu'un état soit décrit par l'occupation d'une cellule ainsi que par l'occupation de ses quatre voisins. Ce serait un nombre extrêmement élevé d'États et également un très grand nombre de transitions entre les États. Je dois me méprendre sur ce qu'est votre nouvel espace d'État.
whuber
{njej}
2

si vous allez emprunter la voie numérique, une simple constatation: le problème semble soumis à la parité rouge-noir (une puce sur un carré rouge se déplace toujours vers un carré noir, et vice-versa). Cela peut aider à réduire la taille de votre problème de moitié (pensez à deux mouvements à la fois et ne regardez que les puces sur les carrés rouges, par exemple).

shabbychef
la source
1
Voilà une belle observation. Cependant, je l'ai trouvé plus gênant qu'il ne vaut la peine d'exploiter cela explicitement. La majeure partie de la programmation revient à mettre en place la matrice de transition. Une fois que vous avez fait cela, mettez-le au carré et travaillez avec cela. En utilisant des matrices clairsemées, la suppression de la moitié des zéros ne fait pas gagner de temps de toute façon.
whuber
@whuber: Je soupçonne que le but de ces problèmes est d'apprendre des techniques de résolution de problèmes, plutôt que de consommer beaucoup de cycles de calcul. La symétrie, la parité, etc., sont des techniques classiques du livre de Larson sur la résolution de problèmes.
shabbychef
1
C'est un bon point. En fin de compte, un certain jugement est nécessaire. Le projet Euler semble mettre l'accent sur les compromis entre la compréhension mathématique et l'efficacité informatique. Glen_b a mentionné les symétries qui valent la peine d'être exploitées en premier car il y a plus à en tirer. De plus, en utilisant l'arithmétique à matrice clairsemée, vous obtiendrez automatiquement le double gain (que vous soyez conscient de la parité ou non!).
whuber
1

Je soupçonne qu'une certaine connaissance des chaînes de Markov à temps discret pourrait s'avérer utile.

Simon Byrne
la source
3
Cela aurait dû être un commentaire, mais je pense que nous pouvons le faire à ce stade.
gung - Rétablir Monica
Cela est automatiquement signalé comme de faible qualité, probablement parce qu'il est si court. Pouvez-vous développer cela?
gung - Rétablir Monica
Je ne vois pas pourquoi: la question demande des sujets qui pourraient être utiles, et c'est le sujet qui à mon avis est le plus pertinent.
Simon Byrne
1
Cela a été signalé comme de faible qualité . J'ai voté que c'était OK. Si vous regardez les autres réponses à ce fil, elles sont toutes considérablement plus longues. Les normes ont évolué avec le temps, mais aujourd'hui, cela serait considéré comme un commentaire, même s'il mentionne un "sujet qui pourrait être utile". Comme je l'ai dit, je pensais que cela pouvait être protégé tel quel. Que vous essayiez de l'étendre, cela dépend de vous. Je voulais juste te le faire savoir.
gung - Rétablir Monica