Autómatas Celulares y el juego de la vida en Mathematica

Mathematica puede manejar autómatas celulares, la función Cellular Automaton permite hacer uso de los mismos e incluye un conjunto de reglas prefabricadas para un sistema unidimensional.

ArrayPlot[CellularAutomaton[150, {{1}, 0}, 200]]

Muestra el gráfico del resultado, con cada punto negro como un 1 y cada punto blanco es un 0. En este caso está usando la regla número 150 e iniciando el grid con una celda encendida. En este segundo argumento se pueden poner condiciones iniciales diversas como una lista de unos y ceros (e.g. {0,0,0,1,1,0,0}). El tercer argumento es el número de iteraciones que va a realizar.

rule150

En este caso se realizaron 200 iteraciones y se puede ver que la regla 150 tiene un patrón regular. Sin embargo los resultados son muy diversos y dependiendo de la regla que se utilice varían. En total hay 265 reglas, el número de la regla es una ingeniosa etiqueta establecida por cual de las 8 diferentes posiciones de la regla está activa, cada una tiene un número asignado y la suma de los números genera una etiqueta única. En el caso de la regla 110 se puede observar un patrón aleatorio:

Regla110Autómata
Regla110Autómata

 

Y también existen reglas como la 30 que generan patrones si bien regulares mas bien un tanto complejos:

Regla 30 de autómata celular con 70 iteraciones
Regla 30 de autómata celular con 70 iteraciones

 

Cuando realmente se puede poner interesante el asunto es en la realización de reglas propias. Aquí voy a recontruir el conocido “juego de la vida”. En este juego las reglas son muy sencillas, se tiene un plano de 2 dimensiones (un flatland) en el que cada célula muerta cobra vida si tiene como vecinos (dentro de sus ochos posibilidades) a exactamente 3 células vivas y una célula viva muere si tiene menos de 2 células vivas como vecinas. Con este conjunto sencillo de reglas binarias se pueden obtener resultados interestantísimos. La forma de visualizarlos en Mathematica sería:

GameofLife = {224, {2, {{2, 2, 2}, {2, 1, 2}, {2, 2, 2}}}, {1, 1}};
 ArrayPlot[#, ImageSize -> 90, Mesh -> True] & /@ 
  CellularAutomaton[
   GameofLife, {{{0, 0, 0}, {0, 1, 1}, {1, 1, 0}, {0, 1, 0}}, 0}, 30]

Donde al inicio declaramos la variable GameofLife, que serán las reglas específicas para el juego de la vida. En seguida se usa un código similar al que usamos anteriormente, sólo que aquí las condiciones iniciales se establecen en una matriz. En este caso la matriz muestra una figurita con 5 puntos activos:

Juego de la vida con comportamiento creciente
Juego de la vida con comportamiento creciente

En este caso el resultado que muestra es fascinante, el objeto parece ir cobrando vida propia.

En verdad se necesitan reglas muy simples para dar explicaciones de fenómenos muy complejos.  Incluso la explicación de la vida misma puede ser entendida en términos de interacciones con reglas súper sencillas. Este tipo de modelos nos pueden ayudar a entender que la existencia de un diseñador no es requerida para dar explicación a la mayoría si no es que a cualquier fenómeno.

Juego de la vida. Marius.
Juego de la vida. Marius.

 

Estadística Básica con Mathematica

En este post mostraré el uso de los estadísticos mas básicos y las funciones para llamarlos en Mathematica.

Para esto he creado dos variables sencillas, bSales y bPrice, suponiendo que se trata de ventas en MXN o USD (es irrelevante) o bien podrían ser unidades vendidas al precio bPrice, que definitivamente si tiene que estar en unidades monetarias.

bSales = {100, 80, 63, 45, 21};
 bPrice = {1, 2, 3, 4, 5};

Estos dos vectores muy sencillos nos ayudarán a dar un ejemplo de las funciones incluidas en Mathematica para estadística. Lo que haré será usarlas todas y luego usaré las fórmulas para verificar su veracidad (no es que dude de lo que los de Wolfram hayan programado, simplemente es buena idea y puede resultar bastante didáctico).

Mean[bSales] // N
 Variance[bSales] // N
 StandardDeviation[bSales] // N
 Covariance[bSales, bPrice] // N
 Correlation[bSales, bPrice] // N

Y sus respectivos outputs:

61.8
934.7
30.5729
-48.25
-0.998139

Hay que notar que he puesto al final de todas las funciones N, para poder mostrar el dato en modo numérico. Y bien, primero comprobamos la media, esto es bastante sencillo:

mean = Sum[bSales[[i]], {i, 1, Length[bSales]}]/Length[bSales] // N

Que es la suma de las Xi de 1 a n (mido las unidades del vector con Lenght) todo esto sobre n. La función Sum hace super fácil hacer este programita, sin tener que llegar a usar un For o algo por el estilo, simplemente hay que saberle indicar el tamaño de la suma, lo cual se hace en el segundo argumento de la función. Note que he usado bSales[[i]], que es lo mismo que Part[bSales,i] o el iésimo elemento del vector.

Uso una forma similar para la varianza:

variance = 
  Sum[(bSales[[i]] - mean)^2, {i, 1, Length[bSales]}]/(Length[bSales] - 1)

Y hay que notar que aquí se usa n-1, es decir, es la varianza muestral.

Para la desviación estándar la pereza me ha invadido y simplemente le he sacado raíz cuadrada a la varianza:

sd = Sqrt[variance]

La covarianza usa un proceso similar, hay que recordar que la fórmula de la covarianza es, en palabras, la suma de 1 a n de los productos de las diferencias entre el iésimo elemento y su media, todo esto sobre n-1:

covariance = 
  Sum[(bSales[[i]] - mean)*(bPrice[[i]] - Mean[bPrice]), {i, 1, 
     Length[bSales]}]/(Length[bPrice] - 1)

Como no he realizado la fórmula de la media del precio he usado la función de Mathematica, ya que ya comprobamos que si da lo mismo. Hice lo mismo para la desviación estándar del precio al sacar la correlación:

correlation = covariance/(sd*StandardDeviation[bPrice])