如何在Python SimPy中从一次输入中获得多次输出间隔时间



我用Python Simpy来模拟。

我想从原材料(factory.materials)单位生成产品库存(factory.stock)。在我得到一个单位的原材料后,我不想等待成品库存一次生成,我想每次在一定的时间间隔内生成多个库存,例如我得到一个单位的原材料,得到3个时间的产品库存,每次得到5个产品,间隔6个单位时间。

但是我的代码delay()是用来延迟时间的,但是它不起作用。如果我用产量来拖延,它会得到我的原料很多次,而我只想得到一个单位的原料。

import simpy
class Factory():
def __init__(self, env):
self.materials = simpy.Container(env, capacity = 10000, init = 9000)
self.stock = simpy.FilterStore(env, capacity = 10000) 

def create_stock(env, factory):
while True:
print('time:{0} materials:{1} stock:{2}'.format(env.now,factory.materials.level,len(factory.stock.items)))
yield factory.materials.get(1)

for i in range(5):
for j in range(2):
factory.stock.put({'order_id': 'order_id', 'id':j})
delay(2)

yield env.timeout(1)

def delay(how_long):
yield env.timeout(how_long)   

env = simpy.Environment()
factory = Factory(env)
on_process = env.process(create_stock(env, factory))

print('start...')
env.run(until = 30)
print('end')

我不确定你想要实现什么,但delay不起作用,因为delay内部的yield不屈服于功能外部。得到函数产率与写出yield env.timeout(x)是不同的。

delay(2)改为env.timeout(2)行可以解决这个问题

如果你真的想用一个函数来做,你可以用

def delay(how_long):
return env.timeout(how_long)
yield delay(2)

我想每隔2个单位的时间得到一些产品库存在5个循环,然后退出过程。将delay(2)改为env.timeout(2),无效

import simpy
class Factory():
def __init__(self, env):
self.materials = simpy.Container(env, capacity = 10000, init = 9000)
self.stock = simpy.FilterStore(env, capacity = 10000) 
def create_stock(env, factory):
while True:
print('time:{0} materials:{1} stock:{2}'.format(env.now,factory.materials.level,len(factory.stock.items)))
yield factory.materials.get(1)
for i in range(5):
for j in range(2):
factory.stock.put({'order_id': 'order_id', 'id':j})
env.timeout(2)
yield env.timeout(0)

env = simpy.Environment()
factory = Factory(env)
on_process = env.process(create_stock(env, factory))

print('start...')
env.run(until = 30)
print('end')

我使用生成器的yield,它有效。当得到一个单位的材料时,每三个单位时间出两个库存。

import simpy
class Factory():
def __init__(self, env):
self.materials = simpy.Container(env, capacity = 10000, init = 9000)
self.stock = simpy.FilterStore(env, capacity = 10000) 
def create_stock(env, factory):
while True:
#print('time:{0} materials:{1} stock:{2}'.format(env.now,factory.materials.level,len(factory.stock.items)))
yield factory.materials.get(1)
for i in range(5):
yield from get_stock()

def get_stock():
print('time:{0} materials:{1} stock:{2}'.format(env.now,factory.materials.level,len(factory.stock.items)))
for i in range(2):
factory.stock.put({'order_id': '', 'id':i})
yield env.timeout(3)


env = simpy.Environment()
factory = Factory(env)
on_process = env.process(create_stock(env, factory))

print('start...')
env.run(until = 200)
print('end')

您只需要在内部超时中添加yield试试这个

import simpy
class Factory():
def __init__(self, env):
self.materials = simpy.Container(env, capacity = 10000, init = 9000)
self.stock = simpy.FilterStore(env, capacity = 10000) 
def create_stock(env, factory):
while True:
print('time:{0} materials:{1} stock:{2}'.format(env.now,factory.materials.level,len(factory.stock.items)))
yield factory.materials.get(1)
for i in range(5):
for j in range(2):
factory.stock.put({'order_id': 'order_id', 'id':j})
#env.timeout(2)
yield env.timeout(2)
print('time:{0} materials:{1} stock:{2}'.format(env.now,factory.materials.level,len(factory.stock.items)))

env = simpy.Environment()
factory = Factory(env)
on_process = env.process(create_stock(env, factory))

print('start...')
env.run(until = 30)
print('end')

最新更新