¿Cómo se debe abordar el problema 213 del Proyecto Euler (“Flea Circus”)?

11

Me gustaría resolver el Proyecto Euler 213 pero no sé por dónde empezar porque soy un laico en el campo de la Estadística, tenga en cuenta que se requiere una respuesta precisa para que el método Monte Carlo no funcione. ¿Podría recomendarme algunos temas de estadísticas para que los lea? No publique la solución aquí.

Circo de pulgas

Una cuadrícula de cuadrados de 30 × 30 contiene 900 pulgas, inicialmente una pulga por cuadrado. Cuando se toca una campana, cada pulga salta a un cuadrado adyacente al azar (generalmente 4 posibilidades, excepto las pulgas en el borde de la cuadrícula o en las esquinas).

¿Cuál es el número esperado de cuadrados desocupados después de 50 anillos de la campana? Da tu respuesta redondeada a seis decimales.

grokus
fuente
77
Los métodos de Monte Carlo pueden dar respuestas muy precisas siempre que haga suficientes simulaciones.
Rob Hyndman el
3
Si desea una solución de programación, un monte carlo es el único enfoque. No veo ninguna razón por la que no obtendrá respuestas precisas con Monte Carlo. Una solución matemática / analítica puede no ser fácil.
He visto discusiones sobre Montecarlo y la gente dice que si quieres alcanzar 6 decimales, tomará demasiado tiempo, o tal vez estoy confundido con otros problemas similares. Dado que es bastante fácil codificar un enfoque de Monte Carlo, creo que valdrá la pena intentarlo primero.
grokus
44
No disputo ninguna de las tres respuestas anteriores, pero el análisis (simple) en la respuesta que he ofrecido pone estos comentarios en perspectiva: si desea una precisión de seis decimales para una estimación de un número que será de cientos, La simulación de Monte Carlo tomará al menos un año en una máquina con 10,000 CPU funcionando en paralelo.
whuber
¿Están atrapadas todas las pulgas (es decir, el problema se trata realmente de cuadrados con más de una pulga) o se trata de pulgas en los bordes saltando y desapareciendo?
MissMonicaE

Respuestas:

10

Tienes razón; Monte Carlo es impracticable. (En una simulación ingenua, es decir, una que reproduzca exactamente la situación del problema sin ninguna simplificación, cada iteración implicaría 900 movimientos de pulgas. Una estimación cruda de la proporción de celdas vacías es , lo que implica la varianza del Monte -Carlo estima después de tales iteraciones es aproximadamente Para precisar la respuesta a seis decimales, necesitaría estimarla dentro de 5.E -7 y, para lograr una confianza de 95 +% (digamos), tendrías que reducir a la mitad aproximadamente esa precisión a 2.5E-7. Resolver daN 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. Eso sería alrededor de 3.6E15 movimientos de pulgas, cada uno con varios tics de una CPU. Con una CPU moderna disponible, necesitará un año completo de computación (altamente eficiente). Y he asumido de manera algo incorrecta y demasiado optimista que la respuesta se da como una proporción en lugar de un recuento: como recuento, necesitará tres cifras más significativas, lo que implica un aumento de un millón de veces en el cómputo ... ¿Puede esperar mucho tiempo?)

En cuanto a una solución analítica, hay algunas simplificaciones disponibles. (También se pueden usar para acortar un cálculo de Monte Carlo). El número esperado de celdas vacías es la suma de las probabilidades de vacío sobre todas las celdas. Para encontrar esto, podría calcular la distribución de probabilidad de los números de ocupación de cada celda. Esas distribuciones se obtienen sumando las contribuciones (¡independientes!) De cada pulga. Esto reduce su problema a encontrar el número de caminos de longitud 50 a lo largo de una cuadrícula de 30 por 30 entre cualquier par de celdas en esa cuadrícula (una es el origen de la pulga y la otra es una celda para la que desea calcular la probabilidad de ocupación de pulgas).

