SlideShare a Scribd company logo
Task 1.1
Generate 1000 independent uniformly distributed random numbers (in range 0 to 1). Calculate the
sample mean and sample standard deviation of these numbers.
#include<math.h>
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include<iostream>
#include <iostream>
#include <string>
#include <cstdlib>
#include <iomanip>
#include <time.h>
using namespace std;
int main()
{
float Rand_Value[1000];
srand( (unsigned)time( NULL ) );
for (int i = 0; i < 1000; i++)
{
Rand_Value[i] = (float) rand()/RAND_MAX ;
//cout << (float) rand()/RAND_MAX << endl;
}
for (int j = 0; j < 1000; j++)
{
cout<<Rand_Value[j]<<endl; //= (float) rand()/RAND_MAX ;
//cout << (float) rand()/RAND_MAX << endl;
}
cin.get();
return 0;
}
Task 1.2
Generate 1000 independent exponentially distributed random numbers with mean 35.0. Calculate the
sample mean and sample standard deviation of these numbers.
-Since I preferred compiling C++ in windows using Visual studio I was not able to use “drand48” to
produce exponentially distributed random numbers so I implemented another method using “rand”
#include<math.h>
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include<iostream>
#include<math.h>
#include <iostream>
#include <string>
#include <cstdlib>
#include <iomanip>
#include <time.h>
using namespace std;
int main()
{
const int N = 1000;
float Rand_Value_exp[N];
float Rand_Value[N];
float mean = 35.0;
float exp,var=0, dev = 0;
float sum = 0;
srand( (unsigned)time( NULL ) );
for (int i = 0; i < N; i++)
{
Rand_Value_exp[i] = ( (int)(- log((float) rand() / RAND_MAX) *
mean + 0.5) );
//Rand_Value[i] = (float) rand()/ RAND_MAX;
sum = sum+Rand_Value_exp[i];
}
for (int j = 0; j < N; j++)
{
cout<<Rand_Value_exp[j]<<endl; //= (float) rand()/RAND_MAX ;
}
cout<<"Sample mean is equal:n";
exp = sum/N;
cout<<sum/N;
for(int k=0; k < N;k++)
{
var = pow((Rand_Value_exp[k] - exp),2) + var;
}
dev = sqrt(var)/N;
cout<<"n";
cout<<"Standard deviation="<<dev;
cin.get();
return 0;
}
Task 2
What conclusions did you draw from Lab 1 concerning:
1. Accuracy vs number of events for a fixed occupancy (or utilisation)?
2. Accuracy vs occupancy for a fixed number of events?
In a Single server Queuing modeling in fixed utilization ( where the ratio of arrival rate and departure
rate is fixed ) it can be seen that the higher accurate number can be produced when there are less
events .it means for example in modeling 1 case where the exact solution is known the accuracy is at its
highest.
In case of modeling for fixed number of events I have tested the program with 100 events with different
arrival rate and holding time ratio and It seems the accuracy is higher for higher utilization.
Task 3
Task 1 in Lab 2 asks for a comparison of the mean queue lengths of M/M/1 and M/D/1 queues. What
do you conclude? Give some evidence.
The difference between M/M/1 and M/D/1 is Deterministic service time which is constant, rather than
being exponentially distributed. So we modified the code by eliminating the “negexp” function and
compared the results .we observed that the mean queue length for the system with more random case
(M/M/1, which has both random arrivals and random service) is greater than the less random case
(M/D/1) which can be explained by looking at the formula for:
Average length of Queue in M/M/1 system
Average length of Queue in M/M/D system
Task 3.2
Summarize the code changes required between the M/M/1 ssq.c simulation and the M/M/N/N
simulation of Task 2 in Lab 2.
In this task the user inputs the numbers of servers to programs ( “NumberOfServer” ) and programs
simply multiples the numbers of packets being serviced by this n server.it also decrements the
DEPARTURE packets based on n. for example in the case of 3 servers 3 packets will be serviced and once
they depart the system 3 packets will be decremented from the list .
/* program ssq.c */
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <limits.h>
#include <iostream>
( )ρ
ρ
−
=
1
2
Q
( )ρ
ρ
−
=
12
2
Q
using namespace std;
#define NEW(type) (type *) malloc(sizeof(type))
#define ARRIVAL 1
#define DEPARTURE 2
/* Event by event simulation of a single server queue with infinite
waiting
room */
int
gmt, /* absolute time */
q, /* number of customers in the system */
narr, /* number of arrivals */
q_sum, /* sum of queue lengths at arrival instants */
iat, /* mean interarrival time */
service_time, /* mean holding time */
total_events; /* number of events to be simulated */
int NumberOfServer; /* Number of Server */
unsigned int
seed; /* seed for the random number generator */
typedef struct schedule_info{
int time; /* Time that event occurs */
int event_type; /* Type of event */
struct schedule_info *next; /* Pointer to next item in linked
list */
} EVENTLIST;
struct schedule_info
*head,
*tail;
int act(void);
int negexp(int);
void arrival(void);
void departure(void);
void schedule(int, int);
void sim_init(void);
/*************************************************************************
*/
int main(){
sim_init();
while (narr < total_events){
switch (act()){
case ARRIVAL:
arrival();
break;
case DEPARTURE:
departure();
break;
default:
printf("error in act proceduren");
exit(1);
break;
} /* end switch */
} /* end while */
printf("The mean queue length seen by arriving customers is: %8.4fn",
((float) q_sum) / narr);
int n; cin>>n;
return(0);
} /* end main */
/*************************************************************************
*/
int negexp(int mean) /* returns a negexp rv with mean `mean' */
{
return ( (int)(- log((float) rand() / RAND_MAX) * mean + 0.5) );
}
/*************************************************************************
*/
void arrival() /* a customer arrives */
{
//defines number of servers
narr += NumberOfServer; /* keep tally of number of
arrivals */
q_sum += q;
schedule(negexp(iat), ARRIVAL); /* schedule the next arrival */
//accumulates numbers of customers in the system based on number of
servers
q += NumberOfServer;
//marks the last node in the server as DEPARTURE
if (q == NumberOfServer)
schedule(negexp(service_time), DEPARTURE);
}
/*************************************************************************
*/
void departure() /* a customer departs */
{
//Decrements number of customers in the system after customer departs
q -= NumberOfServer;
if (q > 0)
schedule(negexp(service_time), DEPARTURE);
}
/*************************************************************************
*/
/*************************************************************************
*/
void schedule(int time_interval, int event) /* Schedules an event of type
*/
/* 'event' at time
'time_interval'
in the future */
{
int
event_time;
struct schedule_info
*x,
*t;
event_time = gmt + time_interval;
t = NEW(EVENTLIST);
for(x=head ; x->next->time<event_time && x->next!=tail ; x=x->next);
t->time = event_time;
t->event_type = event;
t->next = x->next;
x->next = t;
}
/*************************************************************************
*/
int act() /* find the next event and go to it */
{
int
type;
struct schedule_info
*x;
gmt = head->next->time; /* step time forward to the next event */
type = head->next->event_type; /* Record type of this next event */
x = head->next; /* Delete event from linked list */
head->next = head->next->next;
free(x);
return type; /* return value is type of the next event */
}
/*************************************************************************
/
/*************************************************************************
*/
void sim_init()
/* initialise the simulation */
{
printf("nenter the mean interarrival time and the mean holding
timen");
scanf("%d%d", &iat, &service_time);
printf("enter the total number of customers to be simulatedn");
scanf("%d", &total_events);
printf("enter the seedn");
scanf("%d", &seed);
srand(seed);
printf("enter Number Of Servern");
scanf("%d", &NumberOfServer);
//srand(seed);
head = NEW(EVENTLIST);
tail = NEW(EVENTLIST);
head->next = tail;
tail->next = tail;
//service_time = service_time /10;
q = 0;
narr = 0;
q_sum = 0;
schedule(negexp(iat), ARRIVAL); /* schedule the first arrival */
}
/*************************************************************************
*/
Task 4.1
Take the router queue simulation (r_ssq.c), and modify it so that the simulation measures the
average time spent in the system by packets, i.e. the average time between a packet arriving, and
completion of its service. Assume that the service discipline in first-in-first-out (FIFO).
Use these parameter values:
Mean packet length = 1000 octets (i.e. 8,000 bits) Router capacity = 1 Mbps (i.e. 1,000,000 bps)
Briefly summarize the code changes required to implement the above.
/* program ssq.c */
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <limits.h>
#include <iostream>
using namespace std;
#define NEW(type) (type *) malloc(sizeof(type))
#define ARRIVAL 1
#define DEPARTURE 2
/* Event by event simulation of a single server queue with infinite
waiting
room */
double
gmt, /* absolute time */
iat; /* mean interarrival time */
int
q, /* number of customers in the system */
narr, /* number of arrivals */
q_sum, /* sum of queue lengths at arrival instants */
r_capacity, /* router processing capacity */
mean_pkt_length, /* mean packet length */
total_events; /* number of events to be simulated */
double sumOfProcessTime = 0;
int arrivalTime = 0;
int departTime = 0;
int Count=0;
long
seed; /* seed for the random number generator */
typedef struct schedule_info{
double time; /* Time that event occurs */
int event_type; /* Type of event */
struct schedule_info *next; /* Pointer to next item in linked
list */
} EVENTLIST;
struct schedule_info
*head,
*tail;
int act(void);
double negexp(double);
double negexp_srv(int);
void arrival(void);
void departure(void);
void schedule(double, int);
void sim_init(void);
/*************************************************************************
*/
int main(){
sim_init();
while (narr < total_events){
switch (act()){
case ARRIVAL:
arrival();
break;
case DEPARTURE:
departure();
break;
default:
printf("error in act proceduren");
exit(1);
break;
} /* end switch */
} /* end while */
printf(" average time spent in the system by packets is: %8.4fn",
((float) q_sum) / narr);
printf("The answer for task 4.1 is:n");
//Calculating the average time
cout<< (double)(sumOfProcessTime/Count);
int age;
cin >> age;
return(0);
} /* end main */
/*************************************************************************
*/
double negexp(double mean) /* returns a negexp rv with mean `mean' */
{
return ( (int)(- log((float) rand() / RAND_MAX) * mean + 0.5) );
}
/*************************************************************************
*/
double negexp_srv(int mean) /* returns a negexp rv with mean `mean' */
{
int pkt_length;
pkt_length = (int)( (int)(- log((float) rand() / RAND_MAX) * mean + 0.5)
);
double service_time = (pkt_length*8.0)/(r_capacity*pow(10.0,6.0));
//Count number of received packet by router
Count++;
//Calculating the sum of process time for each packet
sumOfProcessTime = (service_time)+sumOfProcessTime;
return (service_time);
}
/*************************************************************************
*/
void arrival() /* a customer arrives */
{
narr += 1; /* keep tally of number of arrivals */
q_sum += q;
schedule(negexp(iat), ARRIVAL); /* schedule the next arrival */
q += 1;
if (q == 1)
{
schedule(negexp_srv(mean_pkt_length), DEPARTURE);
}
//Some of process time, which is the subtrack of arrival time and
departTime calculated in each depart time
//sumOfProcessTime = (arrivalTime - departTime)+sumOfProcessTime;
}
/*************************************************************************
*/
void departure() /* a customer departs */
{
q -= 1;
if (q > 0)
schedule(negexp_srv(mean_pkt_length), DEPARTURE);
}
/*************************************************************************
*/
/*************************************************************************
*/
void schedule(double time_interval, int event) /* Schedules an event of
type */
/* 'event' at time
'time_interval'
in the future */
{
double
event_time;
struct schedule_info
*x,
*t;
event_time = gmt + time_interval;
t = NEW(EVENTLIST);
for(x=head ; x->next->time<event_time && x->next!=tail ; x=x->next);
t->time = event_time;
t->event_type = event;
//if(event == 1)
//{
/// arrivalTime = event_time;
//}
//if(event == 2)
//{
//departTime = event_time;
//}
t->next = x->next;
x->next = t;
}
/*************************************************************************
*/
int act() /* find the next event and go to it */
{
int
type;
struct schedule_info
*x;
gmt = head->next->time; /* step time forward to the next event */
type = head->next->event_type; /* Record type of this next event */
x = head->next; /* Delete event from linked list */
head->next = head->next->next;
free(x);
return type; /* return value is type of the next event */
}
/*************************************************************************
/
/*************************************************************************
*/
void sim_init()
/* initialise the simulation */
{
int iar;
printf("nenter the mean packet arrival rate (pkts/sec) and the mean
packet length (octets)n");
scanf("%d%d", &iar, &mean_pkt_length);
printf("nenter the router transmission capacity (Mbps)n");
scanf("%d", &r_capacity);
printf("enter the total number of packets to be simulatedn");
scanf("%d", &total_events);
// providing automated seed from system time */
seed = time(NULL);
srand(seed);
head = NEW(EVENTLIST);
tail = NEW(EVENTLIST);
head->next = tail;
tail->next = tail;
gmt = 0.0;
q = 0;
narr = 0;
q_sum = 0;
iat = 1.0 / iar;
schedule(negexp(iat), ARRIVAL); /* schedule the first arrival */
}
/*************************************************************************
*/
Task 4.2
Present the results from your simulation of Task 4.1 in graphical form, for occupancies in the range 0.0
to 0.9, including 95% confidence intervals for the estimated mean system times. Show also the
theoretical values on your graph.
Above graph is based on mean system time produced for occupancy between 0.0 to .9 for 100 packets
by 1 Mbps Router and mean packet length of 1000 octet and confidence interval of %95(standard
deviation = .013971)
Mean service time for theoretical values are shown in following graph
occupancy 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9
Mean system time 0.000172 0.000664 0.000744 0.01996 0.02164 0.024264 0.027384 0.032608 0.03496
confidence %95 0.008659 0.008659 0.008659 0.008659 0.008659 0.008659 0.008659 0.008659 0.008659
-0.005
0
0.005
0.01
0.015
0.02
0.025
0.03
0.035
0.04
0 0.2 0.4 0.6 0.8 1
Occupancy
Mean system time
Mean system time
0
0.005
0.01
0.015
0.02
0.025
0 0.01 0.02 0.03 0.04 0.05
Theoritical values
Mean system time
Mean system time
Router Queue Simulation in C++ in MMNN and MM1 conditions

More Related Content

PPTX
Recent advances in CRISPR-CAS9 technology: an alternative to transgenic breeding
PPTX
Unix architecture | Operating System
PDF
Rules to Hack By - Offensivecon 2022 keynote
PPTX
Preprocessor
PDF
MVP 2 & App Demo
PDF
Informatica trabajo1
PPTX
Final 441
PPTX
Apperture - personas
Recent advances in CRISPR-CAS9 technology: an alternative to transgenic breeding
Unix architecture | Operating System
Rules to Hack By - Offensivecon 2022 keynote
Preprocessor
MVP 2 & App Demo
Informatica trabajo1
Final 441
Apperture - personas

Viewers also liked (20)

DOCX
Escritura
PPTX
Para de transportes
PDF
RAMEZ BORAIE PROJECT MANAGEMENTS
PDF
Encimera AEG HKL65310FB
TXT
Notice web kit
PPTX
Preso3
PDF
Formulas
PDF
KoaLinga
PPTX
INOCHI_boci 261109
PDF
Presentation inochi réalisations / développement - Accompagnateur Web
PDF
Parcial lauravpdf
PDF
Sisältöä elämään!® palvelusetelituottajaksi
PDF
Mruby jitプレゼン
PDF
Portafolio / Portfolio
PDF
Dossier marketing digital dans CCImag de mars 2016
PDF
Customer service dental practice presentation file
PPTX
BPM Day Campinas - Unicamp Digital - Elo Group - Pedro
PDF
Amazon Web Services の本気がみたいか !? スピードと高可用性を両立したゲームインフラの構築と事例
PDF
2014 SS wardrobe LRES
PDF
De Pechpeyrou, Gonzalez, Korchia - LA « GALAXIE » GROUPON : ETAT DES CONTROVE...
Escritura
Para de transportes
RAMEZ BORAIE PROJECT MANAGEMENTS
Encimera AEG HKL65310FB
Notice web kit
Preso3
Formulas
KoaLinga
INOCHI_boci 261109
Presentation inochi réalisations / développement - Accompagnateur Web
Parcial lauravpdf
Sisältöä elämään!® palvelusetelituottajaksi
Mruby jitプレゼン
Portafolio / Portfolio
Dossier marketing digital dans CCImag de mars 2016
Customer service dental practice presentation file
BPM Day Campinas - Unicamp Digital - Elo Group - Pedro
Amazon Web Services の本気がみたいか !? スピードと高可用性を両立したゲームインフラの構築と事例
2014 SS wardrobe LRES
De Pechpeyrou, Gonzalez, Korchia - LA « GALAXIE » GROUPON : ETAT DES CONTROVE...
Ad

Similar to Router Queue Simulation in C++ in MMNN and MM1 conditions (20)

PPTX
CPP Homework Help
PDF
Proposed pricing model for cloud computing
DOCX
Lab Assignment 4 CSE330 Spring 2014 Skeleton Code for ex.docx
PDF
Ping to Pong
PDF
Modify this code to use multiple threads with the same data1.Modif.pdf
PPS
Ns2 introduction 2
PDF
Introduction to reactive programming & ReactiveCocoa
DOCX
Rpc mechanism
PPTX
Reference Parameter, Passing object by reference, constant parameter & Defaul...
DOC
C - aptitude3
DOC
C aptitude questions
PPTX
C programming language tutorial
PPTX
Lecture no 3
PPTX
Fundamental of programming Fundamental of programming
PDF
Functions
PDF
Cassandra 2.1 boot camp, Overview
DOCX
Instruction1. Please read the two articles. (Kincheloe part 1 &.docx
PPTX
VCE Unit 01 (1).pptx
PPTX
PPTX
Kapacitor - Real Time Data Processing Engine
CPP Homework Help
Proposed pricing model for cloud computing
Lab Assignment 4 CSE330 Spring 2014 Skeleton Code for ex.docx
Ping to Pong
Modify this code to use multiple threads with the same data1.Modif.pdf
Ns2 introduction 2
Introduction to reactive programming & ReactiveCocoa
Rpc mechanism
Reference Parameter, Passing object by reference, constant parameter & Defaul...
C - aptitude3
C aptitude questions
C programming language tutorial
Lecture no 3
Fundamental of programming Fundamental of programming
Functions
Cassandra 2.1 boot camp, Overview
Instruction1. Please read the two articles. (Kincheloe part 1 &.docx
VCE Unit 01 (1).pptx
Kapacitor - Real Time Data Processing Engine
Ad

Router Queue Simulation in C++ in MMNN and MM1 conditions

  • 1. Task 1.1 Generate 1000 independent uniformly distributed random numbers (in range 0 to 1). Calculate the sample mean and sample standard deviation of these numbers. #include<math.h> #include <stdio.h> #include <stdlib.h> #include <limits.h> #include<iostream> #include <iostream> #include <string> #include <cstdlib> #include <iomanip> #include <time.h> using namespace std; int main() { float Rand_Value[1000]; srand( (unsigned)time( NULL ) ); for (int i = 0; i < 1000; i++) { Rand_Value[i] = (float) rand()/RAND_MAX ; //cout << (float) rand()/RAND_MAX << endl; } for (int j = 0; j < 1000; j++) { cout<<Rand_Value[j]<<endl; //= (float) rand()/RAND_MAX ; //cout << (float) rand()/RAND_MAX << endl; } cin.get(); return 0; }
  • 2. Task 1.2 Generate 1000 independent exponentially distributed random numbers with mean 35.0. Calculate the sample mean and sample standard deviation of these numbers. -Since I preferred compiling C++ in windows using Visual studio I was not able to use “drand48” to produce exponentially distributed random numbers so I implemented another method using “rand” #include<math.h> #include <stdio.h> #include <stdlib.h> #include <limits.h> #include<iostream> #include<math.h> #include <iostream> #include <string> #include <cstdlib> #include <iomanip> #include <time.h> using namespace std; int main() { const int N = 1000; float Rand_Value_exp[N]; float Rand_Value[N]; float mean = 35.0; float exp,var=0, dev = 0; float sum = 0; srand( (unsigned)time( NULL ) ); for (int i = 0; i < N; i++) {
  • 3. Rand_Value_exp[i] = ( (int)(- log((float) rand() / RAND_MAX) * mean + 0.5) ); //Rand_Value[i] = (float) rand()/ RAND_MAX; sum = sum+Rand_Value_exp[i]; } for (int j = 0; j < N; j++) { cout<<Rand_Value_exp[j]<<endl; //= (float) rand()/RAND_MAX ; } cout<<"Sample mean is equal:n"; exp = sum/N; cout<<sum/N; for(int k=0; k < N;k++) { var = pow((Rand_Value_exp[k] - exp),2) + var; } dev = sqrt(var)/N; cout<<"n"; cout<<"Standard deviation="<<dev; cin.get(); return 0; }
  • 4. Task 2 What conclusions did you draw from Lab 1 concerning: 1. Accuracy vs number of events for a fixed occupancy (or utilisation)? 2. Accuracy vs occupancy for a fixed number of events? In a Single server Queuing modeling in fixed utilization ( where the ratio of arrival rate and departure rate is fixed ) it can be seen that the higher accurate number can be produced when there are less events .it means for example in modeling 1 case where the exact solution is known the accuracy is at its highest. In case of modeling for fixed number of events I have tested the program with 100 events with different arrival rate and holding time ratio and It seems the accuracy is higher for higher utilization.
  • 5. Task 3 Task 1 in Lab 2 asks for a comparison of the mean queue lengths of M/M/1 and M/D/1 queues. What do you conclude? Give some evidence. The difference between M/M/1 and M/D/1 is Deterministic service time which is constant, rather than being exponentially distributed. So we modified the code by eliminating the “negexp” function and compared the results .we observed that the mean queue length for the system with more random case (M/M/1, which has both random arrivals and random service) is greater than the less random case (M/D/1) which can be explained by looking at the formula for: Average length of Queue in M/M/1 system Average length of Queue in M/M/D system Task 3.2 Summarize the code changes required between the M/M/1 ssq.c simulation and the M/M/N/N simulation of Task 2 in Lab 2. In this task the user inputs the numbers of servers to programs ( “NumberOfServer” ) and programs simply multiples the numbers of packets being serviced by this n server.it also decrements the DEPARTURE packets based on n. for example in the case of 3 servers 3 packets will be serviced and once they depart the system 3 packets will be decremented from the list . /* program ssq.c */ #include <stdio.h> #include <stdlib.h> #include <math.h> #include <limits.h> #include <iostream> ( )ρ ρ − = 1 2 Q ( )ρ ρ − = 12 2 Q
  • 6. using namespace std; #define NEW(type) (type *) malloc(sizeof(type)) #define ARRIVAL 1 #define DEPARTURE 2 /* Event by event simulation of a single server queue with infinite waiting room */ int gmt, /* absolute time */ q, /* number of customers in the system */ narr, /* number of arrivals */ q_sum, /* sum of queue lengths at arrival instants */ iat, /* mean interarrival time */ service_time, /* mean holding time */ total_events; /* number of events to be simulated */ int NumberOfServer; /* Number of Server */ unsigned int seed; /* seed for the random number generator */ typedef struct schedule_info{ int time; /* Time that event occurs */ int event_type; /* Type of event */ struct schedule_info *next; /* Pointer to next item in linked list */ } EVENTLIST; struct schedule_info *head, *tail; int act(void); int negexp(int); void arrival(void); void departure(void); void schedule(int, int); void sim_init(void); /************************************************************************* */ int main(){ sim_init(); while (narr < total_events){ switch (act()){ case ARRIVAL: arrival(); break;
  • 7. case DEPARTURE: departure(); break; default: printf("error in act proceduren"); exit(1); break; } /* end switch */ } /* end while */ printf("The mean queue length seen by arriving customers is: %8.4fn", ((float) q_sum) / narr); int n; cin>>n; return(0); } /* end main */ /************************************************************************* */ int negexp(int mean) /* returns a negexp rv with mean `mean' */ { return ( (int)(- log((float) rand() / RAND_MAX) * mean + 0.5) ); } /************************************************************************* */ void arrival() /* a customer arrives */ { //defines number of servers narr += NumberOfServer; /* keep tally of number of arrivals */ q_sum += q; schedule(negexp(iat), ARRIVAL); /* schedule the next arrival */ //accumulates numbers of customers in the system based on number of servers q += NumberOfServer; //marks the last node in the server as DEPARTURE if (q == NumberOfServer) schedule(negexp(service_time), DEPARTURE); } /************************************************************************* */ void departure() /* a customer departs */ { //Decrements number of customers in the system after customer departs q -= NumberOfServer;
  • 8. if (q > 0) schedule(negexp(service_time), DEPARTURE); } /************************************************************************* */ /************************************************************************* */ void schedule(int time_interval, int event) /* Schedules an event of type */ /* 'event' at time 'time_interval' in the future */ { int event_time; struct schedule_info *x, *t; event_time = gmt + time_interval; t = NEW(EVENTLIST); for(x=head ; x->next->time<event_time && x->next!=tail ; x=x->next); t->time = event_time; t->event_type = event; t->next = x->next; x->next = t; } /************************************************************************* */ int act() /* find the next event and go to it */ { int type; struct schedule_info *x; gmt = head->next->time; /* step time forward to the next event */ type = head->next->event_type; /* Record type of this next event */ x = head->next; /* Delete event from linked list */ head->next = head->next->next; free(x); return type; /* return value is type of the next event */ } /************************************************************************* / /************************************************************************* */ void sim_init() /* initialise the simulation */
  • 9. { printf("nenter the mean interarrival time and the mean holding timen"); scanf("%d%d", &iat, &service_time); printf("enter the total number of customers to be simulatedn"); scanf("%d", &total_events); printf("enter the seedn"); scanf("%d", &seed); srand(seed); printf("enter Number Of Servern"); scanf("%d", &NumberOfServer); //srand(seed); head = NEW(EVENTLIST); tail = NEW(EVENTLIST); head->next = tail; tail->next = tail; //service_time = service_time /10; q = 0; narr = 0; q_sum = 0; schedule(negexp(iat), ARRIVAL); /* schedule the first arrival */ } /************************************************************************* */ Task 4.1 Take the router queue simulation (r_ssq.c), and modify it so that the simulation measures the average time spent in the system by packets, i.e. the average time between a packet arriving, and completion of its service. Assume that the service discipline in first-in-first-out (FIFO). Use these parameter values: Mean packet length = 1000 octets (i.e. 8,000 bits) Router capacity = 1 Mbps (i.e. 1,000,000 bps) Briefly summarize the code changes required to implement the above. /* program ssq.c */ #include <stdio.h> #include <stdlib.h> #include <math.h> #include <time.h> #include <limits.h> #include <iostream>
  • 10. using namespace std; #define NEW(type) (type *) malloc(sizeof(type)) #define ARRIVAL 1 #define DEPARTURE 2 /* Event by event simulation of a single server queue with infinite waiting room */ double gmt, /* absolute time */ iat; /* mean interarrival time */ int q, /* number of customers in the system */ narr, /* number of arrivals */ q_sum, /* sum of queue lengths at arrival instants */ r_capacity, /* router processing capacity */ mean_pkt_length, /* mean packet length */ total_events; /* number of events to be simulated */ double sumOfProcessTime = 0; int arrivalTime = 0; int departTime = 0; int Count=0; long seed; /* seed for the random number generator */ typedef struct schedule_info{ double time; /* Time that event occurs */ int event_type; /* Type of event */ struct schedule_info *next; /* Pointer to next item in linked list */ } EVENTLIST; struct schedule_info *head, *tail; int act(void); double negexp(double); double negexp_srv(int); void arrival(void); void departure(void); void schedule(double, int); void sim_init(void); /************************************************************************* */ int main(){
  • 11. sim_init(); while (narr < total_events){ switch (act()){ case ARRIVAL: arrival(); break; case DEPARTURE: departure(); break; default: printf("error in act proceduren"); exit(1); break; } /* end switch */ } /* end while */ printf(" average time spent in the system by packets is: %8.4fn", ((float) q_sum) / narr); printf("The answer for task 4.1 is:n"); //Calculating the average time cout<< (double)(sumOfProcessTime/Count); int age; cin >> age; return(0); } /* end main */ /************************************************************************* */ double negexp(double mean) /* returns a negexp rv with mean `mean' */ { return ( (int)(- log((float) rand() / RAND_MAX) * mean + 0.5) ); } /************************************************************************* */ double negexp_srv(int mean) /* returns a negexp rv with mean `mean' */ { int pkt_length; pkt_length = (int)( (int)(- log((float) rand() / RAND_MAX) * mean + 0.5) ); double service_time = (pkt_length*8.0)/(r_capacity*pow(10.0,6.0)); //Count number of received packet by router Count++; //Calculating the sum of process time for each packet sumOfProcessTime = (service_time)+sumOfProcessTime; return (service_time);
  • 12. } /************************************************************************* */ void arrival() /* a customer arrives */ { narr += 1; /* keep tally of number of arrivals */ q_sum += q; schedule(negexp(iat), ARRIVAL); /* schedule the next arrival */ q += 1; if (q == 1) { schedule(negexp_srv(mean_pkt_length), DEPARTURE); } //Some of process time, which is the subtrack of arrival time and departTime calculated in each depart time //sumOfProcessTime = (arrivalTime - departTime)+sumOfProcessTime; } /************************************************************************* */ void departure() /* a customer departs */ { q -= 1; if (q > 0) schedule(negexp_srv(mean_pkt_length), DEPARTURE); } /************************************************************************* */ /************************************************************************* */ void schedule(double time_interval, int event) /* Schedules an event of type */ /* 'event' at time 'time_interval' in the future */ { double event_time; struct schedule_info
  • 13. *x, *t; event_time = gmt + time_interval; t = NEW(EVENTLIST); for(x=head ; x->next->time<event_time && x->next!=tail ; x=x->next); t->time = event_time; t->event_type = event; //if(event == 1) //{ /// arrivalTime = event_time; //} //if(event == 2) //{ //departTime = event_time; //} t->next = x->next; x->next = t; } /************************************************************************* */ int act() /* find the next event and go to it */ { int type; struct schedule_info *x; gmt = head->next->time; /* step time forward to the next event */ type = head->next->event_type; /* Record type of this next event */ x = head->next; /* Delete event from linked list */ head->next = head->next->next; free(x); return type; /* return value is type of the next event */ } /************************************************************************* / /************************************************************************* */ void sim_init() /* initialise the simulation */ { int iar; printf("nenter the mean packet arrival rate (pkts/sec) and the mean packet length (octets)n"); scanf("%d%d", &iar, &mean_pkt_length); printf("nenter the router transmission capacity (Mbps)n"); scanf("%d", &r_capacity); printf("enter the total number of packets to be simulatedn");
  • 14. scanf("%d", &total_events); // providing automated seed from system time */ seed = time(NULL); srand(seed); head = NEW(EVENTLIST); tail = NEW(EVENTLIST); head->next = tail; tail->next = tail; gmt = 0.0; q = 0; narr = 0; q_sum = 0; iat = 1.0 / iar; schedule(negexp(iat), ARRIVAL); /* schedule the first arrival */ } /************************************************************************* */ Task 4.2 Present the results from your simulation of Task 4.1 in graphical form, for occupancies in the range 0.0 to 0.9, including 95% confidence intervals for the estimated mean system times. Show also the theoretical values on your graph.
  • 15. Above graph is based on mean system time produced for occupancy between 0.0 to .9 for 100 packets by 1 Mbps Router and mean packet length of 1000 octet and confidence interval of %95(standard deviation = .013971) Mean service time for theoretical values are shown in following graph occupancy 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 Mean system time 0.000172 0.000664 0.000744 0.01996 0.02164 0.024264 0.027384 0.032608 0.03496 confidence %95 0.008659 0.008659 0.008659 0.008659 0.008659 0.008659 0.008659 0.008659 0.008659 -0.005 0 0.005 0.01 0.015 0.02 0.025 0.03 0.035 0.04 0 0.2 0.4 0.6 0.8 1 Occupancy Mean system time Mean system time 0 0.005 0.01 0.015 0.02 0.025 0 0.01 0.02 0.03 0.04 0.05 Theoritical values Mean system time Mean system time