Advertisement
AIwinter

график1

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