Advertisement
AIwinter

Untitled

Sep 21st, 2024
26
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.80 KB | None | 0 0
  1. import math
  2. import random
  3.  
  4. # Ограничение длины очереди
  5. Q_LIMIT = 100
  6. # Состояния устройства
  7. BUSY = 1
  8. IDLE = 0
  9.  
  10. # Переменные
  11. next_event_type = 0
  12. num_custs_delayed = 0
  13. num_events = 3 # Исправлено с 2 на 3
  14. num_in_q = 0
  15. server_status = IDLE
  16.  
  17. area_num_in_q = 0.0
  18. area_server_status = 0.0
  19. mean_interarrival = 0.0
  20. mean_service = 0.0
  21. sim_time = 0.0
  22. time_arrival = [0.0] * (Q_LIMIT + 2) # Увеличен размер для предотвращения ошибки индексации
  23. time_end = 480.0
  24. time_last_event = 0.0
  25. time_next_event = [0.0, 0.0, 0.0, 0.0]
  26. total_of_delays = 0.0
  27.  
  28. # Чтение и запись файлов
  29. outfile = open("mml.out", "w")
  30.  
  31.  
  32. def initialize():
  33. global sim_time, server_status, num_in_q, time_last_event
  34. global num_custs_delayed, total_of_delays, area_num_in_q, area_server_status
  35. global time_next_event
  36.  
  37. sim_time = 0.0
  38. server_status = IDLE
  39. num_in_q = 0
  40. time_last_event = 0.0
  41.  
  42. num_custs_delayed = 0
  43. total_of_delays = 0.0
  44. area_num_in_q = 0.0
  45. area_server_status = 0.0
  46.  
  47. # Инициализируем список событий
  48. time_next_event[1] = sim_time + expon(mean_interarrival)
  49. time_next_event[2] = float('inf') # Завершение обслуживания изначально отменено
  50. time_next_event[3] = time_end # Планируем событие отчета
  51.  
  52.  
  53. def timing():
  54. global next_event_type, sim_time
  55.  
  56. min_time_next_event = float('inf')
  57. next_event_type = 0
  58.  
  59. # Определяем тип следующего события
  60. for i in range(1, num_events + 1):
  61. if time_next_event[i] < min_time_next_event:
  62. min_time_next_event = time_next_event[i]
  63. next_event_type = i
  64.  
  65. # Проверяем, является ли список событий пустым
  66. if next_event_type == 0:
  67. outfile.write(f"\nСписок событий пуст в момент времени {sim_time}\n")
  68. exit(1)
  69.  
  70. sim_time = min_time_next_event
  71.  
  72.  
  73. def arrive():
  74. global num_in_q, num_custs_delayed, server_status, total_of_delays
  75.  
  76. time_next_event[1] = sim_time + expon(mean_interarrival)
  77.  
  78. if server_status == BUSY:
  79. num_in_q += 1
  80.  
  81. if num_in_q > Q_LIMIT:
  82. outfile.write(f"\nПереполнение очереди в момент времени {sim_time}\n")
  83. exit(2)
  84.  
  85. time_arrival[num_in_q] = sim_time
  86. else:
  87. delay = 0.0
  88. total_of_delays += delay
  89. num_custs_delayed += 1
  90. server_status = BUSY
  91. time_next_event[2] = sim_time + expon(mean_service)
  92.  
  93.  
  94. def depart():
  95. global num_in_q, num_custs_delayed, total_of_delays
  96.  
  97. if num_in_q == 0:
  98. server_status = IDLE
  99. time_next_event[2] = float('inf')
  100. else:
  101. num_in_q -= 1
  102. delay = sim_time - time_arrival[1]
  103. total_of_delays += delay
  104. num_custs_delayed += 1
  105. time_next_event[2] = sim_time + expon(mean_service)
  106.  
  107. # Сдвигаем очередь вперед
  108. for i in range(1, num_in_q + 1):
  109. time_arrival[i] = time_arrival[i + 1]
  110.  
  111.  
  112. def report():
  113. average_delay = total_of_delays / num_custs_delayed if num_custs_delayed > 0 else 0.0
  114. average_q = area_num_in_q / sim_time if sim_time > 0 else 0.0
  115. utilization = area_server_status / sim_time if sim_time > 0 else 0.0
  116.  
  117. outfile.write(f"\n\nСредняя задержка в очереди: {average_delay:.3f} минут\n")
  118. outfile.write(f"Среднее число требований в очереди: {average_q:.3f}\n")
  119. outfile.write(f"Коэффициент занятости устройства: {utilization:.3f}\n")
  120. outfile.write(f"Число завершённых задержек: {num_custs_delayed}\n")
  121.  
  122.  
  123. def update_time_avg_status():
  124. global area_num_in_q, area_server_status, time_last_event
  125.  
  126. time_since_last_event = sim_time - time_last_event
  127. time_last_event = sim_time
  128.  
  129. area_num_in_q += num_in_q * time_since_last_event
  130. area_server_status += server_status * time_since_last_event
  131.  
  132.  
  133. def expon(mean):
  134. return -mean * math.log(random.random())
  135.  
  136.  
  137. def main():
  138. global mean_interarrival, mean_service, num_delays_required
  139.  
  140. # Считываем входные параметры
  141. # В оригинальном коде параметры считываются из файла "mml.in"
  142. # Здесь мы задаём их вручную для простоты
  143. mean_interarrival = 1.0 # Среднее время между поступлениями
  144. mean_service = 0.5 # Среднее время обслуживания
  145. num_delays_required = 480 # Число задержек требований
  146.  
  147. # Пишем заголовок отчета
  148. outfile.write(f"Среднее время между поступлениями: {mean_interarrival:.3f} мин\n")
  149. outfile.write(f"Среднее время обслуживания: {mean_service:.3f} мин\n")
  150. outfile.write(f"Число требований: {num_delays_required}\n")
  151.  
  152. # Инициализируем моделирование
  153. initialize()
  154.  
  155. # Выполняем цикл моделирования
  156. while True:
  157. timing()
  158. update_time_avg_status()
  159.  
  160. if next_event_type == 1:
  161. arrive()
  162. elif next_event_type == 2:
  163. depart()
  164. elif next_event_type == 3:
  165. report()
  166. break # Завершаем моделирование после отчета
  167.  
  168. # Закрываем файл отчета
  169. outfile.close()
  170.  
  171.  
  172. # Запуск программы
  173. if __name__ == "__main__":
  174. main()
  175.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement