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

问题描述

我使用 Python Simpy 进行模拟。

我想从一个单位的原材料(工厂.材料)生成产品库存(工厂.库存)。 我拿到一单位原料后, 我不想等待一次生成一个成品库存, 我想每次以一定的时间间隔生成多个库存, 例如我得到一个单位的原材料,得到树次产品库存,每次得到 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')

解决方法

我不确定您想要实现什么,但是 delay 不起作用,因为 yield 内的 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')
,

我使用发电机的产量,它有效。当得到一个单位材料时,每 3 个单位时间推出 2 个库存。

import simpy
class Factory():
    def __init__(self,factory):
    while True:
        #print('time:{0} materials:{1} stock:{2}'.format(env.now,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,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')
,

您只需要为您的内部超时添加一个收益 试试这个

import simpy
class Factory():
    def __init__(self,'id':j})
            #env.timeout(2)
            yield env.timeout(2)
            print('time:{0} materials:{1} stock:{2}'.format(env.now,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')