2016-11-19 21 views
1

通常の顧客とVIPの2種類の顧客を持つ店舗のシミュレーションを行いたいとします。Simpy:2種類のプロセスによるシミュレーション

私はこれらの顧客FIFOに奉仕したくありません。代わりに、待ち行列がどのように見えるかに関わらず、私はチャンスがpで、通常の顧客は1-pのVIPにサービスしたいと思います。

私はSimpyの基本を知っていますが、私はキャッシャーが次に提供される顧客を選ぶさまざまな方法を実装する方法を知らない。

+0

、あなたの質問ビットを明確にしてくださいもらえますか? –

答えて

0

簡単な方法は、定期的およびVIP、2つのSimpyの店舗を作成することです:

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と通常の顧客のどちらかまたは両方が到着順に保持される必要がない場合は、VIPのためにここで行ったように、それらをPythonセットに入れることができます。一方、FIFO順で処理する必要がある場合は、Normalsのためにここで行ったように、Pythonキューを使用することができます。各コンテナにいくつかの要素を追加しました。 (均等に分散された擬似ランダム偏差がp以下になると、ノーマルが選択されます(これはあなたが望むものをベースにしていると思います)。戻ってきた;それ以外の場合は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