Introducción
Definido con nuestras palabras, un autómata celular es un conjunto de elementos que evolucionan mediante reglas o condiciones previamente definidas.
Se utilizan para representar los cambios en un sistema (natural o artificial).
Objetivo
Representar los cambios o generaciones de un conjunto de células (en nuestro caso las llamamos "genes"), implementando todas las reglas de los autómatas celulares (0-255).
Justificación
En un inicio nos interesó el tema de Swarm Intelligence y pensamos en desarrollar un código que simulara el comportamiento de una comunidad de roedores, pero debido al corto tiempo que teníamos, cambiamos de idea y decidimos cambiar a autómatas celulares.
Desarrollo
Al tener el tema definido comenzamos a generar una lluvia de ideas entre los integrantes del equipo para tener clara la lógica del programa y nos dimos cuenta que era posible inlcuir todas las reglas y no sólo limitarnos a 4.
Después de mucho pensar, anotar nuestras ideas en la libreta y tener bien clara la idea del algoritmo que se implementaría en el código, empezamos con la codificación, haciendolo paso a paso para no cometer errores.
Convirtiendo cada regla a binario y haciendo un chequeo del conjunto de genes pudimos crear la siguiente generación y cambiando la nueva generación por la anterior pudimos generar las iteraciones deseadas por el equipo.
Nos pareció adecuado dar la opción al usuario de crear genes aleatorios o que él mismo incluyera la cantidad de genes que desee y la posición de cada uno.
Cada vez que se corre el programa se aplican colores diferentes (random) a los genes.
Se uso el lenguaje de programación Python con su libreria Pygame para la interfaz gráfica.
Código
#! usr/bin/python/
# Importamos las librerías necesarias para correr el programa
import pygame
import random
# Declaramos las variables globales que son el alto y el ancho
de la ventana y los valores iniciales de X y Y
ancho = 1360
alto = 710
x = 5
y = 5
# Funcion automata
def automata(regla, i, genesNuevos, genes, opcion):
if i == 0:
if opcion != 2:
for i in range (272):
generarGenes = random.randint(0, 1)
if generarGenes == 0:
genes[i] = 0
else:
genes[i] = 1
for i in range (272):
if genes[i] == 1:
screen.blit(cuadro, ((x*i) -5, 0))
print
print genes
else:
for i in range (272):
genes[i] = genesNuevos[i]
# Aqui se evaluan la ultima y las primeras dos posiciones de la cadena
lista1 = genes[i],genes[i-271],genes[i-270]
cadena1 = "".join(str(x) for x in lista1)
binario1 = int(cadena1, 2)
genesNuevos[0] = int(regla[(binario1 + 1) * -1])
# Si la cadena contiene un elemento se coloca el cuadrito en la posicion
if genesNuevos[0] == 1:
screen.blit(cuadro, (x*i, y))
pygame.display.update()
for i in range (270):
# Aqui se evaluan todas las posiciones, a excepcion de la primera y la ultima
# Aqui se evaluan las ultimas dos posiciones y la primera
print genesNuevos
# Funcion principal
if __name__ == "__main__":
# Se declaran la cadena de genes por defecto (llena de ceros)
# Hacemos un pequeño menu para que el usuario eliga entre la opcion de generar una cadena de valores aleatoria o ingresar la cantidad y posicion de genes manualmente
print "Generar genes de manera aleatoria -> 1"
print "Agregar genes manualmente -> 2"
opcion = input("Opcion: ")
if opcion == 2:
opcion2 = input("Cuantos desea agregar? ")
for i in range (opcion2):
opcion3 = input("Posicion: ")
genes[opcion3] = 1
else:
for i in range (272):
generarGenes = random.randint(0, 1)
if generarGenes == 0:
genes[i] = 0
else:
genes[i] = 1
# El usuario ingresa la regla deseada y si es mayor que 255 o menor que 0 el programa manda un aviso de error y se cierra
regla = input('Regla: ')
if (regla > 255) or (regla < 0):
print 'Solo se pueden reglas de la 0 a la 255'
exit()
# Convertimos la regla en un numero binario
print regla
# Creamos la pantalla
screen = pygame.display.set_mode((ancho, alto))
pygame.display.set_caption("Automatas celulares")
# Se elige el color de los cuadritos de manera aleatoria (tenemos 8 imagenes, con 8 colores diferentes)
colores = random.randint(1, 8)
if colores == 1:
cuadro = pygame.image.load("1a.png")
# Aqui van las demas condiciones de los cuadritos
# Se crean las nuevas generaciones
for i in range (143):
automata(regla, i, genesNuevos, genes, opcion)
pygame.display.update()
y += 5
# Funcion para cerrar la ventana
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
exit()
Resultados
Tuvimos resultados muy satisfactorios a comparación con las expectativas que teníamos a un inicio. Nuestro código tiene mucho menos líneas que las que hubiera tenido con nuestra idea inicial de implementar sólo 4 reglas.
Regla 99:
Regla 90:
Regla 99:
Regla 90:
Video
Conclusiones
Nos pareció excelente el cambio del tema y la solución que le dimos a nuestro programa de autómatas celulares, estamos muy conformes con el resultado.
Aprendimos nuevos métodos en el lenguaje de programación que utilizamos.
Algunas reglas de los Autómatas Celulares
Referencias
Autómatas Celulares - WikipediaAlgunas reglas de los Autómatas Celulares



