jueves, 19 de octubre de 2017

Sobre el modelo de red neuronal AlphaGo Zero (de Google DeepMind)

Previous versions of AlphaGo initially trained on thousands of human amateur and professional games to learn how to play Go. AlphaGo Zero skips this step and learns to play simply by playing games against itself, starting from completely random play. In doing so, it quickly surpassed human level of play and defeated the previously published champion-defeating version of AlphaGo by 100 games to 0.
If similar techniques can be applied to other structured problems, such as protein folding, reducing energy consumption or searching for revolutionary new materials, the resulting breakthroughs have the potential to positively impact society. 
(Profesor David Silver)

¡Realmente increíble las implicaciones que tiene este descubrimiento de DeepMind! Su modelo neuronal AlphaGo Zero es capaz de aprender SOLO sin necesitar de datos de ningún tipo (ya no necesita siquiera aprender de jugadas de humanos como su versión anterior); simplemente aprende jugando contra sí mismo. Los chicos de Google DeepMind hablan de un entrenamiento de "tabula rasa" mediante un proceso de Reinforce Learning autónomo (auto-sostenido). Este proceso de entrenamiento consiste en partir de una red neuronal profunda (similar a lo que sería un cerebro con sinapsis aleatorias), y mediante una iteración de entrenamiento autónomo mediante ensayo-error y pequeñas mutaciones esa tabula rasa (esa red neuronal con sinapsis aleatorias) poco a poco va ajustando su estructura hasta lograr sin ninguna ayuda algorítmica humana vencer al mejor jugador mundial de Go. Es decir, que a partir de eso que sería el equivalente computacional de neuronas unidas mediante sinapsis aleatorias, este modelo de red neuronal de DeepMind es capaz en pocas semanas de aprender y finalmente emular (y mejorar) la creatividad y la imaginación necesarias para jugar este juego milenario que ha necesitado de millones de años para su implantación cerebral en el hombre.

¡Además esta mejora de AlphaGo Zero supone que el programa ahora es capaz de vencer siempre (al 100%) a su versión predecesora (que ya era ella por cierto capaz de vencer al mejor jugador del mundo)! Es decir, que han conseguido una mejora no ya sobrehumana, sino exponencialmente mejor que su predecesora...¡y además han logrado disminuir (exponencialmente) los requisitos de hardware necesarios para su funcionamiento!



Realmente la IA general está despegando, y todo apunta a que no hace falta más que un modelo neuronal lo suficientemente grande y profundo, suficiente capacidad computacional, y un entrenamiento y modulación similar a la evolución natural.

Implicaciones reales del proyecto sobre el avance hacia una IA general.

Imagina que eres tú el que está jugando a Go: ¿cómo sabes qué movimiento hacer? Recuerda que en el Go la lógica no es fundamental: hay más jugadas disponibles que átomos en el Universo lo que hace que no sea posible racionalizar las jugadas, cosa que convierte en muy importante el proceso de creatividad, imaginación y sobre todo el instinto. De hecho, un gran maestro humano de Go juega  casi exclusivamente guiado por el instinto: mueve donde CREE que es más adecuado, pero NO sabe racionalmente por qué debe mover en cierto lugar concreto en lugar de en cualquier otro (algo que con el ajedrez por ejemplo NO pasa puesto que es mucho más asequible a la planificación racional).

Otro ejemplo: vas por la calle y ves pasar una chica (o un chico) y sientes atracción por ella (o por él): ¿por qué sientes realmente atracción por esa persona? No lo sabes, sólo sabes que sientes atracción por cierto estereotipo de persona y punto. Un ejemplo más: los artistas y su creatividad. Estos trabajos son frutos de ideas que le "salen" de dentro al artista, pero casi siempre de manera instintiva sin saberse bien cómo ni de donde (por eso hablan metafóricamente de la ayuda de su musa, que es en realidad parte de su subconsciente).

El ser humano tiene por lo tanto muchos comportamientos e ideas que son de origen inconscientes e instintivos, los cuales no tienen ni explicación ni soporte racional directo. Y son precisamente este tipo de comportamientos creativos e imaginativos los que DeepMind está logrando de momento simular con mucho éxito; demostrando  por ejemplo que AlphaGo Zero es capaz de adquirir tales habilidades instintivas con una capacidad sobrehumana (y sin soporte algorítmico humano). Se podría decir en cierta manera que; aunque por ahora sólo en el terreno del Go, este modelo neuronal es capaz de actuar con más creatividad, imaginación e instinto que cualquier jugador humano. Y eso es algo muy revelador del futuro que nos espera en IA.

