En este video:
Autómatas celulares y regla 30
Stephen Wolfram habla de un autómata celular tan elemental a las 17:01. ¿Alguien tiene una idea de cuál podría estar hablando exactamente?
Hay más detalles, muchos más detalles, en la publicación original de Anunciando los Premios de la Regla 30 en el blog de Stephen Wolfram. En particular, la regla específica se nombra allí:
Aquí hay un ejemplo algo original, encontrado por una búsqueda, de una regla con 4 colores posibles (código totalista 150898). Ejecútelo durante 200 pasos, y la columna central se ve bastante aleatoria:
[Imagen 1]
Después de 500 pasos, todo el patrón todavía se ve bastante aleatorio:
[Imagen 2]
Pero si uno hace zoom alrededor de la columna central, hay algo sorprendente: después de 251 pasos, la columna central parece evolucionar a un valor fijo (o al menos está fijo para más de un millón de pasos):
[Imagen 3]
Resulta que el código de Mathematica para generar las imágenes (y así simular la regla) también está oculto en la publicación del blog; seleccionar y copiar y pegar la primera imagen en la página, por ejemplo, produce el siguiente fragmento de código:
ArrayPlot[
CellularAutomaton[{150898, {4, 1}, 1}, {{1}, 0}, {200, 150 {-1, 1}}],
ColorRules -> {0 -> Hue[0.12, 1, 1], 1 -> Hue[0, 0.73, 0.92],
2 -> Hue[0.13, 0.5, 1], 3 -> Hue[0.17, 0, 1]},
PixelConstrained -> 2, Frame -> False]
Si prefiere no simplemente tratar de averiguar qué hace ese código, creo que la página 60 de ANKoS (de manera molesta, la publicación del blog enlaza con la página 61) describe la convención de Wolfram para numerar las reglas de CA totalistas 1D y cómo decodificarlas y simularlas. Específicamente:
Solo para confirmar que la decodificación y la aplicación de la regla como esta realmente produce una salida que coincide con las imágenes en la publicación del blog, aquí hay un programa de Python simple para simular esta regla en una red envolvente finita:
rule = 150898
states = 4
width = 3
# decode rule number
table = tuple((rule // states**k) % states for k in range(width*(states-1)+1))
# initial cell states
cells = ((0,) * 20) + (1,) + ((0,) * 20)
# transition function
def new_state(i):
neighbors = (cells[(i + j - width // 2) % len(cells)] for j in range(width))
return table[sum(neighbors)]
for t in range(20):
print("".join(str(s) for s in cells))
cells = tuple(new_state(i) for i in range(len(cells)))
Simulando esta regla en una red lo suficientemente ancha, comenzando desde una sola celda 1 en un fondo de 0 celdas, se puede observar que la celda central eventualmente se atasca en el estado 1 mientras que sus vecinos alternan casi aleatoriamente entre los estados 1 y 3. De hecho , examinando el código de la regla de base 4, no es demasiado difícil ver por qué esta configuración particular en el centro de un patrón simétrico es invariable bajo la regla:
Por lo tanto, una vez que las cinco columnas centrales de un patrón centralmente simétrico bajo esta regla terminan en la configuración " " o " ", dónde es cualquier estado y es cualquier estado que no sea 2, no pueden volver a entrar en ninguna configuración que no sea de este tipo.
usuario366820