Aner Godoy1
1
anergogo7@gmail.com
Resumen
Se presenta en este trabajo una breve explicación de los autómatas celulares, algunas de sus caractristicas y elementos
que los componen.Tambien se presenta una descripción del autónama celular “El juego de la vida ”, de Conway, sus
reglas, algunas aplicaciones y su implementación en C++ aplicando la libreria OpenMP para paralelizar el codigo
fuente y asi observar la mejoria en la ejecución del programa.
Introducción
Un autómata celular es un modelo matemático para un sistema dinámico compuesto por un conjunto de celdas o
células que adquieren distintos estodos o valores. Estos estados son alternados de un sistema a otro en unidades de
tiempo discreto, es decir, que se pueden cuantificar con valores enteros o intervalos regulares. De esta manera este
conjunto de células logran una evolución según una determinada expresión matemática, que es sencible a los estados de
las células vecinas, y que se conoce como regla de transición local [1]. Para los matemáticos es fundamental el utilizar y
desarrollar herramientas, que expliquen los fenómenos que nos rodean. Esto se logra, a través de modelos matemáticos
que dan respuesta a dichos fenómenos. Ası́ lo señala el gran avance de los sistemas dinámicos, particularmente los
autómatas celulares.
La computación puede verse como la transformación de la información, donde al inicio de este proceso siempre hay
condiciones iniciales. Sin embargo, hay procesos de computo donde nuevas entradas de información pueden darse
dentro del proceso mismo. Esta información nueva a veces determina el resultado del proceso [3].
Un autómata celular(A.C) es un modelo matemático para un sistema dinámico que evoluciona en pasos discretos. Es
adecuado para modelar sistemas naturales que pueden ser descritos como una colección masiva de objetos simples que
interactuen localmente unos con otros.
Los autómatas celulares son herramientas útiles para modelar cualquier sistema en el universo. Puede considerarse
como una buena alternativa a las ecuaciones diferenaciles y han sido utilizados para modelar sistemas fisicos, como
iteraciones entre particulas, formación de galaxias, cinética de sistemas moleculares y crecimiento de cristales, ası́ como
diversos sistemas biológicos a nivel celular, molecular y poblacional[3]..
1
Autómata Celular “El juego de la Vida”
Reglas:
El conjunto básico inicial que propuso Conway se compone de tres reglas muy sencillas:
• Cada célula viva con dos o tres células vecinas vivas sobrevive a la siguiente genereción.
• Cada célula viva con ninguna, una, o mas de tres células vivas a su alrededor pasa a estar muerta(Soledad y
superpoblación).
• Cada célula muerta con tres células vecinas resusita en la siguiente generación.
Sin embargo se pueden realizar variaciones en estas reglas para obtener comportamientos distintos a los habituales.
La manera de representar las reglas es X/Y, donde X e Y son números enteros. Cada uno de los dı́gitos que forman
estos números representa un número de vecinos válido para nacer o continuar viviendo respectivamente [2].
• Patrones estáticos : Un conjunto de células vivas que se mantiene estático, sin que se produzcan nuevos naci-
mientos o muertes.
2
Autómata Celular “El juego de la Vida”
Patrones que se trasladan: Un conjunto de células vivas que permanece con la misma forma, pero que se desplaza por
el tablero.
La aplicación muestra un tablero con una matriz de células (42x166), se eligió una matriz de estas dimenciones para
que cuando se manda a imprimir, se observe la matriz completa en la pantalla.
En principio todas las células cubiertas por espacios vacios (Muertas) y las células que contienen un número cero
(Vivas). Este programa genera una matriz aleatoria con ceros y espacios vacios en su interior de donde inicia el
proceso. Al ser aleatoria la eleccion de las células vivas y muertas, cada inicio es diferente.
Para modificar el tamaño de la matriz es necesario ir al codigo fuente y hacer el cambio, ası́ tambien para ver el
siguiente estado es necesario oprimir la tecla enter.
Implementación
Para la creación del juego de la vida en C++ se han implementado en tres etapas:
Se crean cinco funciones con las que el juego se ejecuta de manera correcta.
• Primero la función “MatAl”:
Crea una matriz aleatoria (n), llena con unos y ceros, los que indican que las células con el núnero uno son
células vivas, mientras que las células con en número cero indica una célula muerta.
• “MostrarN”:
Se crea una función que muestra en pantalla la matriz creada (n).
• “AnalizarN”:
Es una función que analiza la matriz creada (n) y escribe sobre otra matriz declarada en ceros (y), de acuerdo
a las reglas establecidas.
3
Autómata Celular “El juego de la Vida”
• “MostrarY”:
Función que imprime en pantalla esta nueva matriz (y).
• “AnalizarY”:
La función que analiza la matriz sobreescrita (y) y reescribe la primera matriz (n).
• “MostrarN”: imprime la primera matriz (n) y el ciclo se repite.
El código ejecuta primeramente el “main”, donde esta el llamado del las funciones en el siguiente orden:
– La suma (s) es diferente de tres y dos, se escribe en la otra matriz para la misma posición de la matriz
evaluada, se le asigna cero.
– La suma (s) es igual de tres y dos, se escribe en la otra matriz para la misma posición de la matriz evaluada,
se le asigna uno.
• Si la célula evaluada contiene el número cero:
– La suma (s) es igual a tres, se escribe en la otra matriz para la misma posición de la matriz evaluada, se le
asigna uno.
– La suma (s) es diferente de tres, se escribe en la otra matriz para la misma posición de la matriz evaluada,
se le asigna cero.
Se prueban varios comandos de la libreria OpenMP y utilizando distints cantidades de hilos para los que el pro-
grama funcionó bien como ser:
4
Autómata Celular “El juego de la Vida”
Resultados
Tiempo (Segundos)
Código Código
Código “El juego de la vida” “El juego de la vida” Código
Código
“El juego de la vida” Usando funciones de omp Usando funciones de omp “El juego de la vida”
Hilos “El juego de la vida”
usando funciones de omp parallel for shared parallel for shared Usando funciones de omp
secuencial
en la sección principal omp master omp sections omp parallel en (if)
omp critical omp critical
1 0.296 - 0.31 0.299 - 0.33 0.291 - 0.302 0.292 - 0.32 0.492 - 0.502
2 0.296 - 0.31 0.283 - 0.305 0.287 - 0.301 0.288 - 0.308 0.672 - 0.684
3 0.296 - 0.31 0.285 - 0.301 0.282 - 0.327 0.299 - 0.306 0.759 - 0.772
4 0.296 - 0.31 0.266 - 0.317 0.286 - 0.311 0.281 - 0.299 0.894 - 0.967
Se compara el desempeño con respecto al tiempo que tarda en ejecutarse el ciclo completo, de el juego de la vida y se
toman los valores minimos y maximos observados en pantalla.
Estas pruebas fueron realizadas en una computadora Dell, con un procesador intel(R) Core(TM) i5-7200U CPU
@2.50GHz, 2701 Mhz, 2 procesadores principales, 4 hilos, con una Sistema Operativo Microsoft Windows 10 Home
Single Language.
Conclusiones
• Claramente, existe una mejoria en el tiempo de ejecución de algunos algoritmos paralelizados con la librerı́a
OpenMP. Excepto cuando se paralelizo las estructura de control (if), que genero un buen funcionamiento del
programa pero un mal tiempo de ejecucuión, por lo que podemos concruir que la configuración de los comandos
de paralelización influyen directamente en el rendimiento de un programa.
5
REFERENCIAS REFERENCIAS
• La mejora en el rendimiento del tiempo de ejecución de los algoritmos paralelizados, no es tan notable a simple
vista, pero como podemos ver en la grafica 4, cuando utilizamos cuatro hilos, siempre se reduce el tiempo en que
se ejecuta el programa.
Referencias
[1] F. S. Caparrini. http://www.cs.us.es. Magazine Theme for PivotX by Windmill Web Work, 2009.
[2] G. R. T. Juan Ignacio Del Castillo Waters. El juego de la vida de conway. UNIVERSIDAD DE CASTILLA-LA
MANCHA, Dic. 2008.
[3] D. Reyes. Descripción y aplicaciones de los autómatas celulares. Puebla, México, 2011.
Anexos
// Código El juego de la vida//
#include<iostream>
#include<time.h>
#include<stdlib.h>
#include<conio.h>
#include <omp.h>
MatrAl();
do{
double time = omp_get_wtime();
#pragma omp sections
{
#pragma omp section
MostrarN();
#pragma omp section
AnalizarN();
#pragma omp section
system("pause");
}
system("cls");
cout<<"\ntiempo: "<<omp_get_wtime()-time<<endl;
time = omp_get_wtime();
#pragma omp sections
{
6
REFERENCIAS REFERENCIAS
7
REFERENCIAS REFERENCIAS
}
if ((s==3)||(s==2)){
n[i*f+j]=1;
}
}
else if (y[i*f+j]==0){
if (s==3){
n[i*f+j]=1;
}
if (s!=3){
n[i*f+j]=0;
}
}
}
}
}
void MostrarN(){
omp_set_nested(1);
#pragma omp critical
for (int i=0;i<t;i++){
for (int j=0;j<f;j++){
if (n[i*f+j]==1){
cout<<"0";
}
else if (n[i*f+j]==0){
cout<<’ ’;
}
}
cout<<endl;
}
}
void MostrarY(){
omp_set_nested(1);
#pragma omp critical
for (int i=0;i<t;i++){