2016-11-19 13 views
1

Я хочу создать имитацию магазина с двумя типами клиентов: обычным клиентом и VIP.Simpy: симуляция с двумя типами процессов

Я не хочу обслуживать этих клиентов FIFO. Вместо этого - независимо от того, что выглядит в очереди: я хочу, чтобы VIP-VIP мог получить p и обычного клиента с вероятностью 1-p.

Я знаю основы Simpy, но я не знаю, как реализовать различные способы, которыми кассир выбирает клиента, который будет обслуживаться следующим.

+0

Не могли бы вы уточнить ваш вопрос немного? –

ответ

0

Самый простой способ заключается в создании двух Simpy Stores, 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() 
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