2016-11-19 61 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