…esto no es un subtítulo…
2013-09-08
Hace varios artículos, planteamos un interesante proyecto: una pequeña biblioteca para construir autómatas celulares. Los autómatas celulares son unas estructuras matemáticas muy curiosas: retículos de celdas que van cambiando de un estado a otro y que pueden, a partir de reglas sencillas, exhibir complejísimos comportamientos emergentes. Como práctica, nuestra biblioteca estará hecha en Scheme R5RS y en Python 2. El enfoque es funcional porque el problema se presta mucho a ello. No nos preocuparemos tanto por hacer un código especialmente rápido como por hacerlo claro y conciso.
Tenemos una biblioteca de autómatas celulares que empieza a ser muy potente. ¡Probemos unos pocos autómatas elementales!
Vamos a repetir el experimento de la regla 90 que
hicimos en
el segundo artículo de la serie. Partiremos, como aquella vez, de
una celda activa (de estado 1) centrada y rodeada de celdas inactivas;
imprimiremos asteriscos para mostrar celdas activas y espacios en
blanco para mostrar celdas inactivas. El código es así:
(interactive-step (wolfram-rule 90)
(append (repeat 0 10) (list 1) (repeat 0 10))
cyclic-elementary-neighbourhoods
(lambda (cells)
(translate-and-display-1d cells " *")))
Esto es en Scheme. En Python, es así:
interactive_step(wolfram_rule(90),
[0] * 10 + [1] + [0] * 10,
cyclic_elementary_neighbourhoods,
lambda cells: translate_and_display_1d(cells, " *"))
En cualquiera de los dos casos, tras unas cuantas iteraciones,
reproducimos una forma que recuerda a un triángulo de Sierpinski. Es
como si hubiéramos llegado al final del fractal en un mundo discreto y
a partir de allí, de una esquinita, nos alejáramos más y más. Las
primeras líneas tienen este aspecto:
*
* *
* *
* * * *
* *
* * * *
* * * *
* * * * * * * *
* *
* * * *
* * * *
Esto tiene la siguiente pinta visto desde lejos:
Ejemplo de evolución mediante la regla 90.
La regla 30 produce hermosos resultados de apariencia aleatoria.
Si partimos, como antes, de un punto central,
(interactive-step (wolfram-rule 30)
(append (repeat 0 10) (list 1) (repeat 0 10))
cyclic-elementary-neighbourhoods
(lambda (cells)
(translate-and-display-1d cells " *")))
,
el resultado no es muy impresionante:
*
***
** *
** ****
** * *
** **** ***
** * * *
** **** ******
** * *** *
** **** ** * ***
** * * **** ** *
Esto es muy pequeño. La siguiente imagen tiene más líneas:
Ejemplo de evolución mediante la regla 30.
En la regla 110, el estado de la celda a la derecha es ignorado.
Podemos probar con una celda encendida en el punto situado más a la
derecha:
(interactive-step (wolfram-rule 110)
(append (repeat 0 19) (list 1))
cyclic-elementary-neighbourhoods
(lambda (cells)
(translate-and-display-1d cells " *")))
Las primeras generaciones salen así:
*
**
***
** *
*****
** *
*** **
** * ***
******* *
** ***
*** ** *
** * *****
***** ** *
** * *** **
*** **** * ***
** * ** ***** *
******** ** ***
** **** ** *
*** ** * *****
** * *** **** *
Visto desde más lejos, tenemos el siguiente resultado:
Ejemplo de evolución mediante la regla 110.
Esta regla da lugar a patrones ondulatorios que avanzan hacia la derecha como ondas planas. La siguiente imagen muestra el resultado a partir de un estado inicial aleatorio:
Ejemplo de evolución mediante la regla 11.
Categorías: Informática
Permalink: https://sgcg.es/articulos/2013/09/08/jugando-con-automatas-celulares-11/