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
- 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:
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:
- Determinación del valor de una celda para t=k+1 dado su valor y el de sus vecinos para t=k
- Determinación de los valores en t=k+1 para una ristra de celdas (relacionado con lo anterior).
- 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.
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/