אתר להורדת שירים
kottik
תרגום מאנגלית לעברית חינם גוגל
независимый рейтинг брокеров бинарных опционов
קמגרה
интернет магазин ламода отзывы

Tag Archives: Wolfram

A New Kind of Science

Stephen Wolfram - A New Kind Of Science

Ese es el título del afamado libro de Stephen Wolfram cuyo acceso online es gratuito. Hace rato que lo vengo ojeando pero pocas veces me puse a programar algo de lo que desarrollaba. Hasta hoy!

Domingo lluvioso, ideal para programar pequeños fragmentos de código horrible para reproducir los autómatas celulares (AC) que tanto investigó este tipo. La utilidad de los AC son amplias, tienen aplicaciones diversas que van desde las boludeces aquí presentadas hasta comportamientos mucho más complejos como la modelación del crecimiento de un tumor, por mencionar algo. Sin embargo, acá no nos importa todas las demás aplicaciones, al menos no por ahora, sino empezar con los experimentos del capítulo 2 e ir avanzando con lo que plantea el libro.

Los AC pueden definirse como una grilla de células donde sus estados son finitos y pueden evolucionar en función de su estado actual y del estado de sus vecinos. Bueno, eso es una definición mía agarrada de los pelos, en wikipedia está mejor. En criollo sería algo así como: dime como estás y cómo están con los que te juntas y te diré como estarás mañana.

Yendo un poco más específicamente a lo que plantea Estifen en el capítulo 2 de su libro, una célula puede ser negra o blanca (1 o 0 respectivamente), así de fácil. El tema es el conjunto de reglas que se le imponen para cambiar a blanco o a negro. Por ejemplo, si tenemos en un momento determinado 8 células dispuestas linealmente de este modo: 0001000

En el paso siguiente va a haber algunas que cambian de 0 a 1 y viceversa, evaluando su estado y el de sus inmediatas vecinas, es decir la de la izquierda y de la derecha. Acá surge la duda de qué hacemos con la de los extremos, las obviamos, empezamos tomando las tres primeras (000) para ver qué nuevo valor va a tener la central, luego las tres siguientes (001), las otras tres (010) y así sucesivamente hasta tomar las últimas tres células (000) .

De manera tal que los 3 primeros ceros, 000, van a determinar el nuevo valor de la célula del medio. La regla denominada Rule 30, realiza los siguientes cambios:

000: 0
001: 1
010: 1
011: 1
100: 1
101: 0
110: 0
111: 0

El primer caso se explicaría así: cuando la célula central es 0 y las vecinas son 0, entonces el nuevo valor de la célula será 0. Ahora, por qué se llama regla 30? bueno, si te fijás la columna de la derecha forma el número 30 si convertís a decimal el número 00011110, se entiende? ok, así me gusta.

O sea que ya tenemos casi todo. Cómo se hace? Bueno, vamos tomando de a 3 células y hacemos la actualización. Con el valor inicial dado 0001000, se irían actualizando las nuevas generaciones de la siguiente manera:

 

0011100
0110010
0101110

Con estas reglas tan simples se generan estructuras complejas como las de acá:

rule30-zoomrule73-145x120-zoomrule146-zoom rule150-zoom

El código necesario para generar estas y otras figuras está hecho en Python. Las generaciones serían la cantidad de filas de la imagen, y las reglas van desde 0 hasta 255 generando una figura pbm por cada una.

import ACfunctions as ac
gen=10
for rule in range(256):
    bit_ini='00000100000'
    header = 'P1 '+ str(len(bit_ini)) + ' '+str(gen)
    o = open("rule"+str(rule)+"-"+str(len(bit_ini)) + 'x'+str(gen)+".pbm",'w')

    o.write(header+"\n")
    o.write(bit_ini+"\n")

    new_bit='0'
    for n in range(gen):
        for i in range(len(bit_ini)-2):
            new_bit+=ac.getState(rule,bit_ini[i:i+3])
        new_bit+='0'
        o.write(new_bit+"\n")
        bit_ini=new_bit
        new_bit='0'
    o.close()

Y la función que hice para determinar las reglas, aún no mejorada es esta:

def getState(rule,bits):
    '''Descripcion:
        Devuelve el estado de la celula a partir del estado
        de la cadena representada en bits siguiendo la regla
        representada por rule
        rule : entero entre 0 y 255
        bits: cadena de 3 caracteres de ceros y unos
    '''
    # Convierte el entero rule a binario de 8 bits representado por una cadena
    bin_rule=bin(rule)[2:].zfill(8)
    # Aplica la regla de Wolfram
    if bits=='000':
        b=bin_rule[7]
    elif bits=='001':
        b=bin_rule[6]
    elif bits=='010':
        b=bin_rule[5]
    elif bits=='011':
        b=bin_rule[4]
    elif bits=='100':
        b=bin_rule[3]
    elif bits=='101':
        b=bin_rule[2]
    elif bits=='110':
        b=bin_rule[1]
    elif bits=='111':
        b=bin_rule[0]
    return b

Esta es la primer entrega del capítulo 2 del libro. Algún otro domingo iré continuando con desarrollos que agregan más complejidad. Por lo pronto les dejo el famoso juego de la vida de conway

Social Widgets powered by AB-WebLog.com.

Social Widgets powered by AB-WebLog.com.

Social Widgets powered by AB-WebLog.com.