Tuesday, February 5, 2013

Práctica 1 - Semáforos [Laboratorio]

Objetivo:
Desarrollar un sistema adaptativo que simule un sistema de semaforos interactuando entre si, para coordinar el trafico en un cruze de avenidas.

Explicación del cruce:
En los semáforos 'A', 'B', 'C' y 'D' se incluyen los estados 'Verde', 'Amarillo' y 'Rojo'; los semáforos 'E', 'F', 'G' y 'H' representan la 'Flecha', este estado le dice al conductor que avance mientras la 'Flecha' este encendida, y mientras esta este apagada, el conductor se detendrá.
El cruce cuenta con sensores de peso en cada calle, por lo que el tiempo de los semáforos se adaptara de acuerdo a la afluencia de automóviles. La cantidad de automóviles se verificara individualmente en cada 'semáforo' justo antes del inicio de su estado 'Verde', teniendo en cuenta también, la afluencia de automóviles en otros semáforos.
Este cruce esta catalogado como 'Peligroso' por lo que las 'vueltas con precaución (a la derecha)' están prohibidas, anunciándole esto a los conductores con la leyenda 'Espere su Luz'


Diagrama del cruce:

Funcionamiento:
Al inicio del programa, 'C' y 'G' estarán en verde, mientras que todos los demás estarán en rojo; este estado se mantendrá 30 segundos.
Al termino de este, 'G' se apagara, para dar lugar a 'A' a encenderse, mientras 'A' y 'C' esten en verde, 'B' y 'D' tienen que estar en rojo. Dicho estado se mantendrá por 1 minuto.
A continuación, 'C' se pondrá en rojo, dando lugar a 'E' a encenderse; dicho estado durara 30 segundos.
Después de esto, 'A' y 'E' se pondrán en rojo para que 'B' y 'F' puedan encenderse; este estado durara 30 segundos.
Continuando con el apagado de 'F' para que 'D' pueda encenderse, dejando así, encendidos en verde solamente a 'B' y 'D'; dicho estado durara 1 minuto.
Para terminar, 'B' se apagara y 'H' se encenderá; quedando así únicamente 'D' y 'H' encendidos; dicho estado durara 30 segundos.
Una vez que haya terminado este ciclo, comenzara de nuevo, pero cada semáforo verificara la cantidad de autos a transitar, antes  de encenderse en Verde, con el objetivo de modificar su duración, y permitir el paso de mayor cantidad de vehículos, desahogando así la avenida.

Condiciones del cruce representadas en este grafo:


  • Cuando 'A' este en verde, solamente 'E' y 'C' pueden estar en verde al mismo tiempo.
  • Cuando 'B' este en verde, solamente 'D' y 'F' pueden estar en verde al mismo tiempo.
  • Cuando 'C' este en verde, solamente 'A' y 'G' pueden estar en verde al mismo tiempo.
  • Cuando 'D' este en verde, solamente 'B' y 'H' pueden estar en verde al mismo tiempo.
  • Cuando 'E' este en verde, solamente 'A' y 'G' pueden estar en verde al mismo tiempo.
  • Cuando 'G' este en verde, solamente 'C' y 'E' pueden estar en verde al mismo tiempo.
  • Cuando 'H' este en verde, solamente 'D' y 'F' pueden estar en verde al mismo tiempo.

Esta es la matriz en el que se demuestra en base a como da el cruce



a
b
c
d
e
f
g
h
1
0
0
1
0
0
0
1
0
2
1
0
1
0
0
0
0
0
3
1
0
0
0
1
0
0
0
4
0
1
0
0
0
1
0
0
5
0
1
0
1
0
0
0
0
6
0
0
0
1
0
0
0
1

Los 1's son los carriles en verde.

Codigo:

El codigo esta hecho en Lenguaje C, esta realizado lo mas sencillo pero este simula que estan n carros en tales carriles, se utilizo funciones de espera, de tiempo y de generar cifras aleatorias para la realizacion de el semaforo.

Los siguientes modulos realizados para el programa son:

Modulo Semaforo:

Este codigo es el motor, por asi decirlo del programa, ya que en ella se imprime y se simula el paso de los carros en los carriles, pero muestra el numero de carros en cada carril.
int semaforo()
{
 int i,j;
    do
 {
  for(i=0;i<6;i++)
  {
   for(j=0;j<16;j++)
   {
    if(esto[i][0]==1&&car1>0) car1--;
     if(esto[i][1]==1&&car2>0) car2--;
     if(esto[i][2]==1&&car3>0) car3--;
     if(esto[i][3]==1&&car4>0) car4--;
     if(esto[i][4]==1&&car5>0) car5--;
     if(esto[i][5]==1&&car6>0) car6--;
     if(esto[i][6]==1&&car7>0) car7--;
     if(esto[i][7]==1&&car8>0) car8--;
    printf("\nCarriles en Semaforo en Verde: ");
     carriltr(esto[i][0],esto[i][1],esto[i][2],
esto[i][3],esto[i][4],esto[i][5],esto[i][6],esto[i][7]);
    printf("\nEsperen su luz: ");
     carriltr2(esto[i][0],esto[i][1],esto[i][2],
esto[i][3],esto[i][4],esto[i][5],esto[i][6],esto[i][7]);
     printf("\n\nCarril A: %d Carril B: %d \n",
car1,car2);
     printf("Carril C: %d Carril D: %d \n",car3,car4);
     printf("Carril E: %d Carril F: %d \n",car5,car6);
     printf("Carril G: %d Carril H: %d \n\n\n",car7,
car8);
          Sleep(500);
          system("cls");
   }
   car1=rand()%8 + car1;
      car2=rand()%8 + car2;
      car3=rand()%8 + car3;
      car4=rand()%8 + car4;
      car5=rand()%8 + car5;
      car6=rand()%8 + car6;
      car7=rand()%8 + car7;
      car8=rand()%8 + car8;
  }
 }   
    while(1);                 
    return 0;            
}
Modulos CarrilVerde y CarrilEspera:

