Python開發——排隊問題隨機模擬分析


案例:主要是基於“蒙特卡羅思想”,求解排隊等待時間問題

 場景:廁所排隊問題

1、兩場電影結束時間相隔較長,互不影響;

2、每場電影結束之后會有20個人想上廁所;

3、這20個人會在0到10分鍾之內全部到達廁所;

4、每個人上廁所時間在1-3分鍾之間

首先模擬最簡單的情況,也就是廁所只有一個位置,不考慮兩人共用的情況則每人必須等上一人出恭完畢方可進行。

分析:對於每個人都有如下幾個參數:

到達時間 / 等待時間 / 開始上廁所時間 / 結束時間

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:Dang

'''
Part1  設置隨機值
'''
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

arrivingtime = np.random.uniform(0,10,size = 20)
arrivingtime.sort()
workingtime = np.random.uniform(1,3,size = 20)
# np.random.uniform 隨機數:均勻分布的樣本值

startingtime = [0 for i in range(20)]
finishtime = [0 for i in range(20)]
waitingtime = [0 for i in range(20)]
emptytime = [0 for i in range(20)]
# 開始時間都是0
print('arrivingtime\n',arrivingtime,'\n')
print('workingtime\n',workingtime,'\n')
print('startingtime\n',startingtime,'\n')
print('finishtime\n',finishtime,'\n')
print('waitingtime\n',waitingtime,'\n')
print('emptytime\n',emptytime,'\n')

'''
Part2  第一人上廁所時間
'''
startingtime[0] = arrivingtime[0]
# 第一個人之前沒有人,所以開始時間 = 到達時間
finishtime[0] = startingtime[0] + workingtime[0]
# 第一個人完成時間 = 開始時間 + “工作”時間
waitingtime[0] = startingtime[0]-arrivingtime[0]
# 第一個人不用等待
print(startingtime[0])
print(finishtime[0])
print(waitingtime[0])

'''
Part3  第二人之后
'''
for i in range(1,len(arrivingtime)):
    if finishtime[i-1] > arrivingtime[i]:
        startingtime[i] = finishtime[i-1]
    else:
        startingtime[i] = arrivingtime[i]
        emptytime[i] = arrivingtime[i] - finishtime[i-1]
    # 判斷:如果下一個人在上一個人完成之前到達,則 開始時間 = 上一個人完成時間,
    # 否則 開始時間 = 到達時間,且存在空閑時間 = 到達時間 - 上一個人完成時間
    finishtime[i] = startingtime[i] + workingtime[i]
    waitingtime[i] = startingtime[i] - arrivingtime[i]
    print('第%d個人:到達時間 開始時間 “工作”時間 完成時間 等待時間\n' %i,
          arrivingtime[i],
          startingtime[i],
          workingtime[i],
          finishtime[i],
          waitingtime[i],
         '\n')

print('arerage waiting time is %f' %np.mean(waitingtime))

"""
數據統計
"""
sns.set(style = 'ticks',context = "notebook")
fig = plt.figure(figsize = (8,6))
arrivingtime, = plt.plot(arrivingtime,label = 'arrivingtime')
startingtime, = plt.plot(startingtime,label = 'startingtime')
workingtime, = plt.plot(workingtime,label = 'workingtime')
finishtime, = plt.plot(finishtime,label = 'finishtime')
waitingtime, = plt.plot(waitingtime,label = 'waitingtime')

plt.title(("Queuing problem random simulation experiment").title())

plt.xlabel("Arriving Time(min)")
plt.ylabel("Total Time(min)")

plt.legend(handles=[arrivingtime,startingtime,workingtime,finishtime,waitingtime],
           loc = 'upper left')

plt.show()

 

運行結果


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM