AIwinter

Untitled

Sep 21st, 2024
21
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.75 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_delays_required, 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_last_event, time_next_event[3], 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 и 1000, разделенные пробелами */
  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. }
  63. }
  64. /* вызываем генератор отчетов и завершаем моделирование */
  65. report();
  66. fclose(infile);
  67. fclose(outline);
  68. return 0;
  69. }"
  70.  
  71. код на языке C для функции инициализации
  72.  
  73. "void initialize(void) /* функция инициализации */
  74. {
  75. /* устанавливаем в исходное состояние часы модельного времени */
  76. sim_time = 0.0;
  77.  
  78. /* задаем исходные значения переменных состояния */
  79. server_status = IDLE;
  80. num_in_q = 0;
  81. time_last_event = 0.0;
  82.  
  83. /* устанавливаем в исходное состояние статистические счетчики */
  84. num_custs_delayed = 0;
  85. total_of_delays = 0.0;
  86. area_num_in_q = 0.0;
  87. area_server_status = 0.0;
  88.  
  89. /* инициализируем список событий. отменяем учет ухода (завершения обслуживания), поскольку в системе нет требований */
  90. time_next_event[1] = sim_time + expon(mean_interarrival);
  91. time_next_event[2] = 1.0e+30;"
  92.  
  93. код на языке C для синхронизирующей функции
  94. "void timing(void) /* синхронизирующая функция */
  95. {
  96. int 1;
  97. float min_time_next_event = 1.0e+29;
  98. next_event_type = 0;
  99.  
  100. /* определяем тип следующего события */
  101. for (i = 1; i <= num_events; ++1)
  102. if (time_next_event[i] < min_time_next_event) {
  103. min_time_next_event = time_next_event[i];
  104. next_event_type = i;}
  105.  
  106. /* проверяем, является ли список событий пустым */
  107. if (next_event_type == 0) {
  108. /* список событий пуст. завершаем моделирование */
  109. fprint(outline, "\n список событий пуст в момент времени %f", sim_time);
  110. exit(1);
  111. }"
  112.  
  113. код для функции arrive
  114.  
  115. "void arrive(void) /*событийная функция для поступления требования */
  116. {
  117. float delay:
  118. /* планируем следующее поступление */
  119. time_next_event[1] = sim_time + expon(mean_interarrival);
  120. /* проверяем, занято ли устройство обслуживания */
  121. if (server_status == BUSY) {
  122. /* устройство занято. увеличиваем число требований в очереди */
  123. ++num_in_q:
  124. /* проверяем наличие условия переполнения */
  125. if (num_in_q > Q_LIMIT) {
  126. /* очередь переполнена. прекращаем моделирование */
  127. fprintf(outline. "\n переполнение массива time_arrival в");
  128. fprintf(outline, " момент времени %f", sim_time);
  129. exit(2);
  130. }
  131.  
  132. /* в очереди все еще остается место. сохраняем время поступления требования в (новом) конце массива time_arrival */
  133. time_arrival[num_in_q] = sim_time;
  134. }
  135. else {
  136. /* устройство свободно. задержка поступившего требования в очереди = 0. (следующие 2 оператора не влияют на результат моделирования) */
  137. delay = 0.0;
  138. total_of_delays += delay;
  139. /* увеличиваем число задержек требований. переводим устройство в состояние занятости */
  140. ++num_custs_delayed;
  141. server_status = BUSY;
  142. /*планируем уход требования (завершение обслуживание) */
  143. time_next_event[2] = sim_time + expon(mean_service);
  144. }
  145. }"
  146.  
  147. код для функции depart
  148. "void depart(void) /* событийная функция для ухода требования */
  149. {
  150. int 1;
  151. float delay;
  152. /* проверяем есть ли требования в очереди */
  153. if (num_in_q == 0) {
  154. /*в очереди нет требований. переводим устройство в состояние незанятости и отменяем учет ухода (завершения обслуживания) */
  155. server_status = IDLE;
  156. time_next_event[2] = 1.0e+30;
  157. }
  158. else {
  159. /* в очереди есть требования. уменьшаем число требований в очереди */
  160. --num_in_q:
  161. /* вычисляем задержку в очереди требования, обслуживание которого началось, и обновляем значение общего накопителя времени задержки */
  162. delay = sim_time - time_arrival[1];
  163. total_of_delays += delay;
  164. /* увеличиваем число задержек требований и планируем время ухода */
  165. ++num_custs_delayed;
  166. time_next_event[2] = sim_time + expon(mean_service);
  167. /* переводим каждое требование в очереди на одну позицию вперед */
  168. for (i = 1; 1 <= num_in_q; ++i)
  169. time_arrival[i] = time_arrival[i + 1];
  170. }
  171. }"
  172.  
  173. код для функции report
  174. "void report(void) /* функция генератора отчетов */
  175. {
  176. /* вычисляем и записываем исконные критерии оценки работы */
  177. fprintf(outfile, "\n\nсредняя задержка в очереди%11.3f мин\n\n", total_of_delays / num_custs_delayed);
  178. fprintf(outfile, "среднее число требований в очереди%10.3f\n\n", area_num_in_q / sim_time);
  179. fprintf(outfile,"коэффициент занятости устройства обслуживания%15.3f\n\n", area_server_status / sim_time);
  180. fprintf(outfile, "время завершения моделирования%12.3f мин, sim_time);
  181. }"
  182.  
  183. код для функции time_avg_status
  184. "void time_avg_status(void) /* обновляем накопители площади для статистики среднего времени */
  185. {
  186. float time_since_last_event;
  187. /* вычисляем время, прошедшее после последнего события и обновляем маркер времени последнего события */
  188. time_since_last_event = sim_time - time_last_event;
  189. time_last_event = sim_time;
  190. /* обновляем площадь под функцией определения числа требований в очереди */
  191. area_num_in_q += num_in_q * time_since_last_event;
  192. /* обновляем площадь под функцией определения занятости устройства */
  193. area_server_status += server_status * time_since_last_event;
  194. }"
  195. код для функции expon
  196. "float expon(float mean) /*функция для генерирования экспоненциально распределенной случайной величины */
  197. { /* возвращаем экспоненциально распределенную случайную величину со средним mean */
  198. return -mean * log(lcgrand(1));
  199. }"
Add Comment
Please, Sign In to add comment