En realidad estos son para indicar cuales carriles estan pasando y quienes estan esperando.

int carriltr(ca,cv,c2,cdd,ce,cf,cg,ch)
{
   if(ca==1) printf("A ");
    if(cv==1) printf("B ");
    if(c2==1) printf("C ");
    if(cdd==1) printf("D ");
    if(ce==1) printf("E ");
    if(cf==1) printf("F ");
    if(cg==1) printf("G ");
    if(ch==1) printf("H ");
    return 0;
}

int carriltr2(ca,cv,c2,cdd,ce,cf,cg,ch)
{
   if(ca==0) printf("A ");
    if(cv==0) printf("B ");
    if(c2==0) printf("C ");
    if(cdd==0) printf("D ");
    if(ce==0) printf("E ");
    if(cf==0) printf("F ");
    if(cg==0) printf("G ");
    if(ch==0) printf("H ");
    return 0;
}
Modulo Main

Es el modulo principal de arranque del programa, en ella se inicializa el numero de carros en cada carril.

int main()
{
    srand(time(NULL)); 
    printf("Semaforo en C\n\nEfren Morales\nDaniel Cruz\nAdrian\n\n");
    printf("\nPresione para iniciar");
    system("pause >nul");
    system("cls");
    car1=rand()%16;
    car2=rand()%16;
    car3=rand()%16;
    car4=rand()%16;
    car5=rand()%16;
    car6=rand()%16;
    car7=rand()%16;
    car8=rand()%16;
    semaforo();
    return 0;
}

Codigo Completo.


#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#include <windows.h>

int carros[100][7];
int num,n,carril;
int car1,car2,car3,car4,car5,car6,car7,car8;
int ca,cv,c2,cdd,ce,cf,cg,ch;
int esto[6][8] = {0,0,1,0,0,0,1,0,1,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,1,0,0,0,1};

int carriltr(ca,cv,c2,cdd,ce,cf,cg,ch)
{
   if(ca==1) printf("A ");
    if(cv==1) printf("B ");
    if(c2==1) printf("C ");
    if(cdd==1) printf("D ");
    if(ce==1) printf("E ");
    if(cf==1) printf("F ");
    if(cg==1) printf("G ");
    if(ch==1) printf("H ");
    return 0;
}

int carriltr2(ca,cv,c2,cdd,ce,cf,cg,ch)
{
   if(ca==0) printf("A ");
    if(cv==0) printf("B ");
    if(c2==0) printf("C ");
    if(cdd==0) printf("D ");
    if(ce==0) printf("E ");
    if(cf==0) printf("F ");
    if(cg==0) printf("G ");
    if(ch==0) printf("H ");
    return 0;
}

int semaforo()
{
 int i,j;
    do
 {
  for(i=0;i<6;i++)
  {
   for(j=0;j<16;j++)
   {
    if(esto[i][0]==1&&car1>0) car1--;
     if(esto[i][1]==1&&car2>0) car2--;
     if(esto[i][2]==1&&car3>0) car3--;
     if(esto[i][3]==1&&car4>0) car4--;
     if(esto[i][4]==1&&car5>0) car5--;
     if(esto[i][5]==1&&car6>0) car6--;
     if(esto[i][6]==1&&car7>0) car7--;
     if(esto[i][7]==1&&car8>0) car8--;
    printf("\nCarriles en Semaforo en Verde: ");
     carriltr(esto[i][0],esto[i][1],esto[i][2],
esto[i][3],esto[i][4],esto[i][5],esto[i][6],esto[i][7]);
    printf("\nEsperen su luz: ");
     carriltr2(esto[i][0],esto[i][1],esto[i][2],
esto[i][3],esto[i][4],esto[i][5],esto[i][6],esto[i][7]);
     printf("\n\nCarril A: %d Carril B: %d \n",
car1,car2);
     printf("Carril C: %d Carril D: %d \n",car3,car4);
     printf("Carril E: %d Carril F: %d \n",car5,car6);
     printf("Carril G: %d Carril H: %d \n\n\n",car7,
car8);
          Sleep(500);
          system("cls");
   }
   car1=rand()%8 + car1;
      car2=rand()%8 + car2;
      car3=rand()%8 + car3;
      car4=rand()%8 + car4;
      car5=rand()%8 + car5;
      car6=rand()%8 + car6;
      car7=rand()%8 + car7;
      car8=rand()%8 + car8;
  }
 }   
    while(1);                 
    return 0;            
}

int main()
{
    srand(time(NULL)); 
    printf("Semaforo en C\n\nEfren Morales\nDaniel Cruz\nAdrian\n\n");
    printf("\nPresione para iniciar");
    system("pause >nul");
    system("cls");
    car1=rand()%16;
    car2=rand()%16;
    car3=rand()%16;
    car4=rand()%16;
    car5=rand()%16;
    car6=rand()%16;
    car7=rand()%16;
    car8=rand()%16;
    semaforo();
    return 0;
}

Demostracion: