基于排队论模型的收银台服务系统的分析及可视化设计
基于排隊論模型的收銀臺服務系統的分析及可視化設計
- 一. 收款臺服務
- 1.1問題描述
- 1.2計算
- 1.3輸入:
- 1.4GUI界面輸出與程序封裝
- 1.4.1開始界面
- 1.4.2點擊直接輸入參數
- 1.4.2.1輸入參數,點擊確定
- 1.4.3點擊導入csv文件
- 1.4.3.1輸入csv文件路徑,點擊確定
一. 收款臺服務
1.1問題描述
某商店只有一個收款臺。
顧客到達收款臺的時間間隔服從平均時間為10s的負指數分布。
每個顧客的服務時間服從均值為6.5s,標準差為1.2s的正態分布。
情景:
客戶到達,客戶排隊,一個柜臺服務, 服務耗時, 客戶離開。
t1 表示客戶平均到達時間間隔
t2 表示客戶平均服務時間
sigma 表示客戶服務時間標準差
num 表示客戶數
1.2計算
顧客的平均逗留時間,系統的服務強度(服務時間/所有時間),平均隊長(排隊人數)。
1.3輸入:
方案一:直接輸入參數(到達時間分布參數:到達時間平均間隔;服務時間分布參數:平均服務時間、服務時間標準差;排隊模型模擬人數。)
方案二:導入csv文件(如下表所示,詳見附件一:T.csv)
(arrive為到達時間間隔,serve為服務時間。其中顧客到達收款臺的時間間隔服從平均時間為10s的負指數分布。每個顧客的服務時間服從均值為6.5s,標準差為1.2s的正態分布。
)
方案一:直接輸入參數(到達時間分布參數:到達時間平均間隔;服務時間分布參數:平均服務時間、服務時間標準差;排隊模型模擬人數。)
方案二:導入csv文件(如下表所示,詳見附件一:T.csv)
(arrive為到達時間間隔,serve為服務時間。其中顧客到達收款臺的時間間隔服從平均時間為10s的負指數分布。每個顧客的服務時間服從均值為6.5s,標準差為1.2s的正態分布。
)
| 9.622203751 | 5.005639909 |
| 3.885598622 | 7.112047687 |
| 9.337939136 | 6.19733889 |
| 6.886054426 | 7.139145964 |
1.4GUI界面輸出與程序封裝
概率密度函數圖像:到達時間分布、服務時間分布。
各種排隊論指標:顧客的平均逗留時間,系統的服務強度(服務時間/所有時間),平均隊長(排隊人數)。
方案二輸入,另外輸出極大似然估計計算得到的參數:到達時間平均間隔;服務時間分布參數:平均服務時間、服務時間標準差。
界面輸出如下圖:
1.4.1開始界面
1.4.2點擊直接輸入參數
1.4.2.1輸入參數,點擊確定
1.4.3點擊導入csv文件
1.4.3.1輸入csv文件路徑,點擊確定
附錄一:代碼(python+jupyter notebook)
1. #導包 2. from numpy.random import * 3. from simpy import * 4. import pandas as pd 5. import numpy as np 6. import matplotlib.pyplot as plt 7. import seaborn as sns 8. from scipy.stats import norm 9. from tkinter import * 10. import tkinter as tk 11. from PIL import Image, ImageTk 12. import os 13. import glob 14. import shutil 15. from gooey import Gooey, GooeyParser 16. from matplotlib import font_manager 17. my_font=font_manager.FontProperties(fname='C:\Windows\Fonts\msyh.ttc',size=10) 18. 19. #收款臺服務問題:FIFO 直接輸入參數 20. def cashierService_param(t1,t2,sigma,num,win): 21. """ 22. 收款臺服務問題 23. 某商店只有一個收款臺 24. 顧客到達收款臺的時間間隔服從平均時間為10s的負指數分布 25. 每個顧客的服務時間服從均值為6.5s,標準差為1.2s的正態分布 26. 計算:顧客的平均逗留時間,系統的服務強度(服務時間/所有時間),平均隊長(排隊人數)。 27. 28. 情景: 29. 客戶到達,客戶排隊,一個柜臺服務, 服務耗時, 客戶離開 30. %t1 表示客戶平均到達時間間隔 31. %t2 表示客戶平均服務時間 32. %sigma 表示客戶服務時間標準差 33. %num 表示客戶數 34. """ 35. # win1 = Toplevel() 36. # win1.title("排隊模型仿真") 37. # win1.geometry('1000x450+100+100') 38. # win1.resizable(0,0) 39. 40. #客戶到達時間間隔(負指數分布) 41. def arrive(t1,num): 42. sample = np.random.exponential(t1, size=num) # 產生num個滿足指數分布的隨機數 43. # print(np.sum(sample)/num) 44. return sample 45. #客戶服務時間(正態分布) 46. def serve(t2,sigma,num): 47. sample = np.random.normal(t2, sigma, size=num) 48. return sample 49. 50. """顧客服務與離開仿真""" 51. #顧客到達時刻 52. a=list(arrive(t1,num)) 53. arrive_t=[0]*num #客戶到達時間列表 54. arrive_t[0]=a[0] 55. for i in range(num-1): 56. arrive_t[i+1] = arrive_t[i]+a[i+1] 57. #顧客開始服務時刻 58. b=list(serve(t2,sigma,num)) 59. serve_t=[0]*num #客戶服務時間列表 60. serve_t[0]=arrive_t[0] 61. for i in range(num-1): 62. if serve_t[i]+b[i]>arrive_t[i+1]: 63. serve_t[i+1] = serve_t[i]+b[i] 64. else:serve_t[i+1] =arrive_t[i+1] 65. 66. # 計算每人平均逗留時間 67. T=0 68. for i in range(num): 69. t=serve_t[i]+b[i]-arrive_t[i] 70. T+=t 71. print("每人平均逗留時間(分鐘):{0:n}".format(T/num) ) 72. tk.Label(win, text="每人平均逗留時間(分鐘):{0:n}".format(T/num)).grid(row=1,column=2) 73. 74. #計算系統的服務強度 75. print("系統的服務強度:{0:n}".format(np.sum(b)/(serve_t[-1]+b[-1])) ) 76. tk.Label(win, text="系統的服務強度:{0:n}".format(np.sum(b)/(serve_t[-1]+b[-1]))).grid(row=2,column=2) 77. 78. #計算平均隊長(隊長即某時刻排隊人數。每當有人到達,記錄一次隊長) 79. n=1; x=0 80. list_len=[0]*num 81. for i in range(num-1): 82. n+=1 83. for j in range(x,i): 84. if arrive_t[i+1]>serve_t[j]+b[j]: 85. n-=1 86. x=j+1 87. list_len[i]=n 88. print("平均隊長(人數):{0:n}".format(np.sum(list_len)/(len(list_len)))) 89. tk.Label(win, text="平均隊長(人數):{0:n}".format(np.sum(list_len)/(len(list_len)))).grid(row=3,column=2) 90. 91. 92. #負指數分布 93. plt.hist(arrive(t1,num), bins=100, alpha=0.7, normed=True) 94. plt.margins(0.02) 95. lam = 1 / t1 96. x = np.arange(0,t1*8,0.1) 97. y = lam * np.exp(- lam * x) 98. plt.plot(x,y,color='orange', lw=3) 99. plt.title('到達時間分布',fontproperties=my_font) 100. plt.xlabel('time') 101. plt.ylabel('PDF') 102. plt.savefig(fname="到達時間分布.png",figsize=[5,5]) 103. plt.cla() 104. 105. #正態分布 106. plt. hist(serve(t2,sigma,num), bins=100, alpha=0.7, normed=True) 107. x = np.linspace(t2-3*sigma,t2+3*sigma,num) 108. y = pdf = np.exp(-((x - t2)**2) / (2* sigma**2)) / (sigma * np.sqrt(2*np.pi)) 109. plt.plot(x,y, color='orange', lw=3) 110. plt.title('服務時間分布',fontproperties=my_font) 111. plt.xlabel('time') 112. plt.ylabel('PDF') 113. plt.savefig(fname="服務時間分布.png",figsize=[5,5]) 114. plt.cla() 115. 116. img_png = tk.PhotoImage(file = '到達時間分布.png') 117. tk.Label(win,image = img_png).grid(row=7) 118. img_png1 = tk.PhotoImage(file = '服務時間分布.png') 119. tk.Label(win,image = img_png1).grid(row=7,column=2) 120. win.mainloop() 121. 122. def param(): #直接輸入參數 123. win = Toplevel() 124. win.title("超市收銀臺") 125. win.geometry('1500x800+100+100') 126. win.resizable(0,0) 127. text=tk.Label(win,text="超市收銀臺",font=( 'Times',20)).grid(row=0,column=1) 128. #標簽 129. tk.Label(win, text="平均到達時間(分鐘):").grid(row=1) 130. tk.Label(win, text="平均服務時間(分鐘):").grid(row=2) 131. tk.Label(win, text="服務時間標準差:").grid(row=3) 132. tk.Label(win, text="請輸入客戶數量(人):").grid(row=4) 133. # 創建輸入框控件 134. e1 = tk.Entry(win) 135. e2 = tk.Entry(win) 136. e3 = tk.Entry(win) 137. e4 = tk.Entry(win) 138. e1.grid(row=1, column=1, padx=10, pady=5) 139. e2.grid(row=2, column=1, padx=10, pady=5) 140. e3.grid(row=3, column=1, padx=10, pady=5) 141. e4.grid(row=4, column=1, padx=10, pady=5) 142. def calc1(): 143. t1 = float(e1.get()) 144. t2=float(e2.get()) 145. sigma=float(e3.get()) 146. num=int(e4.get()) 147. cashierService_param(t1,t2,sigma,num,win) 148. tk.Button(win, text="確定", width=10, command=calc1).grid(row=5, column=0, sticky="w", padx=10, pady=5) 149. tk.Button(win, text="退出", width=10, command=win.quit).grid(row=5, column=1, sticky="e", padx=10, pady=5) 150. 151. #收款臺服務問題:FIFO 導入csv文件 152. def cashierService_csv(Time,win): 153. """ 154. 收款臺服務問題 155. 某商店只有一個收款臺 156. 顧客到達收款臺的時間間隔服從平均時間為10s的負指數分布 157. 每個顧客的服務時間服從均值為6.5s,標準差為1.2s的正態分布 158. 計算:顧客在收款臺的平均逗留時間(,系統的服務強度(服務時間/所有時間),平均隊長(排隊人數)。 159. 160. 情景: 161. 客戶到達,客戶排隊,一個柜臺服務, 服務耗時, 客戶離開 162. %t1 表示客戶平均到達時間間隔 163. %t2 表示客戶平均服務時間 164. %sigma 表示客戶服務時間標準差 165. %num 表示客戶數 166. """ 167. # win1 = Toplevel() 168. # win1.title("排隊模型仿真") 169. # win1.geometry('1000x450+100+100') 170. # win1.resizable(0,0) 171. 172. num = len(Time["serve"]) 173. 174. """顧客服務與離開仿真""" 175. #顧客到達時刻 176. a=list(Time["arrive"]) 177. arrive_t=[0]*num #客戶到達時間列表 178. arrive_t[0]=a[0] 179. for i in range(num-1): 180. arrive_t[i+1] = arrive_t[i]+a[i+1] 181. #顧客開始服務時刻 182. b=list(Time["serve"]) 183. serve_t=[0]*num #客戶服務時間列表 184. serve_t[0]=arrive_t[0] 185. for i in range(num-1): 186. if serve_t[i]+b[i]>arrive_t[i+1]: 187. serve_t[i+1] = serve_t[i]+b[i] 188. else:serve_t[i+1] =arrive_t[i+1] 189. # 計算每人平均逗留時間 190. T=0 191. for i in range(num): 192. t=serve_t[i]+b[i]-arrive_t[i] 193. T+=t 194. print("每人平均逗留時間(分鐘):{0:n}".format(T/num) ) 195. tk.Label(win, text="每人平均逗留時間(分鐘):{0:n}".format(T/num)).grid(row=1,column=2) 196. 197. #計算系統的服務強度 198. print("系統的服務強度:{0:n}".format(np.sum(b)/(serve_t[-1]+b[-1])) ) 199. tk.Label(win, text="系統的服務強度:{0:n}".format(np.sum(b)/(serve_t[-1]+b[-1]))).grid(row=2,column=2) 200. 201. #計算平均隊長(隊長即某時刻排隊人數。每當有人到達,記錄一次隊長) 202. n=1; x=0 203. list_len=[0]*num 204. for i in range(num-1): 205. n+=1 206. for j in range(x,i): 207. if arrive_t[i+1]>serve_t[j]+b[j]: 208. n-=1 209. x=j+1 210. list_len[i]=n 211. print("平均隊長(人數):{0:n}".format(np.sum(list_len)/(len(list_len))) ) 212. tk.Label(win, text="平均隊長(人數):{0:n}".format(np.sum(list_len)/(len(list_len)))).grid(row=3,column=2) 213. 214. #負指數分布 215. plt.hist(Time["arrive"], bins=100, alpha=0.7, normed=True) 216. plt.margins(0.02) 217. t1=np.sum(Time["arrive"])/num 218. tk.Label(win, text="到達時間間隔均值(分鐘):{0:n}".format(t1)).grid(row=4,column=2) 219. lam = 1 / t1 220. x = np.arange(0,t1*8,0.1) 221. y = lam * np.exp(- lam * x) 222. plt.plot(x,y,color='orange', lw=3) 223. plt.title('到達時間分布',fontproperties=my_font) 224. plt.xlabel('time') 225. plt.ylabel('PDF') 226. plt.savefig(fname="到達時間分布.png",figsize=[5,5]) 227. plt.cla() 228. #正態分布 229. t2=norm.fit(Time["serve"])[0] 230. tk.Label(win, text="服務時間均值(分鐘):{0:n}".format(t2)).grid(row=5,column=2) 231. sigma=norm.fit(Time["serve"])[1] 232. tk.Label(win, text="服務時間標準差:{0:n}".format(sigma)).grid(row=6,column=2) 233. plt. hist((Time["serve"]), bins=100, alpha=0.7, normed=True) 234. x = np.linspace(t2-3*sigma,t2+3*sigma,num) 235. y = pdf = np.exp(-((x - t2)**2) / (2* sigma**2)) / (sigma * np.sqrt(2*np.pi)) 236. plt.plot(x,y, color='orange', lw=3) 237. plt.title('服務時間分布',fontproperties=my_font) 238. plt.xlabel('time') 239. plt.ylabel('PDF') 240. plt.savefig(fname="服務時間分布.png",figsize=[5,5]) 241. plt.cla() 242. 243. img_png = tk.PhotoImage(file = '到達時間分布.png') 244. tk.Label(win,image = img_png).grid(row=8,column=0) 245. img_png1 = tk.PhotoImage(file = '服務時間分布.png') 246. tk.Label(win,image = img_png1).grid(row=8,column=2) 247. win.mainloop() 248. 249. def csv(): #導入csv文件 250. win = Toplevel() 251. win.title("超市收銀臺") 252. win.geometry('1500x900+100+100') 253. win.resizable(0,0) 254. text=tk.Label(win,text="超市收銀臺",font=( 'Times',20)).grid(row=0,column=1) 255. #標簽 256. tk.Label(win, text="csv文件路徑:").grid(row=1) 257. # 創建輸入框控件 258. e1 = tk.Entry(win) 259. e1.grid(row=1, column=1, padx=10, pady=5) 260. def calc2(): 261. Time = pd.read_csv(e1.get()) 262. cashierService_csv(Time,win) 263. tk.Button(win, text="確定", width=10, command=calc2).grid(row=7, column=0, sticky="w", padx=10, pady=5) 264. tk.Button(win, text="退出", width=10, command=win.quit).grid(row=7, column=1, sticky="e", padx=10, pady=5) 265. 266. #主函數 267. import tkinter as tk 268. root_window =tk.Tk() 269. root_window.title('基于排隊論模型的收銀臺服務系統的分析及可視化設計') 270. root_window.geometry('500x100+200+200') 271. text=tk.Label(root_window,text="請選擇參數輸入方式:",font=( 'Times',20)) 272. text.pack() 273. button=tk.Button(root_window,text="導入csv文件",width=10,command=csv) 274. button.pack(side="bottom") 275. button=tk.Button(root_window,text="直接輸入參數",width=10,command=param) 276. button.pack(side="bottom") 277. root_window.mainloop()總結
以上是生活随笔為你收集整理的基于排队论模型的收银台服务系统的分析及可视化设计的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机在剪辑方面的应用,多媒体技术对影视
- 下一篇: 浅析:通过自定义DSL实现一个序列号生成