whuber
fuente
2
Solo por diversión, hice un cálculo de fuerza bruta en Mathematica. Su respuesta es una relación de un entero de 21,574 dígitos a un entero de 21,571 dígitos; como decimal, se acerca cómodamente a 900 / e como se esperaba (pero, dado que se nos pide que no publiquemos una solución, no daré más detalles).
whuber
6

¿No podría recorrer las probabilidades de ocupación de las células para cada pulga? Es decir, la pulga k está inicialmente en la celda (i (k), j (k)) con probabilidad 1. Después de 1 iteración, tiene probabilidad 1/4 en cada una de las 4 celdas adyacentes (suponiendo que no esté en un borde o en una esquina). Luego, en la siguiente iteración, cada uno de esos cuartos se "mancha" a su vez. Después de 50 iteraciones, tiene una matriz de probabilidades de ocupación para la pulga k. Repita sobre las 900 pulgas (si aprovecha las simetrías, esto se reduce en casi un factor de 8) y agregue las probabilidades (no necesita almacenarlas todas a la vez, solo la matriz de la pulga actual (hmm, a menos que esté muy inteligente, es posible que desee una matriz de trabajo adicional) y la suma actual de matrices). Me parece que hay muchas maneras de acelerar esto aquí y allá.

Esto no implica simulación alguna. Sin embargo, implica bastante cálculo; No debería ser muy difícil calcular el tamaño de simulación requerido para dar las respuestas con una precisión algo mejor que 6 dp con alta probabilidad y determinar qué enfoque será más rápido. Espero que este enfoque supere la simulación por algún margen.

Glen_b -Reinstate a Monica
fuente
2
Estás respondiendo una pregunta un poco diferente a la pregunta. La pregunta es preguntar el número esperado de celdas que estarían vacías después de 50 saltos. Corrígeme si me equivoco, pero no veo un camino directo desde la probabilidad de que una pulga termine en un cierto cuadrado después de 50 saltos a la respuesta cuántas células se esperaría que estuvieran vacías.
Andy W
1
@Andy W - gran comentario; Sin embargo, Monte Carlo se puede utilizar para hacer este último paso ;-)
44
@ Andy W: En realidad, la parte difícil fue obtener todas esas probabilidades. En lugar de agregarlos en cada celda, multiplique sus complementos: esa es la probabilidad de que la celda esté vacía. La suma de estos valores en todas las celdas da la respuesta. El enfoque de Glen_b supera la simulación en siete u ocho órdenes de magnitud ;-).
whuber
@whuber, gracias por la explicación. De hecho, obtener esas probabilidades en menos de un minuto sería un desafío. Es un rompecabezas divertido y gracias por tu aporte.
Andy W
5

Si bien no me opongo a la imposibilidad práctica (o impracticabilidad) de una resolución de Monte Carlo de este problema con una precisión de 6 decimales señalada por whuber , creo que se puede lograr una resolución con seis dígitos de precisión.

Primero, siguiendo a Glen_b , las partículas son intercambiables en un régimen estacionario, por lo tanto, es suficiente (como suficiente ) para monitorear la ocupación de las diferentes células, ya que esto también constituye un proceso de Markov. La distribución de las ocupaciones en el siguiente paso de tiempo se completa determinada por las ocupaciones en el momento actual . Escribir la matriz de transición definitivamente no es práctico, pero simular la transición es sencillo.t Kt+1tK

En segundo lugar, como lo señala shabbychef , se puede seguir el proceso de ocupación en los 450 cuadrados impares (o pares), que permanece en los cuadrados impares cuando solo se consideran los tiempos pares, es decir, la matriz de Markov al cuadrado .K2

Tercero, el problema original solo considera la frecuencia de cero ocupaciones, , después de transiciones de Markov. Dado que el punto de partida tiene un valor muy alto para la distribución de probabilidad estacionaria de la cadena de Markov , y dado ese enfoque en un promedio único en todas las celdas, podemos considerar que la realización de la cadena en el tiempo es una realización de la distribución de probabilidad estacionaria. Esto trae una reducción importante al costo de computación, ya que podemos simular directamente desde esta distribución estacionaria50(X(t)) p 0=1p^050(X(t))(X(t))t=50π

