Advertisement
AIwinter

Untitled

Sep 21st, 2024
29
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.12 KB | None | 0 0
  1. код на языке C для внешних определений
  2.  
  3. "/* внешние определения для системы массового обслуживания с 1 устройством обслуживания*/
  4.  
  5. #include <studio.h>
  6. #include <math.h>
  7. #include "1cgrand.h" /* заголовочный файл для генератора случайного числа */
  8.  
  9. #define Q_LIMIT 100 /* ограничение длины очереди */
  10. #define BUSY 1 /* устройство в состоянии занятости */
  11. #define IDLE 0 /* устройство в состоянии незанятости */
  12.  
  13. int next_event_type, num_custs_delayed, num_events, num_in_q, server_status;
  14.  
  15. float area_num_in_q, area_server_status, mean_interarrival, mean_service, sim_time, time_ariival[Q_LIMIT+1], time_end, time_last_event, time_next_event[4], total_of_delays;
  16. FILE *infile, *outfile;
  17.  
  18. void initialize(void);
  19. void timing(void);
  20. void arrive(void);
  21. void depart(void);
  22. void report(void);
  23. void update_time_avg_status(void);
  24. float expon(float mean);"
  25.  
  26. код для основной функции
  27.  
  28. "main()
  29. {
  30. /* открываем входной и выходной файлы из файла mml.in, в котором содержится одна строка с числами 1,0; 0,5 и 480, разделенные пробелами */
  31. infile = fopen("mml.in", "r");
  32. outfile = fopen("mml.in", "w");
  33.  
  34. /* указываем число событий для синхронизирующей функции */
  35. num events = 2;
  36.  
  37. /* считываем входные параметры */
  38. fscanf(infile, "%f %f %d", &mean_interarrival, &mean_service, &num_delays_required);
  39.  
  40. /* указываем заголовок отчета и входные параметры */
  41. fprintf(outfile, "среднее время между поступлениями %11.3f мин\n\n", mean_interrarival);
  42. fprintf(outfile, "среднее число обслуживания%16.3f мин\n\n", mean_service);
  43. fprintf(outfile, "число требований%14d\n\n", num_delays_required);
  44.  
  45. /* инициализируем моделирование */
  46. initialize();
  47.  
  48. /* выполняем пока не зарегистрировано нужное число задержек в очереди */
  49. while (num_custs_delayed < num_delays_required) {
  50. /* определяем следующее событие */
  51. timing();
  52. /* обновляем среднестатистические накопители */
  53. update_time_avg_stats();
  54. /* вызываем соответствующую событийную функцию */
  55. switch (next_event_type) {
  56. case 1:
  57. arrive();
  58. break;
  59. case 2:
  60. depart();
  61. break;
  62. case 3:
  63. report();
  64. break;
  65. }
  66.  
  67. /* если последним выполненным событием было событие завершения моделирования (case 3), завершаем моделирование. в противном случае продолжаем моделирование */
  68. } while (next_event_type != 3):
  69. fclose(infile);
  70. fclose(outline);
  71.  
  72. return 0;
  73. }"
  74.  
  75. код на языке C для функции инициализации
  76.  
  77. "void initialize(void) /* функция инициализации */
  78. {
  79. /* устанавливаем в исходное состояние часы модельного времени */
  80. sim_time = 0.0;
  81.  
  82. /* задаем исходные значения переменных состояния */
  83. server_status = IDLE;
  84. num_in_q = 0;
  85. time_last_event = 0.0;
  86.  
  87. /* устанавливаем в исходное состояние статистические счетчики */
  88. num_custs_delayed = 0;
  89. total_of_delays = 0.0;
  90. area_num_in_q = 0.0;
  91. area_server_status = 0.0;
  92.  
  93. /* инициализируем список событий. тк в системе нет требований отменяем учет ухода (завершения обслуживания). событие завершения моделирования планируется на время time_end */
  94.  
  95. time_next_event[1] = sim_time + expon(mean_interarrival);
  96. time_next_event[2] = 1.0e+30;
  97. time_next_event[3] = time_end;"
  98.  
  99. код на языке C для синхронизирующей функции
  100. "void timing(void) /* синхронизирующая функция */
  101. {
  102. int 1;
  103. float min_time_next_event = 1.0e+29;
  104. next_event_type = 0;
  105.  
  106. /* определяем тип следующего события */
  107. for (i = 1; i <= num_events; ++1)
  108. if (time_next_event[i] < min_time_next_event) {
  109. min_time_next_event = time_next_event[i];
  110. next_event_type = i;}
  111.  
  112. /* проверяем, является ли список событий пустым */
  113. if (next_event_type == 0) {
  114. /* список событий пуст. завершаем моделирование */
  115. fprint(outline, "\n список событий пуст в момент времени %f", sim_time);
  116. exit(1);
  117. }"
  118.  
  119. код для функции arrive
  120.  
  121. "void arrive(void) /*событийная функция для поступления требования */
  122. {
  123. float delay:
  124. /* планируем следующее поступление */
  125. time_next_event[1] = sim_time + expon(mean_interarrival);
  126. /* проверяем, занято ли устройство обслуживания */
  127. if (server_status == BUSY) {
  128. /* устройство занято. увеличиваем число требований в очереди */
  129. ++num_in_q:
  130. /* проверяем наличие условия переполнения */
  131. if (num_in_q > Q_LIMIT) {
  132. /* очередь переполнена. прекращаем моделирование */
  133. fprintf(outline. "\n переполнение массива time_arrival в");
  134. fprintf(outline, " момент времени %f", sim_time);
  135. exit(2);
  136. }
  137.  
  138. /* в очереди все еще остается место. сохраняем время поступления требования в (новом) конце массива time_arrival */
  139. time_arrival[num_in_q] = sim_time;
  140. }
  141. else {
  142. /* устройство свободно. задержка поступившего требования в очереди = 0. (следующие 2 оператора не влияют на результат моделирования) */
  143. delay = 0.0;
  144. total_of_delays += delay;
  145. /* увеличиваем число задержек требований. переводим устройство в состояние занятости */
  146. ++num_custs_delayed;
  147. server_status = BUSY;
  148. /*планируем уход требования (завершение обслуживание) */
  149. time_next_event[2] = sim_time + expon(mean_service);
  150. }
  151. }"
  152.  
  153. код для функции depart
  154. "void depart(void) /* событийная функция для ухода требования */
  155. {
  156. int 1;
  157. float delay;
  158. /* проверяем есть ли требования в очереди */
  159. if (num_in_q == 0) {
  160. /*в очереди нет требований. переводим устройство в состояние незанятости и отменяем учет ухода (завершения обслуживания) */
  161. server_status = IDLE;
  162. time_next_event[2] = 1.0e+30;
  163. }
  164. else {
  165. /* в очереди есть требования. уменьшаем число требований в очереди */
  166. --num_in_q:
  167. /* вычисляем задержку в очереди требования, обслуживание которого началось, и обновляем значение общего накопителя времени задержки */
  168. delay = sim_time - time_arrival[1];
  169. total_of_delays += delay;
  170. /* увеличиваем число задержек требований и планируем время ухода */
  171. ++num_custs_delayed;
  172. time_next_event[2] = sim_time + expon(mean_service);
  173. /* переводим каждое требование в очереди на одну позицию вперед */
  174. for (i = 1; 1 <= num_in_q; ++i)
  175. time_arrival[i] = time_arrival[i + 1];
  176. }
  177. }"
  178.  
  179. код для функции report
  180. "void report(void) /* функция генератора отчетов */
  181. {
  182. /* вычисляем и записываем исконные критерии оценки работы */
  183. fprintf(outfile, "\n\nсредняя задержка в очереди%11.3f мин\n\n", total_of_delays / num_custs_delayed);
  184. fprintf(outfile, "среднее число требований в очереди%10.3f\n\n", area_num_in_q / sim_time);
  185. fprintf(outfile,"коэффициент занятости устройства обслуживания%15.3f\n\n", area_server_status / sim_time);
  186. fprintf(outfile, "число завершенных задержек в очереди%7d", num_customers_delayed);
  187. }"
  188.  
  189. код для функции time_avg_status
  190. "void time_avg_status(void) /* обновляем накопители площади для статистики среднего времени */
  191. {
  192. float time_since_last_event;
  193. /* вычисляем время, прошедшее после последнего события и обновляем маркер времени последнего события */
  194. time_since_last_event = sim_time - time_last_event;
  195. time_last_event = sim_time;
  196. /* обновляем площадь под функцией определения числа требований в очереди */
  197. area_num_in_q += num_in_q * time_since_last_event;
  198. /* обновляем площадь под функцией определения занятости устройства */
  199. area_server_status += server_status * time_since_last_event;
  200. }"
  201. код для функции expon
  202. "float expon(float mean) /*функция для генерирования экспоненциально распределенной случайной величины */
  203. { /* возвращаем экспоненциально распределенную случайную величину со средним mean */
  204. return -mean * log(lcgrand(1));
  205. }"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement