Simulaciones Computacionales / Mbed 2 deprecated Proyecto_3_simulacionesC

Dependencies:   mbed

main.cpp

Committer:
gcorderop
Date:
2015-11-28
Revision:
4:2c93a9f6c9fd
Parent:
3:2191cc27f1c4

File content as of revision 4:2c93a9f6c9fd:

#include "mbed.h"
#include <math.h>
Serial pc(USBTX, USBRX);
double mu_q1 = 8;           //Tasa de servicio de Cola Q1
double mu_q2 = 3*3;         //Tasa de servicio de Cola Q2 *3 por n�mero de servidores
double mu_q3 = 15;          //Tasa de servicio de Cola Q3

double lamb = 10;           //Tasa de llegada de paquetes

float P = 0.5;           //Probabilidad de llegada a Q2 (vs. Q1)
float S = 0.1;           //Probabilidad de llegada a Q1 (vs. Salida)

double t=0;               //Inicializaci�n del tiempo actual
double t_ant=0;           //Inicializacion del tiempo anterior
const int total =30000;
//double Vt[total];             //Vector de tiempos de eventos
//int k = 1;                 //Indice de los eventos ocurridos
float Tf=1000;           //Tiempo m�ximo de simulaci�n

int C_Q1=0;             //Log de N�mero de paquetes en la cola Q1
int C_Q2=0;             //Log de N�mero de paquetes en la cola Q2
int C_Q3=0;             //Log de N�mero de paquetes en la cola Q3

double t_arrival=0;       //Tiempo de llegada de paquetes
double t_out1=0;          //Tiempo de salida de la cola Q1
double t_out2=0;          //Tiempo de salida de la cola Q2
double t_out3=0;          //Tiempo de salida de la cola Q3
double t_min=10000;        //Variable auxiliar
int mini=100;            //Variable auxiliar

double evalmin[4];

double a=16807.0;
double m=2147483646.0;
int c=0;
double x=72841.0;           //semilla, cualquier numero entre 0 y m
double u=x/m;

int suma1 = 0; 
int suma2 = 0; 
int suma3 = 0;

double mean1 = 0;
double mean2 = 0;
double mean3 = 0;
double meanT = 0;

double uti1 = 0;
double uti2 = 0;
double uti3 = 0;
 
 

// RANDOM
double r_unif(void)
{
    x= (a*x+c)-m*floor((a*x+c)/m);
    u=x/m;
    return u;
}

// RANDOM EXPONENCIAL
double r_exp(double mu)
{
    double temp=-mu*log(r_unif());
    return temp;
}



int main()
{
    pc.baud(115200);

    for(k=1; k<total; k++) {
        t_arrival= r_exp(1.0/lamb);  //Tiempo de llegada del siguiente paquete
        if (C_Q1>0) {
            t_out1= r_exp(1.0/mu_q1);
        } else {
            t_out1=t_arrival+1.0;
        }
        if (C_Q2>0) {
            t_out2= r_exp(1.0/mu_q2);
        } else {
            t_out2=t_arrival+1.0;
        }
        if (C_Q3>0)  {
            t_out3= r_exp(1.0/mu_q3);
        } else {
            t_out3=t_arrival+1.0;
        }

//Se calcula el evento que pasara primero
        evalmin[0]=t_arrival;
        evalmin[1]= t_out1;
        evalmin[2]=t_out2;
        evalmin[3]= t_out3;
        t_min=100;
        for (int i=0; i<4; i++ ) {
            if (t_min > evalmin[i]) {
                t_min= evalmin[i];
                mini=i;
            }
        }
       
// Se actualiza el vector de tiempos
        t_ant=t;
        t=t+t_min;
//Se actualiza el log de eventos
        //Vt[k]=t;

//Ahora se analiza el evento de minimo tiempo y se aplican los cambios

        switch (mini) {
            case 0:
                //pc.printf("Arriving\r\n");
                if (r_unif() >= P) {
                    C_Q1 = C_Q1+1;  //Entra a Q1
                    C_Q2 = C_Q2;    //Q2 permanece igual
                    C_Q3 = C_Q3;    //Q3 permanece igual
                } else {
                    C_Q2 = C_Q2+1;  //Entra a Q2
                    C_Q1 = C_Q1;   //Q1 permanece igual
                    C_Q3 = C_Q3;   //Q3 permanece igual
                }
                break;
            case 1:             //La salida de la cola 1 es primero
                //pc.printf("Leaving 1\r\n");
                C_Q1 = C_Q1-1;  //Sale de Q1
                C_Q3 = C_Q3+1;  //Entra a Q3
                C_Q2 = C_Q2;    //Q2 permanece igual
                break;
            case 2:                  //La salida de la cola 2 es primero
                //pc.printf("Leaving 2\r\n");
                C_Q2 = C_Q2-1;      //Sale de Q2
                C_Q3 = C_Q3+1;      //Entra a Q3
                C_Q1 = C_Q1;        //Q1 permanece igual
                break;
            case 3:
                //pc.printf("Leaving 3\r\n");
                C_Q3 = C_Q3-1;     //Sale de Q3
                C_Q2 = C_Q2;       //Q2 permanece igual
                if (r_unif()<S) {    //Distr. uniforme para calcular prob 0.1
                    C_Q1 = C_Q1+1; //Entra a Q1
                } else {
                    C_Q1 = C_Q1;    //Q1 permanece igual
                }
                break;
            default:
                pc.printf("Error\r\n");
                //mini=0;
                break;
        }
        //pc.printf("T actual: %f\r\n",t);
        //pc.printf("Tiempo min: %f \r\n",t_min);
        //pc.printf("Ind min: %d \r\n",mini);
       // pc.printf("Cola 1: %d \r\n",C_Q1[k]);
       // pc.printf("Cola 2: %d \r\n",C_Q2[k]);
        //pc.printf("Cola 3: %d \r\n",C_Q3[k]);
        //pc.printf("Arrival: %.2f \r\n  ",t_arrival);
        //pc.printf("T_1: %.2f \r\n  ",t_out1);
        //pc.printf("T_2: %.2f \r\n  ",t_out2);
        //pc.printf("T_3: %.2f \r\n  ",t_out3);
       // pc.printf("-------------- \r\n");
        //suma1=suma1+C_Q1;
        //suma2=suma1+C_Q2;
        //suma3=suma1+C_Q3;
        mean1=(mean1*t_ant+C_Q1*(t-t_ant))/t;
        mean2=(mean2*t_ant+C_Q2*(t-t_ant))/t;
        mean3=(mean3*t_ant+C_Q3*(t-t_ant))/t;
        
        if (C_Q1==0) { 
            uti1 = uti1 + (t-t_ant);
            }
        if (C_Q2==0) { 
            uti2 = uti2 + (t-t_ant);
            }
        if (C_Q3==0) { 
            uti3 = uti3 + (t-t_ant);
            }
            
    }
    
    //mean2=suma2/total;
    //mean3=suma3/total;
    meanT = mean1+mean2+mean3;
    uti1 = 1-uti1/t;
    uti2 = 1-uti2/t;
    uti3 = 1-uti3/t;
    
    
    pc.printf("Media Cola 1: %f \r\n",mean1);
    pc.printf("Media Cola 2: %f \r\n",mean2);
    pc.printf("Media Cola 3: %f \r\n",mean3);
    pc.printf("Media Total : %f \r\n",meanT);
    pc.printf("Utilizacion Cola 1: %f \r\n",uti1);
    pc.printf("Utilizacion Cola 2: %f \r\n",uti2);
    pc.printf("Utilizacion Cola 3: %f \r\n",uti3);
    pc.printf("Tiempo medio Cola 1: %f \r\n",mean1/(lamb*0.5+mu_q3*S));
    pc.printf("Tiempo medio Cola 2: %f \r\n",mean2/(lamb*0.5));
    pc.printf("Tiempo medio Cola 3: %f \r\n",mean3/(mu_q1+mu_q2));
    pc.printf("Tiempo medio de todo el sistema : %f \r\n",meanT/lamb);
}