p^0=1450i=1450I0(Xi(50))
(X(t))t=50π, que es una distribución multinomial con probabilidades proporcionales a 2, 3 y 4 en la esquina par, otras celdas en el borde y celdas internas, respectivamente.

Obviamente, la distribución estacionaria proporciona directamente el número esperado de celdas vacías como igual a ,166.1069

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

que está bastante cerca de una aproximación de Monte Carlo de [basada en simulaciones de 10⁸, que tomó 14 horas en mi máquina]. Pero no lo suficientemente cerca para 6 decimales.166.11

Como comentó Whuber , las estimaciones deben multiplicarse por 2 para responder correctamente a la pregunta, por lo tanto, un valor final de 332.2137,

Xi'an
fuente
1
+1 Muy perspicaz. Creo que necesita duplicar su respuesta final, porque la pregunta se refiere a las 900 celdas.
whuber
1
Creo que podría estar comenzando más lejos de la distribución estacionaria de lo que piensa. Los cálculos de fuerza bruta que hice originalmente calcularon la potencia número 50 de la matriz de transición usando aritmética exacta (racional). De ella obtuve un valor de 330.4725035083710 .... Quizás cometí un error ... Tuve un error y ahora obtengo 330.7211540144080 ... Una verificación exhaustiva sugiere que la matriz de transición es correcta.
whuber
@whuber: Gracias, de hecho es una posibilidad. Traté de encontrar un argumento de acoplamiento para determinar la velocidad de la estacionariedad, pero no pude. Una simulación de Monte Carlo con el proceso original me dio 333.96 más de 10⁶ réplicas y 57 horas de cálculo. Sin más garantía sobre la precisión.
Xi'an
1
Aquí está mi razonamiento. La matriz de transición para los 50 pasos es la potencia número 50 de la matriz de transición, de donde sus valores propios son las potencias número 50 de los valores propios. Solo los vectores propios correspondientes a valores cuyas potencias 50 sean de cualquier tamaño apreciable aparecerán como componentes al final de sus 50 pasos. Además, esos 50 poderes nos informan sobre el error relativo cometido al detenerse en el paso 50 en lugar de alcanzar verdaderamente un estado estable.
whuber
1
De hecho, estoy usando la matriz de transición completa . 900×900
whuber
4

Un enfoque analítico puede ser tedioso y no he pensado en las complejidades, pero aquí hay un enfoque que puede considerar. Como está interesado en el número esperado de celdas que están vacías después de 50 anillos, debe definir una cadena de markov sobre el "No de las pulgas en una celda" en lugar de la posición de una pulga (consulte la respuesta de Glen_b que modela la posición de una pulga como una cadena de markov. Como señaló Andy en los comentarios a esa respuesta, es posible que ese enfoque no obtenga lo que desea).

Específicamente, deje:

i jnij(t) sea ​​el número de pulgas en una celda en la fila y la columna .ij

Entonces la cadena de Markov comienza con el siguiente estado:

i jnij(0)=1 para todos y .ij

Como las pulgas se mueven a una de las cuatro celdas adyacentes, el estado de una celda cambia dependiendo de cuántas pulgas hay en la celda objetivo y cuántas pulgas hay en las cuatro celdas adyacentes y la probabilidad de que se muevan a esa celda. Usando esta observación, puede escribir las probabilidades de transición de estado para cada celda en función del estado de esa celda y el estado de las celdas adyacentes.

Si lo desea, puedo ampliar la respuesta aún más, pero esto junto con una introducción básica a las cadenas de Markov debería ayudarlo a comenzar.

Comunidad
fuente
1
nij
@whuber No, no necesitas mantener una posición de pulgas como una cadena de markov. Piensa en lo que estoy proponiendo como una caminata aleatoria para una celda. Inicialmente, una celda está en la posición '1' desde donde puede ir a 0, 1, 2, 3, 4 o 5. La probabilidad de transición de estado depende de los estados de las celdas adyacentes. Por lo tanto, la cadena propuesta es un espacio de estado redefinido (el de los recuentos de células para cada célula) en lugar de la posición de la pulga en sí. ¿Tiene sentido?
1
Tiene sentido, pero parece un paso atrás, porque ¿no es el número de estados ahora mucho mayor? En un modelo hay 900 estados, la posición de una sola pulga, y no más de cuatro transiciones de cada uno. El cálculo solo debe hacerse para una sola pulga porque todas se mueven de forma independiente. En el suyo, parece que un estado se describe por la ocupación de una celda junto con la ocupación de sus hasta cuatro vecinos. Esa sería una cantidad extremadamente grande de estados y también una gran cantidad de transiciones entre los estados. Debo estar malentendiendo cuál es su nuevo espacio de estado.
whuber
@whuber Ahora veo el problema. Creo que mi propuesta equivale a definir una cadena de Markov en el estado de la cuadrícula. Defina el estado de la cuadrícula como . Luego tenemos una cadena de Markov en el estado de la cuadrícula, ya que los recuentos de todas las celdas en cualquier período de tiempo dependen de los recuentos de todas las celdas en el período de tiempo anterior. Estoy de acuerdo con usted, esta es una propuesta poco práctica ya que el espacio de estado aumenta dramáticamente. {nij}
2

si va a seguir la ruta numérica, una simple observación: el problema parece estar sujeto a la paridad rojo-negra (una pulga en un cuadrado rojo siempre se mueve a un cuadrado negro, y viceversa). Esto puede ayudar a reducir el tamaño del problema a la mitad (solo considere dos movimientos a la vez, y solo observe las pulgas en los cuadrados rojos, por ejemplo).

shabbychef
fuente
1
Esa es una buena observación. Sin embargo, me pareció más molesto de lo que vale la pena explotar esto explícitamente. La mayor parte de la programación equivale a configurar la matriz de transición. Una vez que hagas eso, simplemente cuadrátalo y trabaja con eso. Al usar matrices dispersas, eliminar la mitad de los ceros no ahorra tiempo de todos modos.
whuber
@whuber: Sospecho que el punto de estos problemas es aprender técnicas de resolución de problemas, en lugar de consumir muchos ciclos computacionales. La simetría, la paridad, etc., son técnicas clásicas del libro de Larson sobre resolución de problemas.
shabbychef
1
Ese es un buen punto. En última instancia, se necesita algo de juicio. El Proyecto Euler parece enfatizar las compensaciones entre la comprensión matemática y la eficiencia computacional. Glen_b mencionó las simetrías que vale la pena explotar primero porque hay más que obtener de ellas. Además, mediante el uso de la aritmética de matriz dispersa, obtendrá automáticamente el doble de ganancia (¡ya sea que conozca la paridad o no!).
whuber
1

Sospecho que algún conocimiento de las cadenas de Markov de tiempo discreto podría resultar útil.

Simon Byrne
fuente
3
Esto debería haber sido un comentario, pero creo que podemos abuelo en este punto.
gung - Restablece a Monica
Esto se marca automáticamente como de baja calidad, probablemente porque es muy corto. ¿Puedes ampliarlo?
gung - Restablece a Monica
No veo por qué: la pregunta pide temas que podrían ser útiles, y este es el tema que en mi opinión es más relevante.
Simon Byrne
1
Esto fue marcado como de baja calidad . Voté que estaba bien. Si nos fijamos en las otras respuestas a este hilo, todas son considerablemente más largas. Los estándares han evolucionado con el tiempo, pero hoy en día, esto se consideraría un comentario, incluso si menciona un "tema que podría ser útil". Como dije, pensé que esto podría estar exento como está. Si intentas expandirlo, depende de ti. Solo te estaba haciendo saber.
gung - Restablece a Monica