lunes, 17 de julio de 2017

Usando el modelo de red neuronal de traducción de Google (GNMT)...¡para jugar al ajedrez!

Hace unos días, y para mi gran sorpresa, Google nos hizo el enorme regalo de hacer público el código fuente de su motor de traducción de lenguaje natural más moderno (GNMT): https://github.com/tensorflow/nmt

Así que decidí rápidamente hacer uso de esta maravilla, junto con las mejoras con la que la versión 1.2 de TensorFlow viene cargada, para programar las modificaciones necesarias para poder enfocar el modelo de Google a la traducción...¡de jugadas en el juego del ajedrez! Es decir; que el modelo (con modificaciones mínimas), en lugar de aprender a traducir por ejemplo de español a inglés, será capaz de inferir movimientos de ajedrez válidos (usando la notación algebraica) dado un estado de tablero cualquiera.

El resultado final lo podéis ver (y usar) en el siguiente repositorio de mi cuenta personal en GitHub: https://github.com/Zeta36/Using-Google-Neural-Machine-Translation-for-chess-movements-inference-TensorFlow-.

Pero lo realmente importante sin embargo, es sin duda el hecho de comprender la potencia que tiene el modelo de Google para ser generalizado a cualquier tarea de mapeo que pueda ser tratada y representada de la manera adecuada como para servir como pares de entrada source-target en el entrenamiento supervisado. En este sentido se puede decir que el mismo modelo neuronal que es capaz de traducir entre idiomas, es también capaz de aprender a inferir como realizar tareas que en principio parecen poco relacionadas con  la propia traducción de textos. 

Esto me hace pensar que en realidad con este hecho se está demostrando algo significativo pero ya a un nivel neuronal (humano). Es posible que resultados como el que se demuestran con este tipo de generalizaciones de aprendizaje (y memorización) bajo una misma estructura de red neuronal artificial, sean una pista del modo en que nuestro propio cerebro podría ser capaz de reutilizar una misma zona cerebral para realizar muy diversas tareas de procesamiento. En este sentido no es descabellado a la luz de lo observado que por ejemplo partes de nuestro cerebro que se utilicen para entender y traducir lenguaje natural, sea utilizado también para otras tareas de inferencias totalmente distintas de las lingüísticas (como aprender a jugar al ajedrez, o incluso comprender ciertas ideas matemáticas). Os dejo a continuación con un poco de más información técnica sobre el proyecto que he realizado:

Using (Google) Neural Machine Translation for chess movements inference

Somedays ago a free version of the source code of the GNMT (Google Neural Machine Translation) was release in: https://github.com/tensorflow/nmt by Thang Luong, Eugene Brevdo, Rui Zhao
 

Introduction

Sequence-to-sequence (seq2seq) models (Sutskever et al., 2014, Cho et al., 2014) have enjoyed great success in a variety of tasks such as machine translation, speech recognition, and text summarization.
I've used the release of this seq2seq to show the power of the model. Using a vocabulary with just de numbers and letters (the symbols) used for the chess algebraic notation, I was able to train a model to infer the movement a human would do given a table state.
The supervised learning uses then source-target pairs of the form:
Source: rnq1kb1r/pp11ppp1/11p11n11/1111111p/11111111/11111NPb/PPPP1P1P/RNBQR1KB b
Target: Bg4
The source is the state of the board, and the target the movement a human would do in this situation.
In this way the source vocabulary was:
w
/
1
p
r
n
b
q
k
P
R
N
B
Q
K
and the target vocabulary:
p
r
n
b
q
k
P
R
N
B
Q
K
x
+
O
-
1
2
3
4
5
6
7
8
a
c
d
e
f
g
h
=

Results

Using a NMT + GNMT attention (2 layers) the model was able to reach a good result with:
eval dev: perplexity 2.83 eval test: perplexity 3.07 global training step 72100 lr 0.868126 step-time 0.51s wps 9.57K ppl 2.76 bleu 20.64
This means that, given a board state whatever, the model can predict in a seq2seq way a valid (and usually human) chess movement.

miércoles, 12 de julio de 2017

La magnífica mejora en el sistema de traducción de Google (que ha pasado casi desapercibida)

