मैं निर्माण उपकरण के मॉडल के लिए सिम्पी का उपयोग कर रहा हूं। उपकरण को कुछ निर्दिष्ट सामग्रियों का उपयोग करके उत्पाद बनाने की आवश्यकता होती है। मैंने निम्नलिखित कोड में दिखाए गए अनुसार 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 प्राप्त करता है। हमने पुष्टि की है कि परिणाम अपेक्षित हैं यदि मैं चर, आइटमनाम का उपयोग नहीं करता हूं, और इसे अलग से कोड करता हूं।

    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))])

मुझे इसे कैसे कोड करना चाहिए? कुछ सहायता की अत्यधिक सराहना की जाएगी।

0
taka 20 जुलाई 2021, 08:44

1 उत्तर

सबसे बढ़िया उत्तर

यह सूक्ष्म है।
आप लैम्ब्डा में आइटमनाम वही आइटमनाम है जिसका उपयोग for स्टेटमेंट में किया गया है लेकिन, लैम्ब्डा for स्टेटमेंट के पूरा होने तक निष्पादित नहीं होता है, इसका अर्थ यह है कि जब लैम्ब्डा अंत में चलते हैं तो वे सभी for स्टेटमेंट से एक ही आइटमनाम वैरिएबल का उपयोग कर रहे हैं, जिसमें for स्टेटमेंट मैट 4 के लूप असाइनमेंट के लिए अंतिम है। इसे एक बाड़े के रूप में भी जाना जाता है जो काफी उपयोगी हो सकता है

इसे ठीक करने के लिए आपके लैम्ब्डा को एक स्थानीय आइटमनाम चर की आवश्यकता है

अपडेट करें

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"] ]
0
Michael 7 अगस्त 2021, 07:16
बहुत - बहुत धन्यवाद! यह पूरी तरह से काम कर रहा है !!
 – 
taka
11 अगस्त 2021, 05:14