domingo, 26 de mayo de 2013

Evidencia 7: Programación de un Autómata Celular

Objetivo
Diseñar redes complejas y autómatas celulares, sistemas no lineales y analizar la teoría de caos, a través de los cuales se va a poder discernir entre los diseños más convenientes para el desarrollo del sistema.

Introducción
Implementa un autómata celular con la regla especificada (cada quien debe hacer una diferente). El programa debe recibir como entrada los valores de las celdas en t=0 y la cantidad de iteraciones (pasos de tiempo) a realizar.

Desarrollo
  1. Regla con la que se está trabajando: Mi programa lo hice de una manera que se ajusta a la regla que el usuario desea convirtiendo el numero decimal a binario y después los ocho posibles casos son almacenados e impresos para el usuario con el siguiente código:
  2. 01     for(i=0; i<8; i++){REGLA[i]=0;}
    02     printf("REGLA: ");
    03  scanf("%d",&n);
    04 //for(n=1;n<=256;n++){
    05  m=6;
    06  for(bin=1;bin<=n;bin*=2) 
    07   j=bin;
    08  for(j=bin;j>=1;j=(bin/=2)){
    09         for(j=bin;j>=1;j=(bin/=2)){   
    10    n_tem=n;
    11    k=n_temp;
    12    n_temp=n_tem%j;
    13    if(n_tem>=j){
    14        n_temp1=k/j;
    15        REGLA[m]=n_temp1;
    16        m--;}}}
    17        
    18  printf("\n");
    19  printf("XXX  XX0  X0X  X00  0XX  0X0  00X  000 \n");
    20  for(i=0; i<8; i++){if(REGLA[i]==1){printf(" X   ");}
    21          else{printf(" 0   ");}}  
    
Fragmentos de código que muestren lo siguiente:
    1. Determinación del valor de una celda para t=k+1 dado su valor y el de sus vecinos para t=k
    2. Determinación de los valores en t=k+1 para una ristra de celdas (relacionado con lo anterior).
    3. Impresión del resultado final.
  • En el siguiente pedazo de código se observa lo pedido anteriormente. Desde los valores de las celdas y la de sus vecinos hasta la impresión del resultado final
      01  if(/*PASADO*/CLIENTE[x-2][j]==1&&/*PRESENTE*/CLIENTE[x-1][j]==1&&/*FUTURO*/CLIENTE[0][j]==1) {CLIENTE[x-1][j+1]=REGLA[0];}//CASO1    
      02  if(/*PASADO*/CLIENTE[x-2][j]==1&&/*PRESENTE*/CLIENTE[x-1][j]==1&&/*FUTURO*/CLIENTE[0][j]==0) {CLIENTE[x-1][j+1]=REGLA[1];}//CASO2    
      03  if(/*PASADO*/CLIENTE[x-2][j]==1&&/*PRESENTE*/CLIENTE[x-1][j]==0&&/*FUTURO*/CLIENTE[0][j]==1) {CLIENTE[x-1][j+1]=REGLA[2];}//CASO3    
      04  if(/*PASADO*/CLIENTE[x-2][j]==1&&/*PRESENTE*/CLIENTE[x-1][j]==0&&/*FUTURO*/CLIENTE[0][j]==0) {CLIENTE[x-1][j+1]=REGLA[3];}//CASO4    
      05  if(/*PASADO*/CLIENTE[x-2][j]==0&&/*PRESENTE*/CLIENTE[x-1][j]==1&&/*FUTURO*/CLIENTE[0][j]==1) {CLIENTE[x-1][j+1]=REGLA[4];}//CASO5    
      06  if(/*PASADO*/CLIENTE[x-2][j]==0&&/*PRESENTE*/CLIENTE[x-1][j]==1&&/*FUTURO*/CLIENTE[0][j]==0) {CLIENTE[x-1][j+1]=REGLA[5];}//CASO6    
      07  if(/*PASADO*/CLIENTE[x-2][j]==0&&/*PRESENTE*/CLIENTE[x-1][j]==0&&/*FUTURO*/CLIENTE[0][j]==1) {CLIENTE[x-1][j+1]=REGLA[6];}//CASO7    
      08  if(/*PASADO*/CLIENTE[x-2][j]==0&&/*PRESENTE*/CLIENTE[x-1][j]==0&&/*FUTURO*/CLIENTE[0][j]==0) {CLIENTE[x-1][j+1]=REGLA[7];}//CASO8
      09     
      10  printf("\n");
      11  for(i=0; i<x; i++){if(CLIENTE[i][j]==1){printf("X");}
      12          else{printf(" ");}}
      
      
Capturas de pantalla donde se indiquen los resultados utilizando diferentes ristras de inicio y diferente cantidad de iteraciones.







Código





Conclusiones
En esta practica se observo como un autómata celular funciona de una forma dinámica, y va cambiando con el paso del tiempo. Y como distintas reglas cambian dramáticamente el comportamiento de cada caso en particular, y como a partir de algo simple, se obtiene un comportamiento complejo.

Referencias

Aplicación echa en DEV-C++: http://www.bloodshed.net/

No hay comentarios:

Publicar un comentario