Advertisement
Guest User

Untitled

a guest
Feb 22nd, 2019
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.28 KB | None | 0 0
  1. int main(int argc, char **argv)
  2. {
  3. const char *input_file = "input.txt";
  4. const char *output_file = "output.txt";
  5.  
  6. int i, j, k, n;
  7. int cars_arrived, total_cars, max_queue_len, running_queue_len;
  8. int arrival_time, wait_time, max_wait_time, running_wait_time;
  9. int departure_period, departure_timer;
  10. int light_timer, light_duration[3] = {0, 0, 0};
  11. int time, increment, runtime;
  12. int avg_wait_time, avg_queue_len;
  13. double arrival_rate, lambda;
  14.  
  15. Light light;
  16. queue_t *queue = (queue_t *)malloc(sizeof(queue));
  17. parameters *param_list = read_input_file(input_file, &n);
  18.  
  19. FILE *output_fp = fopen(output_file, "w");
  20. fprintf(output_fp, "%sn", STUDENT_ID);
  21.  
  22. for (i = 0; i < n; i++)
  23. {
  24. /* simulation setup */
  25. light = RED;
  26. runtime = param_list[i][2] * 60 * 1000; /* minutes to millseconds*/
  27. increment = param_list[i][3]; /* millseconds*/
  28. arrival_rate = param_list[i][0] / (double)(60 * 1000); /* per minute to per millsecond */
  29. departure_period = param_list[i][1] * 1000; /* seconds to millseconds*/
  30.  
  31. for (k = 0; k < 3; k++)
  32. light_duration[k] = param_list[i][k + 4] * 1000; /* seconds to millseconds*/
  33.  
  34. lambda = arrival_rate * increment;
  35.  
  36. /* counters initialization */
  37. total_cars = 0;
  38. running_queue_len = 0;
  39. max_queue_len = 0;
  40. max_wait_time = 0;
  41. running_wait_time = 0;
  42. departure_timer = 0;
  43. light_timer = 0;
  44.  
  45. for (time = 0; time < runtime; time += increment)
  46. {
  47. /* change lights */
  48. if (light_timer > light_duration[light])
  49. {
  50. /* GREEN -> AMBER -> RED -> GREEN */
  51. if (light == GREEN)
  52. light = AMBER;
  53. else if (light == AMBER)
  54. light = RED;
  55. else
  56. {
  57. light = GREEN;
  58. departure_timer = 0; /* reset */
  59. }
  60. light_timer = 0; /* reset */
  61. }
  62. /* enqueue cars arrived */
  63. cars_arrived = samplePoisson(lambda);
  64. for (k = 0; k < cars_arrived; k++)
  65. queue = enqueue(queue, time);
  66.  
  67. total_cars += cars_arrived;
  68. /* a car departs on green light */
  69. if (departure_timer >= departure_period && light == GREEN)
  70. {
  71. if (!queue_empty(queue))
  72. {
  73. queue = dequeue(queue, &arrival_time);
  74. wait_time = time - arrival_time;
  75. max_wait_time = max_wait_time > wait_time ? max_wait_time : wait_time;
  76. running_wait_time += wait_time;
  77. }
  78. departure_timer = 0; /* reset */
  79. }
  80.  
  81. running_queue_len += queue->length;
  82. max_queue_len = max_queue_len > queue->length ? max_queue_len : queue->length;
  83.  
  84. departure_timer += increment;
  85. light_timer += increment;
  86. }
  87.  
  88. while(!queue_empty(queue)) /* dequeue remaining cars */
  89. {
  90. queue = dequeue(queue, &arrival_time);
  91. wait_time = time - arrival_time;
  92. max_wait_time = max_wait_time > wait_time ? max_wait_time : wait_time;
  93. running_wait_time += wait_time;
  94. }
  95.  
  96. avg_wait_time = running_wait_time / total_cars;
  97. avg_queue_len = running_queue_len / runtime;
  98.  
  99. /* write the output to the file */
  100. fprintf(output_fp, "Arrival rate: %d cars per minn", param_list[i][0]);
  101. fprintf(output_fp, "Departure rate: %d s per carn", param_list[i][1]);
  102. fprintf(output_fp, "Runtime: %d minn", param_list[i][2]);
  103. fprintf(output_fp, "Time increment: %d msn", param_list[i][3]);
  104. fprintf(output_fp, "Light sequence: Green %d s; Amber %d s; Red %d sn",
  105. param_list[i][6], param_list[i][5], param_list[i][4]);
  106. fprintf(output_fp, "Average length: %d carsn", avg_queue_len);
  107. fprintf(output_fp, "Maximum length: %d carsn", max_queue_len);
  108. fprintf(output_fp, "Average wait: %d sn", avg_wait_time / 1000);
  109. fprintf(output_fp, "Maximum wait: %d sn", max_wait_time / 1000);
  110. }
  111.  
  112. fclose(output_fp);
  113. /* free memory */
  114. free(queue);
  115. free(param_list);
  116.  
  117. return 0;
  118.  
  119. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement