2016-11-19 62 views
1

我想對兩種類型的顧客進行模擬:普通客戶和VIP。Simpy:使用兩種類型的流程進行模擬

我不想爲這些客戶提供FIFO。相反 - 無論隊列是什麼樣子 - 我想爲有機會的貴賓服務p和有機會的正常客戶1-p

我知道Simpy的基本知識,但我不知道如何實現收銀員選擇下一個客戶的不同方式。

+0

能否請你澄清你的問題一點? –

回答

0

最簡單的方法是創建兩個的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() 
0

以下代碼不會使用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' 
+0

這可能有幫助。我打算使用simpy,因爲它是一個離散事件模擬器。因爲我對等待時間感興趣,所以... simpy似乎很有用。 – Dai