Advertisement
AIwinter

mm1

Sep 22nd, 2024
24
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.53 KB | None | 0 0
  1. import numpy as np
  2.  
  3. Q_LIMIT = 100 # Ограничение длины очереди
  4. BUSY = 1 # Устройство занято
  5. IDLE = 0 # Устройство свободно
  6.  
  7. class QueueSystem:
  8. def __init__(self, mean_interarrival, mean_service, time_end):
  9. self.mean_interarrival = mean_interarrival
  10. self.mean_service = mean_service
  11. self.time_end = time_end
  12.  
  13. # Переменные состояния
  14. self.sim_time = 0.0
  15. self.server_status = IDLE
  16. self.num_in_q = 0
  17. self.time_last_event = 0.0
  18. self.num_custs_delayed = 0
  19. self.total_of_delays = 0.0
  20. self.area_num_in_q = 0.0
  21. self.area_server_status = 0.0
  22. self.time_arrival = [0.0] * (Q_LIMIT + 1)
  23.  
  24. # Инициализация списка событий
  25. self.time_next_event = [1.0e+30, self.expon(self.mean_interarrival), 1.0e+30, self.time_end]
  26.  
  27. def expon(self, mean):
  28. """Генерация экспоненциально распределенной случайной величины."""
  29. return -mean * np.log(np.random.rand())
  30.  
  31. def timing(self):
  32. min_time_next_event = min(self.time_next_event)
  33. self.sim_time = min_time_next_event
  34. next_event_type = self.time_next_event.index(min_time_next_event)
  35. if next_event_type == 0:
  36. print(f"Список событий пуст в момент времени {self.sim_time}")
  37. exit(1)
  38. return next_event_type
  39.  
  40. def update_time_avg_status(self):
  41. time_since_last_event = self.sim_time - self.time_last_event
  42. self.time_last_event = self.sim_time
  43. self.area_num_in_q += self.num_in_q * time_since_last_event
  44. self.area_server_status += self.server_status * time_since_last_event
  45.  
  46. def arrive(self):
  47. self.time_next_event[1] = self.sim_time + self.expon(self.mean_interarrival)
  48.  
  49. if self.server_status == BUSY:
  50. self.num_in_q += 1
  51. if self.num_in_q > Q_LIMIT:
  52. print(f"Переполнение массива time_arrival в момент времени {self.sim_time}")
  53. exit(2)
  54. self.time_arrival[self.num_in_q] = self.sim_time
  55. else:
  56. delay = 0.0
  57. self.total_of_delays += delay
  58. self.num_custs_delayed += 1
  59. self.server_status = BUSY
  60. self.time_next_event[2] = self.sim_time + self.expon(self.mean_service)
  61.  
  62. def depart(self):
  63. if self.num_in_q == 0:
  64. self.server_status = IDLE
  65. self.time_next_event[2] = 1.0e+30
  66. else:
  67. self.num_in_q -= 1
  68. delay = self.sim_time - self.time_arrival[1]
  69. self.total_of_delays += delay
  70. self.num_custs_delayed += 1
  71. self.time_next_event[2] = self.sim_time + self.expon(self.mean_service)
  72.  
  73. for i in range(1, self.num_in_q + 1):
  74. self.time_arrival[i] = self.time_arrival[i + 1]
  75.  
  76. def report(self):
  77. print(f"\nСредняя задержка в очереди: {self.total_of_delays / self.num_custs_delayed:.3f} мин")
  78. print(f"Среднее число требований в очереди: {self.area_num_in_q / self.sim_time:.3f}")
  79. print(f"Коэффициент занятости устройства: {self.area_server_status / self.sim_time:.3f}")
  80. print(f"Число завершенных задержек в очереди: {self.num_custs_delayed}\n")
  81.  
  82.  
  83. def main():
  84. mean_interarrival = float(input("Введите среднее время между прибытиями требований, мин: ")) #среднее расстояние между прибытиями
  85. mean_service = float(input("Введите среднее время обслуживания требования, мин: ")) #среднее обслуживание
  86. time_end = float(input("Введите время завершения моделирования, мин: "))
  87.  
  88. queue_system = QueueSystem(mean_interarrival, mean_service, time_end)
  89.  
  90. while queue_system.sim_time < time_end:
  91. next_event_type = queue_system.timing()
  92. queue_system.update_time_avg_status()
  93.  
  94. if next_event_type == 1:
  95. queue_system.arrive()
  96. elif next_event_type == 2:
  97. queue_system.depart()
  98. elif next_event_type == 3:
  99. queue_system.report()
  100. break
  101.  
  102. if __name__ == "__main__":
  103. main()
  104.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement