#include
#include
#include
#include
//#include "lcgrand.h" /* Header file for random-number generator. */
#define Q_LIMIT 100 /* Limit on queue length. */
#define BUSY 1 /* Mnemonics for server's being busy */
#define IDLE 0 /* and idle. */
int next_event_type, num_custs_delayed, num_delays_required, num_events,
num_in_q, server_status;
float area_num_in_q, area_server_status, mean_interarrival, mean_service,
sim_time, time_arrival[Q_LIMIT + 1], time_last_event, time_next_event[3],
total_of_delays;
FILE *infile, *outfile;
void initialize(void);
void timing(void);
void arrive(void);
void depart(void);
void report(void);
void update_time_avg_stats(void);
float expon(float mean);
main() /* Main function. */
{
/* Open input and output files. */
infile = fopen("mm1.in", "r");
utfile = fopen("mm1.out", "w");
/* Specify the number of events for the timing function. */
num_events = 2;
srand((unsigned)time(NULL));
/* Read input parameters. */
fscanf(infile, "%f %f %d", mean_interarrival, mean_service,
num_delays_required);
//printf("%f",mean_interarrival); 1.0 0.5 1000; 、、
/* Write report heading and input parameters. */
fprintf(outfile, "Single-server queueing system\n\n");
fprintf(outfile, "Mean interarrival time%11.3f minutes\n\n",
mean_interarrival);
fprintf(outfile, "Mean service time%16.3f minutes\n\n", mean_service);
fprintf(outfile, "Number of customers%14d\n\n", num_delays_required);
/* Initialize the simulation. */
initialize();
/* Run the simulation while more delays are still needed., */
while (num_custs_delayed Q_LIMIT)
{
/* The queue has overflowed, so stop the simulation.
, */
fprintf(outfile, "\nOverflow of the array time_arrival at");
fprintf(outfile, " time %f", sim_time);
exit(2);
}
/* There is still room in the queue, so store the time of arrival of the
arriving customer at the (new) end of time_arrival.
, time_arrival() */
time_arrival[num_in_q] = sim_time;//
}
else
{
/* Server is idle, so arriving customer has a delay of zero. (The
following two statements are for program clarity and do not affect
the results of the simulation.)
, 0(,) */
delay = 0.0;
total_of_delays += delay;
/* Increment the number of customers delayed, and make server busy.
, 1 */
++num_custs_delayed;
server_status = BUSY;
/* Schedule a departure (service completion).
*/
time_next_event[2] = sim_time + expon(mean_service);
}
}
void depart(void) /* Departure event function. */
{
int i;
float delay;
/* Check to see whether the queue is empty.
*/
if (num_in_q == 0)
{
/* The queue is empty so make the server idle and eliminate the
departure (service completion) event from consideration.
,,
。 */
server_status = IDLE;
time_next_event[2] = 1.0e+30;
}
else
{
/* The queue is nonempty, so decrement the number of customers in
queue. , */
--num_in_q;
/* Compute the delay of the customer who is beginning service and update
the total delay accumulator.
*/
delay = sim_time - time_arrival[1];// = -
total_of_delays += delay;//
/* Increment the number of customers delayed, and schedule departure.
, 1 */
++num_custs_delayed;
time_next_event[2] = sim_time + expon(mean_service);
/* Move each customer in queue (if any) up one place.
*/
for (i = 1; i <= num_in_q; ++i)
time_arrival[i] = time_arrival[i + 1];
}
}
void report(void) /* Report generator function. */
{
/* Compute and write estimates of desired measures of performance.
*/
fprintf(outfile, "\n\nAverage delay in queue%11.3f minutes\n\n",
total_of_delays / num_custs_delayed);//
fprintf(outfile, "Average number in queue%10.3f\n\n",
area_num_in_q / sim_time);//
fprintf(outfile, "Server utilization%15.3f\n\n",
area_server_status / sim_time);//
fprintf(outfile, "Time simulation ended%12.3f minutes", sim_time);
}
void update_time_avg_stats(void) /* Update area accumulators for time-average
statistics.
*/
{
float time_since_last_event;
/* Compute time since last event, and update last-event-time marker.
, */
time_since_last_event = sim_time - time_last_event;
time_last_event = sim_time;
/* Update area under number-in-queue function. Q(t) */
area_num_in_q += num_in_q * time_since_last_event;
/* Update area under server-busy indicator function. B(t) */
area_server_status += server_status * time_since_last_event;
}
float expon(float mean) /* Exponential variate generation function. */
{
/* Return an exponential random variate with mean "mean".“ mean”
*/
// return -mean * log(lcgrand(1));
return -mean*log((float)rand()/(float)RAND_MAX);
}