【问题标题】:How to get many times outputs interval time from geting one input in Python SimPy如何从 Python SimPy 中的一个输入中获得多次输出间隔时间
【发布时间】:2021-03-08 03:40:49
【问题描述】:

我使用 Python Simpy 进行模拟。

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

但是我的代码delay()是用来延迟时间的,但是不起作用。 如果我使用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})
            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')

【问题讨论】:

    标签: python simulation simpy


    【解决方案1】:

    我不确定你想要实现什么,但 delay 不起作用,因为 delay 内部的 yield 不会屈服于函数外部。有函数yield和写yield env.timeout(x)是不一样的。

    将行 delay(2) 更改为 env.timeout(2) 将解决该问题

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

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

    【讨论】:

    • 想你的答案。但是将延迟(2)更改为 env.timeout(2),它不起作用。
    【解决方案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')
    

    【讨论】:

      【解决方案3】:

      我使用发电机的产量,它可以工作。当得到一个单位材料时,每3个单位时间推出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):
                  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')
      

      【讨论】:

        【解决方案4】:

        你只需要在你的内部超时中添加一个 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')
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-05-14
          • 2023-01-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多