Advertisement
Guest User

Untitled

a guest
Aug 18th, 2019
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.89 KB | None | 0 0
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3.  
  4. import queueing_tool as qt
  5. import numpy as np
  6. import datetime as dt
  7.  
  8. # CONSTANTS
  9. MAX_AGENTS = 1000000
  10. ONE_YEAR = 525600 # 365 días
  11. SEED = 13
  12.  
  13. def get_queue_args(p, servers):
  14. q_args = {
  15. # Camara Térmica Queue
  16. 1: {
  17. 'num_servers': servers['camaras'],
  18. 'arrival_f': lambda t: t + np.random.uniform(p[0], p[1]),
  19. 'service_f': lambda t: t + np.random.uniform(0.0667, 0.1),
  20. 'collect_data': True
  21. },
  22. # Examen Detallado Queue
  23. 2: {
  24. 'num_servers': servers['personal'], # Personal Medico
  25. 'service_f': lambda t: t + np.random.uniform(14, 22),
  26. 'collect_data': True
  27. },
  28. # Periodo de Observación Queue
  29. 3: {
  30. 'num_servers': servers['cap_obsr'], # Capacidad de Sala de Observación
  31. 'service_f': lambda t: t + np.random.uniform(1200, 1440),
  32. 'collect_data': True
  33. },
  34. # Tratamiento Preventivo Queue
  35. 4: {
  36. 'num_servers': servers['cap_prev'], # Capacidad de Sala de Tratamientos Preventivos
  37. 'service_f': lambda t: t + np.random.uniform(7200, 10080),
  38. 'collect_data': True
  39. },
  40. # Tratamiento Definitivo Queue
  41. 5: {
  42. 'num_servers': servers['cap_def'], # Capacidad de Sala de Tratamientos Definitivos
  43. 'service_f': lambda t: t + np.random.uniform(5760, 8640),
  44. 'collect_data': True
  45. },
  46. 6: {
  47. 'service_f': lambda t: t,
  48. 'collect_data': True
  49. }
  50. }
  51. return q_args
  52.  
  53. def build_queue_graph(lmb, transition_matrix, svr):
  54. adja_list = {
  55. 0: [1],
  56. 1: [2, 6],
  57. 2: [3, 4, 7],
  58. 3: [4, 7],
  59. 4: [5, 8],
  60. 5: [9]
  61. }
  62. edge_list = {
  63. 0: {1: 1},
  64. 1: {2: 2, 6: 6},
  65. 2: {3: 3, 4: 4, 7: 6},
  66. 3: {4: 4, 7: 6},
  67. 4: {5: 5, 8: 6},
  68. 5: {9: 6}
  69. }
  70. g = qt.adjacency2graph(adjacency=adja_list, edge_type=edge_list)
  71. q_classes = {k: qt.QueueServer for k in range(1, 7)}
  72. q_args = get_queue_args(lmb, svr)
  73. qn = qt.QueueNetwork(g=g, q_classes=q_classes, q_args=q_args, max_agents=MAX_AGENTS, seed=SEED)
  74. qn.set_transitions(transition_matrix)
  75. return qn
  76.  
  77. def draw(qn):
  78. qn.g.new_vertex_property('pos')
  79. pos = [[k-5, 0.8] for k in range(0, 3)]
  80. pos += [[-2, 0.6], [-1, 0.8], [0, 0.8], [-3, 0.4], [0, 0.4]]
  81. pos += [[k-5, 0.4] for k in range(7, 10)]
  82. dt = {k: pos[k] for k in range(10)}
  83. qn.g.set_pos(dt)
  84. qn.draw(fname="fiebre.png", figsize=(12, 3), bbox_inches='tight')
  85.  
  86.  
  87. def sim(λ, transition_matrix, servers, SIM_TIME, SCENARIO):
  88. print("Starting simulation...")
  89. net = build_queue_graph(λ, transition_matrix, servers)
  90. net.initialize(edges=[(0,1)])
  91. net.start_collecting_data()
  92. net.simulate(t=SIM_TIME)
  93. net.stop_collecting_data()
  94. q_res = np.array([[
  95. 'ID Queue', 'Agents (%)', 'Agents (Qty)',
  96. 'Waiting Time (Avg)',
  97. 'Waiting Time (Min)',
  98. 'Waiting Time (Max)',
  99. 'Number Waiting (Avg)',
  100. 'Number Waiting (Min)',
  101. 'Number Waiting (Max)',
  102. 'Utilization (%)',
  103. 'Utilization (Avg)',
  104. 'Server Number (Qty)'
  105. ]])
  106. total_arr = net.edge2queue[0].num_arrivals[0]
  107. for j in range(11):
  108. waiting_time = [ i[1]-i[0] for i in net.edge2queue[j].fetch_data() if i[1] > 0]
  109. total_time = [ i[2]-i[0] for i in net.edge2queue[j].fetch_data() if i[1] > 0]
  110. nbr_waiting = [ i[3] for i in net.edge2queue[j].fetch_data() if i[1] > 0]
  111. utilization = [ i[4]-i[3] for i in net.edge2queue[j].fetch_data() if i[1] > 0]
  112. l = [
  113. net.edge2queue[j].edge[2],
  114. np.around(net.edge2queue[j].num_arrivals[0]/total_arr, decimals=4),
  115. net.edge2queue[j].num_arrivals[0],
  116. np.around(np.mean(waiting_time), decimals=4),
  117. np.around(np.amin(waiting_time), decimals=4),
  118. np.around(np.amax(waiting_time), decimals=4),
  119. np.around(np.mean(nbr_waiting), decimals=4),
  120. np.around(np.amin(nbr_waiting), decimals=4),
  121. np.around(np.amax(nbr_waiting), decimals=4),
  122. np.around(np.mean(utilization) / net.edge2queue[j].num_servers, decimals=4),
  123. np.around(np.mean(utilization), decimals=4),
  124. net.edge2queue[j].num_servers
  125. ]
  126. q_res = np.append(q_res, [l], axis=0)
  127.  
  128. today = dt.datetime.now()
  129. filename = today.strftime("%Y-%m-%d_%H:%M:%S")+"-queue-analysis-"+SCENARIO+"-"+str(SIM_TIME/1440)+"days.csv"
  130. np.savetxt(filename, q_res, delimiter=',', fmt='%s')
  131. print("Done.")
  132.  
  133.  
  134.  
  135. # Datos - Scenario 1
  136. SCENARIO = "scenario1"
  137. λ = (0.0602, 0.1818) # Min y Max de tiempos entre llegadas.
  138. transition_matrix = {
  139. 0: {1: 1.0},
  140. 1: {2: 0.04, 6: 0.96},
  141. 2: {3: 0.05, 4: 0.06, 7: 0.89},
  142. 3: {4: 0.06, 7: 0.94},
  143. 4: {5: 0.08, 8: 0.92},
  144. 5: {9: 1.0}
  145. }
  146. servers = {
  147. 'camaras' : 2,
  148. 'personal': 10,
  149. 'cap_obsr': 100,
  150. 'cap_prev': 200,
  151. 'cap_def' : 20
  152. }
  153. sim(λ, transition_matrix, servers, ONE_YEAR, SCENARIO)
  154.  
  155. # Datos - Scenario 2
  156. SCENARIO = "scenario2"
  157. e = (0.0667, 0.2) # Min y Max de tiempos entre llegadas.
  158. transition_matrix = {
  159. 0: {1: 1.0},
  160. 1: {2: 0.16, 6: 0.84},
  161. 2: {3: 0.05, 4: 0.06, 7: 0.89},
  162. 3: {4: 0.06, 7: 0.94},
  163. 4: {5: 0.08, 8: 0.92},
  164. 5: {9: 1.0}
  165. }
  166. servers = {
  167. 'camaras' : 2,
  168. 'personal': 50,
  169. 'cap_obsr': 100,
  170. 'cap_prev': 1000,
  171. 'cap_def' : 50
  172. }
  173. sim(e, transition_matrix,servers, ONE_YEAR, SCENARIO )
  174.  
  175. # Datos - Scenario 3
  176. SCENARIO = "scenario3"
  177. e = (0.075, 0.2273) # Min y Max de tiempos entre llegadas.
  178. transition_matrix = {
  179. 0: {1: 1.0},
  180. 1: {2: 0.4, 6: 0.6},
  181. 2: {3: 0.05, 4: 0.06, 7: 0.89},
  182. 3: {4: 0.06, 7: 0.94},
  183. 4: {5: 0.08, 8: 0.92},
  184. 5: {9: 1.0}
  185. }
  186. servers = {
  187. 'camaras' : 2,
  188. 'personal': 100,
  189. 'cap_obsr': 200,
  190. 'cap_prev': 1500,
  191. 'cap_def' : 200
  192. }
  193. sim(e, transition_matrix, servers, ONE_YEAR, SCENARIO)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement