viernes, 21 de septiembre de 2012

Practica 2 - Autómatas Celulares

ENTREGA FINAL


Objetivo.
Por medio de esta práctica el alumno implementará algunas de las técnicas vistas en el curso de la materia de Programación de Sistemas Adaptativos. Se programará un Sistema Adaptativo con cómputo evolutivo o sistemas complejos.

Diseño del Sistema.
Para la siguiente práctica se estudia el comportamiento de un Autómata Celular que con el paso del tiempo se ha ido estudiando marcando 3 etapas importantes con científicos que hicieron aportes importantes.



Diseño de la Solución.
Se considera un vector con valores binarios dependiendo de la regla escogida por el usuario para establecer la Regla a mostrar y poder entender el proceso de obtención de cada regla.


Se realiza la conversión de entero a binario en la clase MainCelular.java y se manda a la clase Regla.java el vector del número binario obtenido de la conversión del numero escogido por el usuario para establecer la regla a mostrar en el Frame.

  
do {
    do {
 numRegla = JOptionPane.showInputDialog("Inserta el numero de regla a mostrar:","90");
    }while(numRegla.equals(""));
 regla = Integer.parseInt(numRegla);
}while( regla < 0 || regla > 255);
 int pregunta = JOptionPane.showConfirmDialog(null, "¿Desea generar un vector inicial aleatorio?", "Inicializacion", JOptionPane.YES_NO_OPTION);
    if (pregunta == 0) {
 R.Random();
    } 

/* Se hace la conversion de Entero a Binario */
 
    for(int i=7;i>=0;i--) {
        NumBinario[i]=regla%2;
        System.out.println("El elemento ["+i+"] -> "+NumBinario[i]);
        regla/=2;
    }

    R.getRegla(NumBinario[0],NumBinario[1],NumBinario[2],NumBinario[3],NumBinario[4], NumBinario[5],NumBinario[6],NumBinario[7]);

Se establece como Valor inicial un pixel en el centro cuyo valor booleano es true para la visualización en el Panel donde se va a dibujar el fractal simple indicado por el usuario.

Ya dentro de la clase Regla.java se recibe el vector binario y se 'crea' la regla. Dentro del método getCasilla se va siguiendo la regla y regresa el nuevo valor que la célula tendrá en la siguiente etapa del tiempo (k+1).

  
public int getCasilla(int A,int B ,int C) {
    int r=0;
        if(A==0 && B==0 && C==0){r=a;
     }else if(A==0 && B==0 && C==1){r=b;
     }else if(A==0 && B==1 && C==0){r=c;
     }else if(A==0 && B==1 && C==1){r=d;
            }else if(A==1 && B==0 && C==0){r=e;
     }else if(A==1 && B==0 && C==1){r=f;
     }else if(A==1 && B==1 && C==0){r=g;
     }else if(A==1 && B==1 && C==1){r=h;
     }
    return r;
}

En el método Regla se expone que al cambiar el vector inicial, que mostraba solamente un pixel encendido (true), por uno aleatorio se genera un fractal mas complejo. ('Sistema Caotico')

  
public void Reglas(){

 for(int i=0;i<1000;i++){
    A[0][i]=0;
 }

 if (rand == true) {
     Random r = new Random();
     for(int j=0; j<=500; j++) {  
      boolean truefalse = r.nextBoolean();
      A[0][j] = (truefalse == true)?1:0; /*Se genera un vector inicial aleatorio*/
     }
 } else {
     A[0][100]=1;
 }
    }
Para ver el código completo del programa:
https://gist.github.com/3762974

Video.
Conclusiones.
Una vez visto los resultados de la aplicación se observa que el estudio de los autómatas celulares requiere mayor estudio debido a que si se selecciona una regla y una configuración inicial y se sigue la evolución temporal se observará un cambio considerable en el curso del tiempo.
Cabe mencionar que un autómata celular puede ser imprescindible con configuraciones iniciales aleatorias ya que es considerado un ejemplo común de un Sistema Caótico.
Referencias:
http://delta.cs.cinvestav.mx/~mcintosh/comun/tesismaestria/rene/tesisReneHtml/node14.html
http://www.ejournal.unam.mx/cns/no24/CNS02405.pdf

jueves, 6 de septiembre de 2012

Practica # 1 - Control de Semáforos

ENTREGA FINAL

Objetivo.
Por medio de esta práctica el alumno desarrollará lo mas profundo posible las diferentes soluciones y posibles problemas que se puede encontrar para el problema propuesto. Implementará un sistema que simule un crucero congestionado y éste regule automáticamente la duración del verde de los semáforos de los cruces.

Diseño del Sistema.
Para la siguiente práctica se recomienda que el alumno considere de apoyo los siguientes Temas:



En los siguientes diagramas se presenta el escenario con el que se va a trabajar a lo largo de esta práctica. A continuación el Diseño del cruce:



A continuación se presenta la Matriz y el Grafo de Conflictos:

Vector de Características




















Diseño de la Solución.
Con lo anterior se puede deducir lo siguiente:
Si se imagina el cómo sería el comportamiento de los automóviles, dependiendo de las luces, es fácil ver que tanto los carros del carril A tanto del B nunca entraría en conflicto, y no harían colisión. Lo mismo ocurre con las filas C y D. Por tanto, no hay ningún problema si la luz está en verde tanto para el carril A como el carril B simultáneamente.

De esta manera, es como se da la sincronización de los semaforos, pues dos de ellos irán siempre encendidos u apagados al mismo tiempo, y los que cambiarán serán los otros dos, que a su vez, estarán sincronizados uno con el otro.

Para la determinación del tiempo de activación de la Luz verde para los cuatro carriles se consideran como carriles principales los carriles A y B; y como carriles secundarios a los carriles C y D. Para la solución de nuestro problema se asignaron valores de tiempo para la activación de la luz verde en los carriles, dependiendo del congestionamiento de autos que se presente.


* Los tiempos reales en la Simulación van a disminuir considerablemente.

Para determinar la solución del congestionamiento en los carriles, se consideró que si se encuentran 10 o mas carros en los carriles principales(A,B) se tomaría como Congestionados CongA = true y CongB = true y si se encontraban 5 automóviles o más en los carriles secundarios(C,D) se tomaría como Congestionados CongC = true y CongD = true.

Una vez teniendo como valores booleanos el Congestionamiento en los carriles se realizó la siguiente tabla de verdad:


Posteriormente se realizó un Mapa de Karnaught para encontrar la ecuación booleana que nos ayude a controlar los semáforos, es decir, que determine qué semáforo es el que tendrá el paso.


Se analizó el Mapa siguiendo la lógica del OR y se obtuvo la siguiente ecuación:


SemAB = (A + B + D')·(A + C' + D')·(A + B + C')·(B + C' + D');

El estado del SemCD se pasaría como el contrario de SemAB, es decir:

SemCD = !SemAB;

A continuación se presentan las partes interesantes del código para comprender mejor la solución del problema. Para ver los códigos completos:



Código de la clase Sistema.java:


ListaCarros LisCarr = new ListaCarros();

    while(true) {
     if (CarrilA > 10) { CA = true; }
            if (CarrilB > 10) { CB = true; }
     if (CarrilC > 5 ) { CC = true; }
     if (CarrilD > 5 ) { CD = true; }

 SemAB = (CA | CB | !CD ) & (CA | !CC | !CD ) & (CA | CB | !CC) & (CB | !CC | !CD);
 SemCD = !SemAB;

 LisCarr.setEstado(SemAB,SemCD);

            if (SemAB == true) {
  EstadoAB = "Verde";
  EstadoCD = "Rojo";

            } else {
  EstadoAB = "Rojo";
  EstadoCD = "Verde"; 
     } 

 for(int r=0;r<20;r++){System.out.println("\n");}
  System.out.println("\t\t----------------------------------");
  System.out.println("\t\t~Sistema de Control de Semaforos~"); 
  System.out.println("\t\t----------------------------------");
  System.out.println("\n\n\t\t~Congestionamiento~");
  System.out.println("\n\tHay "+CarrilA+" carros en A");
  System.out.println("\n\tHay "+CarrilB+" carros en B");
  System.out.println("\n\tHay "+CarrilC+" carros en C");
  System.out.println("\n\tHay "+CarrilD+" carros en D");

  System.out.println("\n\n\t\t~Estado Semaforos~");
  System.out.println("\n\tA y B -> "+EstadoAB );
  System.out.println("\n\tC y D -> "+EstadoCD );

    Thread.sleep(5000);
    } //Fin del while


Código de la clase ListaCarros.java:

  a = ( ( Rand.nextInt(10000) % 16) + 1);
  CarrilA = CarrilA + a;
  if (CarrilA < 0) { CarrilA = 0; }
  b = ( ( Rand.nextInt(10000) % 16) + 1);
  CarrilB = CarrilB + b;
  if (CarrilB < 0) { CarrilB = 0; }
  c = ( ( Rand.nextInt(10000) % 8) + 1);
  CarrilC = CarrilC + c;
  if (CarrilC < 0) { CarrilC = 0; }
  d = ( ( Rand.nextInt(10000) % 8) + 1);
  CarrilD = CarrilD + d;
  if (CarrilD < 0) { CarrilD = 0; }

 if (aux = true) {

     if (SemAB = true) {

  CarrilA=CarrilA-3;
  CarrilB=CarrilB-2;

     if (CarrilA < 0) { CarrilA = 0; }
     if (CarrilB < 0) { CarrilB = 0; }

  CarrilC=CarrilC+5;
  CarrilD=CarrilD+5;

     } else {

  CarrilC=CarrilC-2;
  CarrilD=CarrilD-2;

     if (CarrilC < 0) { CarrilC = 0; }
     if (CarrilD < 0) { CarrilD = 0; }

  CarrilA=CarrilA+3;
  CarrilB=CarrilB+3; 
     }
 }

Sistema CtrlSem = new Sistema();
CtrlSem.start();
CtrlSem.setCarros(CarrilA,CarrilB,CarrilC,CarrilD);