Randoms y redes de colas

Dependencies:   mbed

Committer:
Sarahi
Date:
Fri Dec 04 02:12:47 2015 +0000
Revision:
1:659df3e8d3d6
Parent:
0:9aa5f35f299c
Simulaciones proyecto3

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Sarahi 0:9aa5f35f299c 1 #include "mbed.h"
Sarahi 0:9aa5f35f299c 2
Sarahi 0:9aa5f35f299c 3 Serial pc(USBTX, USBRX); // tx, rx
Sarahi 0:9aa5f35f299c 4 DigitalOut myled(LED2);
Sarahi 0:9aa5f35f299c 5 DigitalOut led_a(LED3);
Sarahi 0:9aa5f35f299c 6
Sarahi 0:9aa5f35f299c 7 #define u1 8
Sarahi 0:9aa5f35f299c 8 #define M1 1
Sarahi 0:9aa5f35f299c 9 #define u2 3
Sarahi 0:9aa5f35f299c 10 #define M2 3
Sarahi 0:9aa5f35f299c 11 #define u3 15
Sarahi 0:9aa5f35f299c 12 #define M3 1
Sarahi 0:9aa5f35f299c 13 #define pQ3Q1 0.1 // probability of sending Q3 output to the Q1 input
Sarahi 0:9aa5f35f299c 14 #define pQ3Out 0.9 // probability of delivering Q3 output as system output
Sarahi 1:659df3e8d3d6 15 #define tf 10000
Sarahi 0:9aa5f35f299c 16 #define lambda 10
Sarahi 0:9aa5f35f299c 17 #define pQ1I_Q2I 0.5
Sarahi 1:659df3e8d3d6 18 #define sz_a 1000
Sarahi 0:9aa5f35f299c 19
Sarahi 1:659df3e8d3d6 20 int Q1[sz_a]= {0}; // initial Q1
Sarahi 1:659df3e8d3d6 21 int Q2[sz_a]= {0}; // initial Q2
Sarahi 1:659df3e8d3d6 22 int Q3[sz_a]= {0}; // initial Q3
Sarahi 0:9aa5f35f299c 23 float t = 0; // initial simulation time
Sarahi 1:659df3e8d3d6 24 float t_events_Q1[sz_a] = {0}; // time stamps for the k events
Sarahi 1:659df3e8d3d6 25 float t_events_Q2[sz_a] = {0}; // time stamps for the k events
Sarahi 1:659df3e8d3d6 26 float t_events_Q3[sz_a]= {0}; // time stamps for the k events
Sarahi 0:9aa5f35f299c 27 int k=1; // event number
Sarahi 0:9aa5f35f299c 28
Sarahi 0:9aa5f35f299c 29 double SI = 0;
Sarahi 0:9aa5f35f299c 30
Sarahi 0:9aa5f35f299c 31 double Q1I1 = tf;
Sarahi 0:9aa5f35f299c 32 double Q1I2 = 0;
Sarahi 0:9aa5f35f299c 33 double Q1O = 0;
Sarahi 0:9aa5f35f299c 34
Sarahi 0:9aa5f35f299c 35 double Q2I1 = 0;
Sarahi 0:9aa5f35f299c 36 double Q2O = 0;
Sarahi 0:9aa5f35f299c 37
Sarahi 0:9aa5f35f299c 38 double Q3I1 = 0;
Sarahi 0:9aa5f35f299c 39 double Q3I2 = 0;
Sarahi 0:9aa5f35f299c 40 double Q3O = tf;
Sarahi 0:9aa5f35f299c 41
Sarahi 0:9aa5f35f299c 42
Sarahi 0:9aa5f35f299c 43 double SO = 0;
Sarahi 0:9aa5f35f299c 44
Sarahi 1:659df3e8d3d6 45 float Q1_lambda [sz_a]= {lambda*0.5};
Sarahi 1:659df3e8d3d6 46 float Q2_lambda [sz_a]= {lambda*0.5};
Sarahi 1:659df3e8d3d6 47 float Q3_lambda [sz_a]= {1/(u1*M1) + 1/(u2*M2)};
Sarahi 0:9aa5f35f299c 48
Sarahi 0:9aa5f35f299c 49 float t_Q1=0;
Sarahi 0:9aa5f35f299c 50 float t_Q2=0;
Sarahi 0:9aa5f35f299c 51 float t_Q3=0;
Sarahi 0:9aa5f35f299c 52
Sarahi 0:9aa5f35f299c 53 float eventtime_Q1=0;
Sarahi 0:9aa5f35f299c 54 float eventtime_Q2=0;
Sarahi 0:9aa5f35f299c 55 float eventtime_Q3=0;
Sarahi 0:9aa5f35f299c 56 float eventtime=0;
Sarahi 0:9aa5f35f299c 57
Sarahi 0:9aa5f35f299c 58 double min_2(double x, double y);
Sarahi 0:9aa5f35f299c 59 double min_3(double x, double y, double z);
Sarahi 0:9aa5f35f299c 60 int max_2(int x, int y);
Sarahi 0:9aa5f35f299c 61 double max_3(double x, double y, double z);
Sarahi 1:659df3e8d3d6 62 float var_rand(float x);
Sarahi 0:9aa5f35f299c 63
Sarahi 1:659df3e8d3d6 64 int Q1k;
Sarahi 1:659df3e8d3d6 65 int Q2k;
Sarahi 1:659df3e8d3d6 66 int Q3k;
Sarahi 1:659df3e8d3d6 67
Sarahi 1:659df3e8d3d6 68
Sarahi 1:659df3e8d3d6 69 float x_i=0;
Sarahi 1:659df3e8d3d6 70 float exprnd=0;
Sarahi 0:9aa5f35f299c 71 int i=0;
Sarahi 0:9aa5f35f299c 72 int main()
Sarahi 0:9aa5f35f299c 73 {
Sarahi 1:659df3e8d3d6 74
Sarahi 0:9aa5f35f299c 75 while( t <= tf ){
Sarahi 0:9aa5f35f299c 76 myled=0;
Sarahi 0:9aa5f35f299c 77 //exprnd(1/freq) simulate an exponential pdf with parameter = average time = 1 / arriving rate
Sarahi 0:9aa5f35f299c 78
Sarahi 1:659df3e8d3d6 79 // System input
Sarahi 1:659df3e8d3d6 80
Sarahi 1:659df3e8d3d6 81 SI = var_rand(lambda);
Sarahi 1:659df3e8d3d6 82
Sarahi 0:9aa5f35f299c 83
Sarahi 0:9aa5f35f299c 84 // Q1
Sarahi 0:9aa5f35f299c 85 Q1I1 = Q3O/pQ3Q1;
Sarahi 0:9aa5f35f299c 86 Q1I2 = SI/0.5;
Sarahi 1:659df3e8d3d6 87 printf("Sl: %lf \n", SI);
Sarahi 0:9aa5f35f299c 88 Q1_lambda [k]= (1/Q1I1 + 1/Q1I2);
Sarahi 0:9aa5f35f299c 89
Sarahi 0:9aa5f35f299c 90 //printf("Q1I1: %lf \n", Q1I1);
Sarahi 0:9aa5f35f299c 91 //printf("Q1I2: %lf \n", Q1I2);
Sarahi 0:9aa5f35f299c 92 //printf("Q1_lambda: %f \n", Q1_lambda[k]);
Sarahi 0:9aa5f35f299c 93
Sarahi 0:9aa5f35f299c 94 if(Q1[k] > 0){
Sarahi 1:659df3e8d3d6 95 Q1O = float(u1)*float (M1); // service time in the queue
Sarahi 1:659df3e8d3d6 96 Q1O= var_rand(Q1O);
Sarahi 0:9aa5f35f299c 97 }
Sarahi 0:9aa5f35f299c 98 else{
Sarahi 0:9aa5f35f299c 99 Q1O= min_2(Q1I1,Q1I2)+1.0;
Sarahi 0:9aa5f35f299c 100 }
Sarahi 0:9aa5f35f299c 101 //printf("Q1O: %lf \n", Q1O);
Sarahi 0:9aa5f35f299c 102
Sarahi 0:9aa5f35f299c 103 // Update queue Q1
Sarahi 0:9aa5f35f299c 104 t_events_Q1[k]=(t+min_3(Q1I1,Q1I2,Q1O));
Sarahi 0:9aa5f35f299c 105 //printf("Q1K :%d \n",Q1[k]);
Sarahi 0:9aa5f35f299c 106 if ( (Q1O < Q1I1) && (Q1O < Q1I2) ){
Sarahi 0:9aa5f35f299c 107 Q1k=Q1[k]- 1;
Sarahi 0:9aa5f35f299c 108 Q1[k+1]=max_2(0,Q1k); // Q1 is reduced by one
Sarahi 0:9aa5f35f299c 109
Sarahi 0:9aa5f35f299c 110 }
Sarahi 0:9aa5f35f299c 111 else {
Sarahi 0:9aa5f35f299c 112 Q1[k+1]=Q1[k]+1; // Q1 is increased by one due to Q1 input (only one of the two inputs is considered)
Sarahi 0:9aa5f35f299c 113 }
Sarahi 0:9aa5f35f299c 114
Sarahi 0:9aa5f35f299c 115 //printf("Q1K :%d \n",Q1[k+1]);
Sarahi 0:9aa5f35f299c 116 eventtime_Q1 = min_3(Q1I1, Q1I2, Q1O);
Sarahi 0:9aa5f35f299c 117 t_Q1 = t;
Sarahi 0:9aa5f35f299c 118 t_Q1 = t_Q1 + eventtime_Q1;
Sarahi 0:9aa5f35f299c 119
Sarahi 0:9aa5f35f299c 120 // Q2
Sarahi 0:9aa5f35f299c 121 Q2I1 = SI/pQ1I_Q2I;
Sarahi 0:9aa5f35f299c 122 //printf("Q2I1 :%lf \n",Q2I1);
Sarahi 0:9aa5f35f299c 123 Q2_lambda[k] = (1.0/Q2I1);
Sarahi 0:9aa5f35f299c 124 //printf("Q2_lambda :%f \n",Q2_lambda[k]);
Sarahi 0:9aa5f35f299c 125
Sarahi 0:9aa5f35f299c 126 if(Q2[k] > 0){
Sarahi 1:659df3e8d3d6 127 Q2O = float(u2)*float(M2); // service time in the queue
Sarahi 1:659df3e8d3d6 128 Q2O= var_rand(Q2O);
Sarahi 0:9aa5f35f299c 129 }
Sarahi 0:9aa5f35f299c 130 else{
Sarahi 0:9aa5f35f299c 131 Q2O = Q2I1 + 1.0;
Sarahi 0:9aa5f35f299c 132 }
Sarahi 0:9aa5f35f299c 133 //printf("Q20 :%f \n",Q2O);
Sarahi 0:9aa5f35f299c 134
Sarahi 0:9aa5f35f299c 135 // Update queue Q2
Sarahi 0:9aa5f35f299c 136 t_events_Q2[k]=(t+min_2(Q2I1, Q2O));
Sarahi 0:9aa5f35f299c 137 //printf("Q2[k]: %d\n",Q2[k]);
Sarahi 0:9aa5f35f299c 138 if ( Q2O < Q2I1 ){
Sarahi 0:9aa5f35f299c 139 Q2k=Q2[k]- 1;
Sarahi 0:9aa5f35f299c 140 // printf("Q2K %d: \n",Q2k);
Sarahi 0:9aa5f35f299c 141 Q2[k+1]=max_2(0,Q2k); // Q2 is reduced by one
Sarahi 0:9aa5f35f299c 142 }
Sarahi 0:9aa5f35f299c 143 else{
Sarahi 0:9aa5f35f299c 144 Q2[k+1]= (Q2[k])+1; // Q2 is increased by one due to Q2 input
Sarahi 0:9aa5f35f299c 145 }
Sarahi 0:9aa5f35f299c 146 //printf("Q2[k]: %d\n",Q2[k+1]);
Sarahi 0:9aa5f35f299c 147 eventtime_Q2 = min_2(Q2I1, Q2O);
Sarahi 0:9aa5f35f299c 148 t_Q2 = t;
Sarahi 0:9aa5f35f299c 149 t_Q2 = t_Q2 + eventtime_Q2;
Sarahi 0:9aa5f35f299c 150
Sarahi 0:9aa5f35f299c 151
Sarahi 0:9aa5f35f299c 152 //Q3
Sarahi 0:9aa5f35f299c 153 Q3I1 = Q1O;
Sarahi 0:9aa5f35f299c 154 Q3I2 = Q2O;
Sarahi 0:9aa5f35f299c 155 //printf("Q3I1: %lf \n",Q3I1);
Sarahi 0:9aa5f35f299c 156 //printf("Q3I2: %lf \n",Q3I2);
Sarahi 0:9aa5f35f299c 157 Q3_lambda [k]= 1/Q3I1 + 1/Q3I2;
Sarahi 0:9aa5f35f299c 158 //printf("Q3_lambda: %f \n",Q3_lambda[k]);
Sarahi 0:9aa5f35f299c 159
Sarahi 0:9aa5f35f299c 160 if(Q3[k] > 0){
Sarahi 1:659df3e8d3d6 161 Q3O = float(u3)*float(M3); // service time in the queue
Sarahi 1:659df3e8d3d6 162 Q3O= var_rand(Q3O);
Sarahi 0:9aa5f35f299c 163 }
Sarahi 0:9aa5f35f299c 164 else{
Sarahi 0:9aa5f35f299c 165 Q3O = min_2(Q1O, Q2O) + 1.0;
Sarahi 0:9aa5f35f299c 166 }
Sarahi 0:9aa5f35f299c 167
Sarahi 0:9aa5f35f299c 168 //printf("Q3O: %lf \n",Q3O);
Sarahi 0:9aa5f35f299c 169 // Update queue Q3
Sarahi 0:9aa5f35f299c 170 t_events_Q3[k]= t+min_3(Q3I1, Q3I2, Q3O);
Sarahi 0:9aa5f35f299c 171 //printf("Q3[k]: %d \n", Q3[k]);
Sarahi 0:9aa5f35f299c 172 if ( (Q3O < Q3I1) && (Q3O < Q3I2) ){
Sarahi 0:9aa5f35f299c 173 Q3k=Q3[k]- 1;
Sarahi 0:9aa5f35f299c 174 // printf("Q3k: %f \n", Q3k);
Sarahi 0:9aa5f35f299c 175 Q3[k+1]=max_2(0,Q3k); // Q3 is reduced by one
Sarahi 0:9aa5f35f299c 176 }
Sarahi 0:9aa5f35f299c 177 else {
Sarahi 0:9aa5f35f299c 178 Q3[k+1]= Q3[k] + 1; // Q3 is increased by one due to Q3 input (only one of the two inputs is considered)
Sarahi 0:9aa5f35f299c 179
Sarahi 0:9aa5f35f299c 180 }
Sarahi 0:9aa5f35f299c 181 //printf("Q3[k]: %d \n",Q3[k+1]);
Sarahi 0:9aa5f35f299c 182 eventtime_Q3 = min_3(Q3I1, Q3I2, Q3O);
Sarahi 0:9aa5f35f299c 183 t_Q3 = t;
Sarahi 0:9aa5f35f299c 184 t_Q3 = t_Q3 + eventtime_Q2;
Sarahi 0:9aa5f35f299c 185
Sarahi 0:9aa5f35f299c 186 // System output
Sarahi 0:9aa5f35f299c 187 SO = Q3O/pQ3Out;
Sarahi 0:9aa5f35f299c 188
Sarahi 0:9aa5f35f299c 189 eventtime = max_3(eventtime_Q1, eventtime_Q2, eventtime_Q3);
Sarahi 0:9aa5f35f299c 190 t = t + eventtime;
Sarahi 0:9aa5f35f299c 191 k=k+1;
Sarahi 0:9aa5f35f299c 192
Sarahi 0:9aa5f35f299c 193 myled=1;
Sarahi 0:9aa5f35f299c 194 wait(0.5);
Sarahi 0:9aa5f35f299c 195 }
Sarahi 0:9aa5f35f299c 196
Sarahi 1:659df3e8d3d6 197
Sarahi 0:9aa5f35f299c 198 led_a=0;
Sarahi 1:659df3e8d3d6 199 wait(1);
Sarahi 1:659df3e8d3d6 200 pc.printf("k=");
Sarahi 1:659df3e8d3d6 201 pc.printf("%d\r\n",k);
Sarahi 1:659df3e8d3d6 202 wait(.5);
Sarahi 1:659df3e8d3d6 203
Sarahi 1:659df3e8d3d6 204 pc.printf("Q1\n");
Sarahi 1:659df3e8d3d6 205 for (i=0; i<=k; i++){
Sarahi 1:659df3e8d3d6 206 pc.printf("%d, ",Q1[i]);
Sarahi 1:659df3e8d3d6 207
Sarahi 1:659df3e8d3d6 208 }
Sarahi 1:659df3e8d3d6 209
Sarahi 1:659df3e8d3d6 210 pc.printf("\n Q2\n");
Sarahi 1:659df3e8d3d6 211 for (i=0; i<=k; i++){
Sarahi 1:659df3e8d3d6 212 pc.printf("%d, ",Q2[i]);
Sarahi 1:659df3e8d3d6 213
Sarahi 1:659df3e8d3d6 214 }
Sarahi 1:659df3e8d3d6 215
Sarahi 1:659df3e8d3d6 216 pc.printf("\n Q3\n");
Sarahi 1:659df3e8d3d6 217 for (i=0; i<=k; i++){
Sarahi 1:659df3e8d3d6 218 pc.printf("%d, ",Q3[i]);
Sarahi 1:659df3e8d3d6 219
Sarahi 1:659df3e8d3d6 220 }
Sarahi 1:659df3e8d3d6 221
Sarahi 1:659df3e8d3d6 222 pc.printf("\n Q1_lambda\n");
Sarahi 0:9aa5f35f299c 223 for (i=0; i<=k; i++){
Sarahi 1:659df3e8d3d6 224 pc.printf("%f, ",Q1_lambda[i]);
Sarahi 1:659df3e8d3d6 225
Sarahi 1:659df3e8d3d6 226 }
Sarahi 1:659df3e8d3d6 227
Sarahi 1:659df3e8d3d6 228 pc.printf("\n Q2_lambda\n");
Sarahi 1:659df3e8d3d6 229 for (i=0; i<=k; i++){
Sarahi 1:659df3e8d3d6 230 pc.printf("%f, ",Q2_lambda[i]);
Sarahi 1:659df3e8d3d6 231
Sarahi 1:659df3e8d3d6 232 }
Sarahi 1:659df3e8d3d6 233 pc.printf("\n Q3_lambda\n");
Sarahi 1:659df3e8d3d6 234 for (i=0; i<=k; i++){
Sarahi 1:659df3e8d3d6 235 pc.printf("%f, ",Q3_lambda[i]);
Sarahi 1:659df3e8d3d6 236
Sarahi 1:659df3e8d3d6 237 }
Sarahi 1:659df3e8d3d6 238
Sarahi 1:659df3e8d3d6 239 pc.printf("\n t_events_Q1\n");
Sarahi 1:659df3e8d3d6 240 for (i=0; i<=k; i++){
Sarahi 1:659df3e8d3d6 241 pc.printf("%f, ",t_events_Q1[i]);
Sarahi 1:659df3e8d3d6 242
Sarahi 1:659df3e8d3d6 243 }
Sarahi 1:659df3e8d3d6 244 pc.printf("\n t_events_Q2\n");
Sarahi 1:659df3e8d3d6 245 for (i=0; i<=k; i++){
Sarahi 1:659df3e8d3d6 246 pc.printf("%f, ",t_events_Q2[i]);
Sarahi 1:659df3e8d3d6 247
Sarahi 1:659df3e8d3d6 248 }
Sarahi 1:659df3e8d3d6 249
Sarahi 1:659df3e8d3d6 250 pc.printf("\n t_events_Q3\n");
Sarahi 1:659df3e8d3d6 251 for (i=0; i<=k; i++){
Sarahi 1:659df3e8d3d6 252 pc.printf("%f, ",t_events_Q3[i]);
Sarahi 1:659df3e8d3d6 253
Sarahi 1:659df3e8d3d6 254 }
Sarahi 1:659df3e8d3d6 255
Sarahi 0:9aa5f35f299c 256
Sarahi 0:9aa5f35f299c 257 led_a=1;
Sarahi 0:9aa5f35f299c 258 }
Sarahi 0:9aa5f35f299c 259
Sarahi 0:9aa5f35f299c 260
Sarahi 0:9aa5f35f299c 261 //-----------------------Función para obtener el minimo de 2 números ---------------------------------------------//
Sarahi 0:9aa5f35f299c 262 double min_2(double x, double y){
Sarahi 0:9aa5f35f299c 263 double min=0;
Sarahi 0:9aa5f35f299c 264 if (x<y){
Sarahi 0:9aa5f35f299c 265 min= x;
Sarahi 0:9aa5f35f299c 266 }
Sarahi 0:9aa5f35f299c 267 else {
Sarahi 0:9aa5f35f299c 268 min=y;
Sarahi 0:9aa5f35f299c 269 }
Sarahi 0:9aa5f35f299c 270 return min;
Sarahi 0:9aa5f35f299c 271
Sarahi 0:9aa5f35f299c 272 }
Sarahi 0:9aa5f35f299c 273
Sarahi 0:9aa5f35f299c 274 ///-----------------------Función para obtener el minimo de 3 números ---------------------------------------------//
Sarahi 0:9aa5f35f299c 275 double min_3(double x, double y, double z){
Sarahi 0:9aa5f35f299c 276 double min=0;
Sarahi 0:9aa5f35f299c 277 if ((x<y)&&(x<z)){
Sarahi 0:9aa5f35f299c 278 min= x;
Sarahi 0:9aa5f35f299c 279 }
Sarahi 0:9aa5f35f299c 280 else if ((y<x)&&(y<z)){
Sarahi 0:9aa5f35f299c 281 min= y;
Sarahi 0:9aa5f35f299c 282 }
Sarahi 0:9aa5f35f299c 283 else {
Sarahi 0:9aa5f35f299c 284 min=z;
Sarahi 0:9aa5f35f299c 285 }
Sarahi 0:9aa5f35f299c 286 return min;
Sarahi 0:9aa5f35f299c 287 }
Sarahi 0:9aa5f35f299c 288
Sarahi 0:9aa5f35f299c 289 //-----------------------Función para obtener el miáximo de 2 números ---------------------------------------------//
Sarahi 0:9aa5f35f299c 290 int max_2(int x, int y){
Sarahi 0:9aa5f35f299c 291 int max=0;
Sarahi 0:9aa5f35f299c 292 if(x>y){
Sarahi 0:9aa5f35f299c 293 max=x;
Sarahi 0:9aa5f35f299c 294 }
Sarahi 0:9aa5f35f299c 295 else {
Sarahi 0:9aa5f35f299c 296 max=y;
Sarahi 0:9aa5f35f299c 297 }
Sarahi 0:9aa5f35f299c 298 return max;
Sarahi 0:9aa5f35f299c 299 }
Sarahi 0:9aa5f35f299c 300
Sarahi 0:9aa5f35f299c 301
Sarahi 0:9aa5f35f299c 302 //-----------------------Función para obtener el máximo de 3 números ---------------------------------------------//
Sarahi 0:9aa5f35f299c 303 double max_3(double x, double y, double z){
Sarahi 0:9aa5f35f299c 304 double max=0;
Sarahi 0:9aa5f35f299c 305 if ((x>y)&&(x>z)){
Sarahi 0:9aa5f35f299c 306 max= x;
Sarahi 0:9aa5f35f299c 307 }
Sarahi 0:9aa5f35f299c 308 else if ((y>x)&&(y>z)){
Sarahi 0:9aa5f35f299c 309 max= y;
Sarahi 0:9aa5f35f299c 310 }
Sarahi 0:9aa5f35f299c 311 else {
Sarahi 0:9aa5f35f299c 312 max=z;
Sarahi 0:9aa5f35f299c 313 }
Sarahi 0:9aa5f35f299c 314 return max;
Sarahi 1:659df3e8d3d6 315 }
Sarahi 1:659df3e8d3d6 316
Sarahi 1:659df3e8d3d6 317 float var_rand(double x){
Sarahi 1:659df3e8d3d6 318 x_i= rand()%100;
Sarahi 1:659df3e8d3d6 319 x_i= x_i/float(100);
Sarahi 1:659df3e8d3d6 320 //pc.printf("x_i: %f\n",x_i);
Sarahi 1:659df3e8d3d6 321 exprnd=(-1.0)*float(x)*log(x_i);
Sarahi 1:659df3e8d3d6 322 return exprnd;
Sarahi 0:9aa5f35f299c 323 }