我想對兩種類型的顧客進行模擬:普通客戶和VIP。Simpy:使用兩種類型的流程進行模擬
我不想爲這些客戶提供FIFO。相反 - 無論隊列是什麼樣子 - 我想爲有機會的貴賓服務p和有機會的正常客戶1-p。
我知道Simpy的基本知識,但我不知道如何實現收銀員選擇下一個客戶的不同方式。
我想對兩種類型的顧客進行模擬:普通客戶和VIP。Simpy:使用兩種類型的流程進行模擬
我不想爲這些客戶提供FIFO。相反 - 無論隊列是什麼樣子 - 我想爲有機會的貴賓服務p和有機會的正常客戶1-p。
我知道Simpy的基本知識,但我不知道如何實現收銀員選擇下一個客戶的不同方式。
最簡單的方法是創建兩個的simpy商店,普通和VIP:
import simpy
import random
# create 2 stores
env = simpy.Environment()
regularStore = simpy.Store(env)
vipStore = simpy.Store(env)
# populate (you can use any generate process here)
regularStore.put('customer')
vipStore.put('VIP')
def server(env, regularStore, vipStore, p):
# create the choose process
if random.random() <= p:
pickCustomer = yield vipStore.get()
else:
pickCustomer = yield regularStore.get()
print(pickCustomer)
env.process(server(env, regularStore, vipStore, 0.30))
env.run()
以下代碼不會使用Simpy,但它可能會說明您需要什麼。如果VIP和普通客戶中的任何一個或兩個都不需要保留在到達順序中,那麼您可以將它們放入Python集合中,就像我在這裏爲VIP所做的那樣。另一方面,如果它們必須以FIFO的順序進行服務,那麼你可以使用Python隊列,就像我在這裏爲Normals所做的那樣。我已經爲每個容器添加了一些元素。 (顯然你的代碼會添加某種Simpy對象,而不是單個字符。)如果均勻分佈的僞隨機偏差低於p那麼選擇一個Normal(這是對你想要的東西的低音讚賞,我認爲)和回;否則,一個VIP。
>>> VIPs = set (['1', '2', '3'])
>>> from queue import Queue
>>> Normals = Queue()
>>> Normals.put('a')
>>> Normals.put('b')
>>> Normals.put('c')
>>> p = 0.75
>>> def selectCustomer(VIPs, Normals, p):
... from random import random
... if random() < p:
... return Normals.get()
... else:
... return VIPs.pop()
...
>>> selectCustomer(VIPs, Normals, p)
'2'
>>> selectCustomer(VIPs, Normals, p)
'a'
>>> selectCustomer(VIPs, Normals, p)
'1'
>>> selectCustomer(VIPs, Normals, p)
'b'
這可能有幫助。我打算使用simpy,因爲它是一個離散事件模擬器。因爲我對等待時間感興趣,所以... simpy似乎很有用。 – Dai
能否請你澄清你的問題一點? –