Simpy:模拟两种类型的过程
Simpy: simulation with two types of processes
我想模拟一家商店有两种类型的顾客:普通顾客和 VIP。
我不想为这些客户提供先进先出的服务。相反 - 无论队列是什么样子 - 我想服务 VIP 的机会 p 和普通客户的机会 1-p.
我知道 Simpy 的基础知识,但我不知道如何实施收银员挑选接下来要服务的顾客的不同方式。
以下代码没有使用 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 商店,Regular 和 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()
我想模拟一家商店有两种类型的顾客:普通顾客和 VIP。
我不想为这些客户提供先进先出的服务。相反 - 无论队列是什么样子 - 我想服务 VIP 的机会 p 和普通客户的机会 1-p.
我知道 Simpy 的基础知识,但我不知道如何实施收银员挑选接下来要服务的顾客的不同方式。
以下代码没有使用 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 商店,Regular 和 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()