Primera publicación en Math Stackexchange. Recientemente se me planteó un desafío de programación informática matemáticamente intensivo que no sé cómo resolver. Para brindarle información sobre mi experiencia en matemáticas, soy un estudiante de último año de física y de ciencias de la computación en la universidad y recientemente completé un curso de álgebra lineal además de haber tomado calc 1, 2, cálculo multivariado y diff eq. Tengo una pequeña experiencia con matemáticas discretas y teoría de números de un curso de introducción a la informática. He aplicado cursos de álgebra lineal, matemáticas discretas y codificación algebraica programados para los próximos 6 meses, pero no estoy seguro si cubriré el material para resolver mi problema. Esperaría hasta después de tomar los cursos para ver si puedo aplicar algo nuevo, pero este problema me ha estado volviendo loco.
No estoy necesariamente buscando una solución, sino algunas áreas para investigar que pueden ayudarme a resolverlo. Si necesita más información o explicación, hágamelo saber. El problema es el siguiente:
A partir de los escaneos de la nebulosa, descubrió que es muy plana y está distribuida en distintos parches, por lo que puede modelarla como una cuadrícula 2D. Encuentra que la existencia actual de gas en una celda de la red está determinada exactamente por sus 4 celdas cercanas, específicamente, (1) esa celda, (2) la celda debajo de ella, (3) la celda a la derecha de ella, y (4) la celda de abajo ya la derecha de la misma. Si, en el estado actual, exactamente 1 de esas 4 celdas en el bloque 2x2 tiene gas, entonces también tendrá gas en el siguiente estado. De lo contrario, la celda estará vacía en el siguiente estado.
Por ejemplo, digamos que el estado anterior de la grilla (p) era:
.O.. ..O. ...O O...
Para ver cómo cambiará esta cuadrícula para convertirse en la cuadrícula actual (c) en el siguiente paso de tiempo, considere los bloques de celdas de 2x2 alrededor de cada celda. Del bloque 2x2 de [p[0][0], p[0][1], p[1][0], p[1][1]], solo p[0][1] tiene gas en lo que significa que este bloque 2x2 se convertiría en la celda c[0][0] con gas en el siguiente paso de tiempo:
.O -> O ..
Del mismo modo, en el siguiente bloque de 2x2 a la derecha que consta de [p[0][1], p[0][2], p[1][1], p[1][2]], dos de los que contienen las celdas tienen gas, por lo que en el siguiente estado de la red, c[0][1] NO tendrá gas:
O. -> . .O
Siguiendo este patrón hasta su conclusión, a partir del estado anterior p, el estado actual de la grilla c será:
O.O .O. O.O
Tenga en cuenta que la salida resultante tendrá 1 fila y columna menos, ya que las celdas inferiores y más a la derecha no tienen una celda debajo y a la derecha de ellas, respectivamente.
Escriba una función
answer(g)
dondeg
haya una matriz de matrices de booleanos que indiquen si hay gas en cada celda (el escaneo actual de la nebulosa) y devuelva un int con la cantidad de posibles estados previos que podrían haber resultado en esa cuadrícula después de 1 paso de tiempo . Por ejemplo, si a la función se le diera el estado actualc
anterior, se deduciría que los posibles estados anteriores eranp
(dados arriba) así como sus reflejos horizontales y verticales, y devolvería 4. El ancho de la cuadrícula estará entre 3 y 50 inclusive, y la altura de la grilla estará entre 3 y 9 inclusive. La respuesta siempre será menos de mil millones (10^9).Inputs: (boolean) g = [ [true, false, true], [false, true, false], [true, false, true] ] Output: (int) 4 Inputs: (boolean) g = [ [true, false, true, false, false, true, true, true], [true, false, true, false, false, false, true, false], [true, true, true, false, false, false, true, false], [true, false, true, false, false, false, true, false], [true, false, true, false, false, true, true, true] ] Output: (int) 254 Inputs: (boolean) g = [ [true, true, false, true, false, true, false, true, true, false], [true, true, false, false, false, false, true, true, true, false], [true, true, false, false, false, false, false, false, false, true], [false, true, false, false, false, false, true, true, false, false] ] Output: (int) 11567
He investigado la teoría de la codificación, pero no creo que esto entre en ninguna de esas categorías. He explorado opciones en procesamiento de imágenes con enmascaramiento de bits y autómatas celulares. Lo más cerca que he llegado a una solución es investigando los autómatas celulares 2D del vecindario de Margolus. Como esto no es reversible por definición, no he encontrado una solución ni un método general para encontrar una solución. Solo tengo curiosidad por dónde debo mirar. Sé que esto tiene que tener una respuesta derivada de un campo de las matemáticas, pero no se parece a nada de lo que sé actualmente.
esta es claramente una pregunta de autómata celular (CA). Tiene que ver con calcular el número de preimágenes de una cierta regla CA de tamaño 2x2 dentro de una matriz rectangular finita. Piense en cómo intentaría construir tales preimágenes. La entrada (configuración actual) es una matriz de tamaño NxM con valores 0 y 1 (verdadero y falso si lo prefiere). Entonces, las preimágenes (es decir, configuraciones de un paso de tiempo en el pasado) tienen un tamaño (N+1)x(M+1) también con valores 0 y 1. Ahora, ¿cuál es la regla local de evolución de una configuración a la siguiente? Tiene que ver con los valores de cuatro celdas adyacentes que determinan el nuevo valor de una celda. Intente hacer un pequeño ejemplo a mano, por ejemplo, dada la entrada 3x3 g de su publicación. ¿Puedes encontrar las cuatro configuraciones de preimagen paso a paso? Piense en lo que significa especificar algunas de las celdas en la preimagen (p. ej.
En general, encontrar preimágenes de CA (o incluso determinar su número) es un problema difícil, pero en el caso de configuraciones finitas y esta regla de evolución específica, una computadora puede manejarlas. Hay un algoritmo de fuerza bruta que debería funcionar bien para los tamaños de entrada especificados, pero también hay un algoritmo más inteligente/elaborado para ahorrar mucho tiempo, especialmente si su entrada es un rectángulo bastante largo pero angosto.
Espero que estos comentarios te den algunas ideas sobre cómo atacar el problema. Si necesitas más detalles, házmelo saber.
postmortes
Kyle
Vórtice