"Alrededor de dos mil quinientos años atrás, un comerciante mesopotámico reunió arcilla, madera y juncos y cambió la humanidad para siempre. Con el tiempo, su ábaco permitiría a los comerciantes hacer un seguimiento de los bienes y reconciliar sus finanzas, permitiendo que la economía florezca.

Pero ese momento de inspiración también ilumina otra asombrosa habilidad humana: nuestra capacidad de recombinar conceptos existentes e imaginar algo completamente nuevo. El inventor desconocido habría tenido que pensar en el problema que querían resolver, el artefacto que podían construir y las materias primas que podían reunir para crearlo. La arcilla se podría moldear en una tableta, un palillo se podría utilizar para rasguñar las columnas y los juncos pueden actuar como contadores. Cada componente era familiar y distinto, pero juntos en esta nueva forma, formaron algo revolucionario.

Esta idea de "composicionalidad" está en el centro de las capacidades humanas como la creatividad, la imaginación y la comunicación basada en el lenguaje. Equipado con sólo un pequeño número de bloques de construcción conceptuales familiares, somos capaces de crear un gran número de nuevos sobre la marcha. Hacemos esto naturalmente colocando conceptos en jerarquías que van de específico a más general y luego recombinando diferentes partes de la jerarquía de maneras novedosas.

Pero lo que viene tan naturalmente a nosotros, sigue siendo un reto en la investigación de la IA.

En nuestro nuevo artículo , proponemos un nuevo enfoque teórico para abordar este problema. También se demuestra un nuevo componente de red neural denominado Symbol-Concept Association Network (SCAN), que puede, por primera vez, aprender una jerarquía de conceptos visuales conectados de manera que imita la visión humana y la adquisición de palabras, permitiéndole imaginar conceptos novedosos guiado por instrucciones de lenguaje.

Nuestro enfoque difiere de los trabajos previos en esta área, ya que está totalmente basado en los datos sensoriales y aprende de muy pocos pares de "imagen-palabra". Mientras que otros enfoques de aprendizaje profundo requieren miles de ejemplos de imágenes para aprender un concepto, SCAN aprende tanto las primitivas visuales como las abstracciones conceptuales principalmente de observaciones sin supervisión y con tan sólo cinco pares de una imagen y una etiqueta por concepto. Una vez entrenado, SCAN puede generar una lista diversa de conceptos que corresponden a una imagen en particular, e imaginar diversos ejemplos visuales que corresponden a un concepto particular, incluso si nunca ha experimentado el concepto antes.

Esta capacidad de aprender nuevos conceptos mediante la recombinación de los existentes a través de instrucciones simbólicas ha dado a los seres humanos capacidades asombrosas, lo que nos permite razonar sobre conceptos abstractos como el universo, el humanismo o - como fue el caso en Mesopotamia - economía. Mientras que nuestros algoritmos tienen un largo camino por recorrer antes de que puedan hacer tales saltos conceptuales, este trabajo demuestra un primer paso hacia tener algoritmos que pueden aprender de una manera en gran medida sin supervisión, y pensar en abstracciones conceptuales como las utilizadas por los seres humanos."

Este texto que acabo de pegar arriba es la asombrosa conclusión de un nuevo trabajo de Google DeepMind (publicado hoy). Se trata de una traducción parcial del siguiente artículo del blog oficial de la propia compañía de Google: https://deepmind.com/blog/imagine-creating-new-visual-concepts-recombining-familiar-ones/

Pero lo más destacado de todo esto no es quizás el trabajo comentado en sí mismo, sino el hecho de que el texto mostrado antes ha sido totalmente traducido de manera autónoma por el actual motor de IA de Google. No he necesitado hacer ni una sola modificación o corrección al texto devuelto, y si acaso lo que yo quizás pondría sería un "la" delante de donde dice "sobre conceptos abstractos como el universo, el humanismo o - como fue el caso en Mesopotamia - LA economía".

En fin, es evidente que rápidamente nos acostumbramos a lo bueno, y que pocos recuerdan ya las críticas hacia la traducción automática que hacíamos del traductor de Google hace apenas un año y pico. Pues bien, desde entonces Google ha mejorado MUCHO el sistema de traducción gracias a una innovación tecnológica que han denominado Neural Machine Translation:
https://research.googleblog.com/2016/09/a-neural-network-for-machine.html
https://research.googleblog.com/2016/11/zero-shot-translation-with-googles.html


