如何按多个项目使用 Filter Store
How to use Filter Store by several items
我正在使用简单的制造设备模型。设备需要使用一些指定的材料来制作产品。我尝试使用 FilterStore 对其进行建模,如以下代码所示。
import simpy
class Material:
def __init__(self,name):
self.name = name
class Machine(object):
def __init__(self,env):
self.env = env
self.inputs = simpy.FilterStore(env)
def run(self):
mat = [ self.inputs.get(lambda i: i.name == itemname ) for itemname in ["mat1","mat2","mat4"] ]
res = yield self.env.all_of(mat)
print([res.events[i]._value.name for i in range(len(res.events))])
def input_materials(env,m):
for i in range(5):
m.inputs.put(Material( "mat"+str(i) ))
m.inputs.put(Material( "mat"+str(i) ))
m.inputs.put(Material( "mat"+str(i) ))
yield env.timeout(1)
env = simpy.Environment()
machine = Machine(env)
env.process(machine.run())
env.process(input_materials(env,machine))
env.run()
以上代码输出如下
['mat4', 'mat4', 'mat4']
我想得到[mat1,mat2,mat4],但是上面的代码都得到了mat4。
我们已经确认,如果我不使用变量,itemname,单独编码如下,结果是预期的。
def run(self):
m1 = self.inputs.get(lambda i: i.name == "mat1" )
m2 = self.inputs.get(lambda i: i.name == "mat2" )
m4 = self.inputs.get(lambda i: i.name == "mat4" )
res = yield self.env.all_of([m1,m2,m4])
print([res.events[i]._value.name for i in range(len(res.events))])
我应该如何编码?如果能提供帮助,我们将不胜感激。
这很微妙。
您 lambda 中的项目名称与 for
语句中使用的项目名称相同
但是,lambda 直到 for
语句完成后才会执行,
这意味着当 lambda 最终执行 运行 时,它们都使用来自 for
语句的相同 itemname 变量和 for
语句的最后一个 for 循环赋值 mat4。
这也称为外壳,非常有用
要解决此问题,您的 lambda 需要一个本地 itemname 变量
更新
mat = [ self.inputs.get(lambda i: i.name == itemname ) for itemname in ["mat1","mat2","mat4"] ]
到
mat = [ self.inputs.get(lambda i,itemname=itemname: i.name == itemname ) for itemname in ["mat1","mat2","mat4"] ]
我正在使用简单的制造设备模型。设备需要使用一些指定的材料来制作产品。我尝试使用 FilterStore 对其进行建模,如以下代码所示。
import simpy
class Material:
def __init__(self,name):
self.name = name
class Machine(object):
def __init__(self,env):
self.env = env
self.inputs = simpy.FilterStore(env)
def run(self):
mat = [ self.inputs.get(lambda i: i.name == itemname ) for itemname in ["mat1","mat2","mat4"] ]
res = yield self.env.all_of(mat)
print([res.events[i]._value.name for i in range(len(res.events))])
def input_materials(env,m):
for i in range(5):
m.inputs.put(Material( "mat"+str(i) ))
m.inputs.put(Material( "mat"+str(i) ))
m.inputs.put(Material( "mat"+str(i) ))
yield env.timeout(1)
env = simpy.Environment()
machine = Machine(env)
env.process(machine.run())
env.process(input_materials(env,machine))
env.run()
以上代码输出如下
['mat4', 'mat4', 'mat4']
我想得到[mat1,mat2,mat4],但是上面的代码都得到了mat4。 我们已经确认,如果我不使用变量,itemname,单独编码如下,结果是预期的。
def run(self):
m1 = self.inputs.get(lambda i: i.name == "mat1" )
m2 = self.inputs.get(lambda i: i.name == "mat2" )
m4 = self.inputs.get(lambda i: i.name == "mat4" )
res = yield self.env.all_of([m1,m2,m4])
print([res.events[i]._value.name for i in range(len(res.events))])
我应该如何编码?如果能提供帮助,我们将不胜感激。
这很微妙。
您 lambda 中的项目名称与 for
语句中使用的项目名称相同
但是,lambda 直到 for
语句完成后才会执行,
这意味着当 lambda 最终执行 运行 时,它们都使用来自 for
语句的相同 itemname 变量和 for
语句的最后一个 for 循环赋值 mat4。
这也称为外壳,非常有用
要解决此问题,您的 lambda 需要一个本地 itemname 变量
更新
mat = [ self.inputs.get(lambda i: i.name == itemname ) for itemname in ["mat1","mat2","mat4"] ]
到
mat = [ self.inputs.get(lambda i,itemname=itemname: i.name == itemname ) for itemname in ["mat1","mat2","mat4"] ]