Simulaciones Computacionales / Mbed 2 deprecated Proyecto_3_simulacionesC

Dependencies:   mbed

main.cpp

Committer:
JhonToroM
Date:
2015-11-16
Revision:
0:9204c5565a45
Child:
1:6e6574fdb585

File content as of revision 0:9204c5565a45:

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

int 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)

float t=0;               //Inicializaci�n del tiempo actual
float Vt[]= {};             //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[]= {};             //Log de N�mero de paquetes en la cola Q1
int C_Q2[]= {};             //Log de N�mero de paquetes en la cola Q2
int C_Q3[]= {};             //Log de N�mero de paquetes en la cola Q3

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

float evalmin[4] = {t_arrival , t_out1 , t_out2 , t_out3};

float a=1103515245;
float m=4294967295;
int c=12345;
float x=100;
float u=x/m;

// 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(float mu)
{
    double temp=-mu*log(r_unif());
    return temp;
}



int main()
{
    pc.baud(115200);
    for(k=1; k<3000; k++) {
        t_arrival= r_exp(1/lamb);  //Tiempo de llegada del siguiente paquete
        if (C_Q1[k]>0) {
            t_out1= r_exp(1/mu_q1);
        } else {
            t_out1=t_arrival+1;
        }
        if (C_Q2[k]>0) {
            t_out2= r_exp(1/mu_q2);
        } else {
            t_out2=t_arrival+1;
        }
        if (C_Q3[k]>0)  {
            t_out3= r_exp(1/mu_q3);
        } else {
            t_out3=t_arrival+1;
        }

//Se calcula el evento que pasara primero
        int i;
        for (i=0; i<4; i++ ) {
            if(t_min > evalmin[i]) {
                t_min= evalmin[i];
                mini=i;
            }
        }

// Se actualiza el vector de tiempos
        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 1:
                if (r_unif() >= P) {
                    C_Q1[k] = C_Q1[k-1]+1;  //Entra a Q1
                    C_Q2[k] = C_Q2[k-1];    //Q2 permanece igual
                    C_Q3[k] = C_Q3[k-1];    //Q3 permanece igual
                } else {
                    C_Q2[k] = C_Q2[k-1]+1;  //Entra a Q2
                    C_Q1[k] = C_Q1[k-1];   //Q1 permanece igual
                    C_Q3[k] = C_Q3[k-1];   //Q3 permanece igual
                }
                break;
            case 2:             //La salida de la cola 1 es primero
                C_Q1[k] = C_Q1[k-1]-1;  //Sale de Q1
                C_Q3[k] = C_Q3[k-1]+1;  //Entra a Q3
                C_Q2[k] = C_Q2[k-1];    //Q2 permanece igual
                break;
            case 3:                  //La salida de la cola 2 es primero
                C_Q2[k] = C_Q2[k-1]-1;      //Sale de Q2
                C_Q3[k] = C_Q3[k-1]+1;      //Entra a Q3
                C_Q1[k] = C_Q1[k-1];        //Q1 permanece igual
                break;
            case 4:
                C_Q3[k] = C_Q3[k-1]-1;     //Sale de Q3
                C_Q2[k] = C_Q2[k-1];       //Q2 permanece igual
                if (r_unif()<S) {    //Distr. uniforme para calcular prob 0.1
                    C_Q1[k] = C_Q1[k-1]+1; //Entra a Q1
                } else {
                    C_Q1[k] = C_Q1[k-1];    //Q1 permanece igual
                }
                break;
        }
        pc.printf("%.2f \r\n  ",C_Q1[k]);
    }
    
}