El sistema aún no es perfecto (y su implantación tristemente casi ha pasado desapercibida en los medios de comunicación), pero si uno se fija y compara el tipo de traducciones automáticas de las que disponíamos hace apenas 5 años con las que tenemos hoy día, se puede ver claramente una mejora literalmente exponencial. Muy (muy) probablemente Google logrará una traducción con capacidades sobrehumanas en los próximos 5 años, amén de un sistema de reconocimiento de voz igualmente mejor que el del hombre medio. Vale unir a esto la síntesis autónoma de voz "end-to-end" de trabajos como los de WaveNet o Tacotron para poderse asegurar que en no más de un lustro dispondremos de aparatos (igual un simple móvil Android) capaces de oír (y transcribir el contenido de) una voz, detectar el lenguaje, traducir lo escuchado a otra lengua arbitraria, y dictar con una voz sintética indiferenciable de una humana dicho texto ya traducido. Esto de hecho ya hay dispositivos que "pueden" hacerlo, pero la cuestión es que en poco tiempo existirán proyectos capaces de realizar esta tarea siempre MEJOR (y más rápido) que cualquier persona.

Los traductores humanos serán posiblemente el primer gremio (mucho antes incluso que los taxistas y demás transportistas) en perder TODO su trabajo a manos de la automatización.

Un saludo, compañeros.

jueves, 3 de noviembre de 2016

Red neuronal enfocada en el aprendizaje supervisado del ajedrez

Enfocado en el reciente trabajo teórico de Google DeepMind (AlphaGo), he desarrollado e implementado una versión en TensorFlow de dicha arquitectura, pero realizando modificaciones para enfocar el diseño en el juego del ajedrez en lugar del Go (el paper original es: https://storage.googleapis.com/deepmind-media/alphago/AlphaGoNaturePaper.pdf).

El modelo ideado originalmente por DeepMind fue divulgado con detalle en este artículo: https://deepmind.com/research/alphago/, y mi implementation del mismo (con las modificaciones necesarias para enfocarlo todo en el juego del ajedrez), se encuentra en el siguiente repositorio de mi cuenta personal en GitHub: https://github.com/Zeta36/Policy-chess. Se trata como podéis ver, de un desarrollo Python usando el framework de Google, TensorFlow.

Os dejo a continuación toda la información técnica sobre mi trabajo, aunque siento no tener tiempo para traducirlo y simplemente copiaré a continuación la introducción que hice del mismo en inglés (prometo más adelante escribir una entrada dedicada a divulgar de manera más sencilla el potencial de esta red neuronal, y el indicio que puede contener sobre el modo en que nuestro propio cerebro biológico realiza ciertas tareas relacionadas con la generalización de conceptos, en este caso; aprender a clasificar con cierta habilidad y de manera "intuitiva" cual es una buena jugada de ajedrez de una mala):

A Policy Network in Tensorflow to classify chess moves

This work is inspired in the SL policy network used by Google DeepMind in the program AlphaGo (https://storage.googleapis.com/deepmind-media/alphago/AlphaGoNaturePaper.pdf).
The network models the probability for every legal chess move given a chess board based only in the raw state of the game. In this sense, the input s to the policy network is a simple representation of the board state using a tensor (batc_sizex8x8x8) with information of the chess board piece state, the number of the movement in the game, the current player, etc.
The SL policy network Pσ(a|s) alternates between convolutional layers with weights σ, and rectifier nonlinearities. A final softmax layer outputs a probability distribution over all legal moves a (labels).
The policy network is trained on randomly sampled state-action pairs (s, a), using stochastic gradient ascent to maximize the likelihood of the human move a selected in state.

Preparing the Data sets

We train the 3-layer policy network using any set of chess games stored as PGN files. To prepare the training and the validation data set, we just need to download many PGN file (more data means more accuracy after the training) and put them in the datasets folder (there is in the repository some pgn examples to use).
After that, we run in the console:
python pgn-to-txt.py
In this way, the PGN files will be reformated in the proper way, and chuncked in a tuple of (board state, human move). We the pgn-to-txt.py script finish, go into the datasets folder and copy almost all the "*.txt" files generated into a new folders called "data_train", and some text files into another folder called "data_validation".
Finally, you have to run
python pgn-to-label.py
And we will get the labels for the SL. This labels will be generated and saved in a labels.txt file inside the "labels" folder.

Training

Training is a easy step. Just run:
python train.py
You can adjust before if you wish some hyperparameters inside this python script.

Playing

Once the model is trained (and the loss has converged), you can play a chess game against the SL policy network. Just type:
python play.py
The machine moves will be generate by the policy network, and the human moves in the game will be asked to you to be type in the keyboard. In order to move, you have to know the san Algebraic notation(https://en.wikipedia.org/wiki/Algebraic_notation_(chess)).
The game board is printed in ASCII, but you can use any online chess board configuration (like this http://www.apronus.com/chess/wbeditor.php) to mimic the movements so you can see clearly the game.

Requirements

TensorFlow needs to be installed before running the training script. TensorFlow 0.10 and the current master version are supported.
In addition, python-chess must be installed for reading and writing PGN files, and for the play.py script to work.

Results

After some thousands of training steps, the model is able to generalize and play a reasonable chess game based only in the prediction of the human movements in the training process.

domingo, 2 de octubre de 2016

Implementación en TensorFlow de la red neuronal generativa (WaveNet) enfocada en la generación de texto

Enfocado en el reciente trabajo teórico de Google DeepMind (WaveNet), he desarrollado e implementado una versión en TensorFlow de dicha arquitectura, pero realizando modificaciones para enfocar el diseño en la generación automática de textos (el paper original es: https://arxiv.org/pdf/1609.03499.pdf).

El modelo ideado originalmente por DeepMind fue divulgado con detalle en este artículo: https://deepmind.com/blog/wavenet-generative-model-raw-audio/, y mi implementación del mismo (con las modificaciones necesarias para enfocarlo todo en la generación de texto), se encuentra en el siguiente repositorio de mi cuenta personal en GitHub: https://github.com/Zeta36/tensorflow-tex-wavenet. Se trata como podéis ver, de un desarrollo Python usando el framework de Google, TensorFlow.

Os dejo a continuación toda la información técnica sobre mi trabajo, aunque siento no tener tiempo para traducirlo y simplemente copiaré a continuación la introducción que hice del mismo en inglés:

A TensorFlow implementation of DeepMind's WaveNet paper for text generation.


This is a TensorFlow implementation of the WaveNet generative neural network architecture for text generation.

Previous Work

Originally, the WaveNet neural network architecture directly generates a raw audio waveform, showing excellent results in text-to-speech and general audio generation (see the DeepMind blog post and paper for details).
This network models the conditional probability to generate the next sample in the audio waveform, given all previous samples and possibly additional parameters.
After an audio preprocessing step, the input waveform is quantized to a fixed integer range. The integer amplitudes are then one-hot encoded to produce a tensor of shape (num_samples, num_channels).
A convolutional layer that only accesses the current and previous inputs then reduces the channel dimension.
The core of the network is constructed as a stack of causal dilated layers, each of which is a dilated convolution (convolution with holes), which only accesses the current and past audio samples.
The outputs of all layers are combined and extended back to the original number of channels by a series of dense postprocessing layers, followed by a softmax function to transform the outputs into a categorical distribution.
The loss function is the cross-entropy between the output for each timestep and the input at the next timestep.
In this repository, the network implementation can be found in wavenet.py.

New approach


This work is based in one implementation of the original WaveNet model (Wavenet), but applying some modifications.
In summary: we are going to use the WaveNet model as a text generator. We'll use raw text data (characters), instead of raw audio files, and once the network is trained, we'll use the conditional probability found to generate samples (characters) into an self-generating process.

Only printable ASCII characters (Dec. 0 up to 255) is supported right now.

Results


Pretty interesting results are reached!! Feeding the network with enough text and training, the model is able to memorize the probability of the characters disposition (in a lenguage), and generate later even a very similar text!!

For example, using the Penn Tree Bank (PTB) dataset, and only after 15000 steps of training (with low set of parameters setting) this was the self-generated output (the final loss was around 1.1):

"Prediction is: 300-servenns on the divide mushin attore and operations losers nis called him for investment it was with as pursicularly federal and sotheby d. reported firsts truckhe of the guarantees as paining at the available ransions i 'm new york for basicane as a facerement of its a set to the u.s. spected on install death about in the little there have a $ N million or N N bilot in closing is of a trading a congress of society or N cents for policy half feeling the does n't people of general and the crafted ended yesterday still also arjas trading an effectors that a can singaes about N bound who that mestituty was below for which unrecontimer 's have day simple d. frisons already earnings on the annual says had minority four-$ N sance for an advised in reclution by from $ N million morris selpiculations the not year break government these up why thief east down for his hobses weakness as equiped also plan amr. him loss appealle they operation after and the monthly spendings soa $ N million from cansident third-quarter loan was N pressure of new and the intended up he header because in luly of tept. N million crowd up lowers were to passed N while provision according to and canada said the 1980s defense reporters who west scheduled is a volume at broke also and national leader than N years on the sharing N million pro-m was our american piconmentalist profited himses but the measures from N in N N of social only announcistoner corp. say to average u.j. dey said he crew is vice phick-bar creating the drives will shares of customer with welm reporters involved in the continues after power good operationed retain medhay as the end consumer whitecs of the national inc. closed N million advanc"

This is really wonderful!! We can see that the original WaveNet model has a great capacity to learn and save long codified text information inside its nodes (and not only audio or image information). This "text generator" WaveNet was able to learn how to write English words and phrases just by predicting characters one by one, and sometimes was able even to learn what word to use based on context.

This output is far to be perfect, but It was trained in a only CPU machine (without GPU) using a low set of parameters configuration in just two hours!! I hope somebody with a better computer can explore the potential of this implementation.

If you want to check this results, you just have to type this in a command line terminal (this will use the trained model checkout I uploaded to the respository):
python generate.py --text_out_path=output.txt --samples 2000 
./logdir/train/2016-10-02T10-45-10/model.ckpt-14999

Requirements


TensorFlow needs to be installed before running the training script. TensorFlow 0.10 and the current master version are supported.

Training the network


You can use any text (.txt) file.

In order to train the network, execute
python train.py --data_dir=data

to train the network, where data is a directory containing .txt files. The script will recursively collect all .txt files in the directory.
You can see documentation on each of the training settings by running
python train.py --help

You can find the configuration of the model parameters in wavenet_params.json. These need to stay the same between training and generation.

Generating text


You can use the generate.py script to generate audio using a previously trained model.

Run
python generate.py --samples 16000 model.ckpt-1000
where model.ckpt-1000 needs to be a previously saved model. You can find these in the logdir. The --samples parameter specifies how many characters samples you would like to generate.
The generated waveform can be stored as a .txt file by using the --text_out_path parameter:
python generate.py --text_out_path=mytext.txt --samples 1500 model.ckpt-1000
Passing --save_every in addition to --text_out_path will save the in-progress wav file every n samples.

python generate.py --text_out_path=mytext.txt --save_every 2000 --samples 1500 model.ckpt-1000

Fast generation is enabled by default. It uses the implementation from the Fast Wavenet repository. You can follow the link for an explanation of how it works. This reduces the time needed to generate samples to a few minutes.

To disable fast generation:
python generate.py --samples 1500 model.ckpt-1000 --fast_generation=false

Missing features

Currently, there is no conditioning on extra information.

domingo, 18 de septiembre de 2016

Trasteando con el "Juego de la vida" de John Horton Conway

El Juego de la vida es un diseño de programación ideado por el matemático británico John Horton Conway en 1970, y basa su funcionamiento en un "mundo" en dos dimensiones (2D) el cual contiene cierto número finito de celdas que pueden estar o no ocupadas por una estructura. Posteriormente estas celdas varían su estado gracias a una "física" (conjunto de reglas) que dictan la dinámica y el estado del tablero. Aunque lo más importante y destacable de este proyecto, es el hecho de ver como un diseño tan simple es capaz de conseguir con su dinámica temporal que a veces emerjan interesantes y complejos patrones de movimiento.

Las reglas del juego original son las siguientes:
  1. Una celda puede estar activa (on) o no activa (off). Si está activa se dice que es una célula viva.
  2. Una célula muerta (celda off) con exactamente 3 células vecinas vivas "nace" (al turno siguiente esta celda muerta estará viva).
  3. Una célula viva con 2 ó 3 células vecinas vivas sigue viva, en otro caso muere o permanece muerta (por "soledad" o "superpoblación").
Y esto es todo. Una reglas muy sencillas, que dan lugar a patrones a veces asombrosamente complicados. Esta es de hecho, la clave de todo: comprobar como es posible que surja complejidad a partir de un comportamiento de base muy simple.

A continuación os muestro brevemente lo fácil que es programar esta "física" en Javascript:



var Game = function(board) {

this.board = board;

this.width = board.width;

this.height = board.height;

};


Game.prototype.get = function(x, y) {

return this.board.get(x,y);

};


Game.prototype.set = function(x, y, value) {

this.board.set(x,y, value);

};


Game.prototype.step = function() {

var

current = this.board,

width = current.width,

height = current.height,

i, j, neighbours, cell

;

this.board = new Board(width, height);


for (i = 0; i < width; i++) {

for (j = 0; j < height; j++) {

neighbours = current.neighbours(i,j);

cell = current.get(i,j);

if (neighbours === 3)

this.board.set(i,j, 1);

else if (neighbours === 2)

this.board.set(i,j, cell);

else

this.board.set(i,j, 0);

}

}

};

Apenas 38 líneas de código que nos van a permitir disfrutar de increíbles patrones de movimiento como los siguientes (es importante hacer notar de nuevo que el estado inicial de las celdas va a determinar también el patrón de movimiento al principio):

Pues bien, a petición de la idea de un amigo (Sergio Hernandez), he desarrollado una variación sobre el Juego de la vida, donde simplemente vamos a tener en el "mundo" dos tipos de células vivas (en on): células verdes y células rojas (y también celdas muertas en off). Las reglas serán las mismas para cada tipo de célula viva, las cuales vivirán siguiendo sus propias normas (como si fuesen cepas independientes).

Dos pequeños cambios se añaden no obstante a las reglas orginales:
  1. Si una celda resulta que es ocupada en un paso (step) a la vez por una célula roja y una verde se elige aleatoriamente el tipo de célula viva que permanecerá en esa casilla (dado que una celda sólo puede tener un estado determinado).
  2. Si una célula viva detecta que en el siguiente paso (step) morirá por "soledad" o "superpoblación", cambiará su tipo. De modo que si una célula viva roja detecta que morirá en el siguiente paso, pero que si se vuelve verde no lo hará, cambiará su estado a célula verde.
El resultado de estos cambios es el siguiente (generando al azar el estado inicial del tablero):

Es interesante ver el modo en que estas dos cepas de células vivas compiten de alguna manera por el espacio disponible. A veces da la sensación de que se fagocitan unas a otras, o que incluso intenan "escapar" cuando notan la proximidad de "rivales". En muchas ocaciones incluso una cepa completa es eliminada por la contraria, terminando el tablero exclusivamente con células verdes o rojas.

Nota:  como ya hemos dicho, el resultado dependerá del estado inicial de las celdas, y en este ejemplo dicho estado inicial es aleatorio, por lo tanto, si queréis ver una nueva configuración dinámica simplemente tenéis que refrescar esta página en el navegador (botón F5). También es posible hacer 'click' en cualquier lugar del tablero para generar nuevas celdas vivas aleatoriamente, con lo cual podremos "modificar" el estado dinámico del juego sin necesidad de actualizar la página completa.
También es importante ver como esta modificación parece de algún modo haber estabilizado el comportamiento del sistema, puesto que ahora, de media, la duración del movimiento dinámico antes de caer en estructuras fijas (que no avanzan sino que se quedan quitas con patrones estáticos) parece haber aumentado. Por ejemplo, en el siguiente caso os muestro el comportamiento del nuevo Juego de la vida desarrollado, pero en lugar de comenzar con una configuración al azar, voy a comenzar con una configuración muy parecida a la que usamos antes para el juego original (5 células vivas de cada color dispuesta en similar configuración):

Futuro trabajo.

Creo que es interesante seguir explotando este tipo de desarrollos en un intento de sacar algún tipo de conclusión teórica sobre la base del mismo. En este sentido es seguro que Sergio Hernandez me comentará algunas nuevas ideas de cambio, y yo, por mi parte, tengo intención de aplicar al desarrollo anterior un algoritmo de computación evolutiva buscando en principio aquellas configuraciones que más movimiento producen tras n pasos (es decir, aquellas que más "calor" generan, que más "energía" consumen y por lo tanto que maximizan la "entropía"), con lo cual espero conseguir (descubrir) aquellas configuraciones que den lugar a los patrones más complejos posibles, y detectar también si es cierto que complejidad y entropía (consumo de energía libre) correlacionan necesariamente, y si dicho resultado se puede generalizar para otras "físicas" (quizás incluso la de nuestro propio mundo).

Un saludo.