【问题标题】:"Weighting" the amount of a SimPy Resource to use for a process“加权”用于进程的 SimPy 资源量
【发布时间】:2021-08-06 00:15:01
【问题描述】:

我想向 SimPy 中的资源发送订单,指定资源将制造的产品数量。

我的问题是,当我发送 100 个数量的订单时,资源仅用于 1 个订单,而不是用于 100 个数量。有没有办法在 SimPy 中对此进行建模?

我了解如何使用容器和存储而不是资源Resource,但对于我更大的应用程序,我希望这是一个资源,因为不同的产品库存级别将存储在Container 级别中。此资源将在多个产品之间共享。

这是我上面问题的模拟简单示例。谢谢! 如果我可以添加plan_for_hour_x 作为processing_capacity.request(plan_for_hour_x) 的参数,那将解决我的问题,但这似乎是不可能的。

import simpy
env = simpy.Environment()
processing_capacity_per_hour = simpy.Resource(env, capacity=1000)
DEMAND_IN_HOUR_1 = 100

def production_plan(env, processing_capacity, plan_for_hour_x): 
    yield env.timeout(1)
    print(f'The current time is {env.now}')
    with processing_capacity.request() as req:
        yield req
        print(f'Resources in use 1: {processing_capacity.count}')
        yield env.timeout(1)
            
env.process(production_plan(env, 
                            processing_capacity_per_hour, 
                            DEMAND_IN_HOUR_1))
env.run(until=5)
print(f'The ending time is {env.now}')

>>> The current time is 1
>>> Resources in use 1: 1
>>> The ending time is 5

【问题讨论】:

  • 我发现我可以使用request()release() 方法,而不是与resource.request() as req 一起使用。但是,我仍在研究如何自动化 100 个请求和释放语句,因为 DEMAND_IN_HOUR_1 = 100。
  • 另一个线程上的解决方案对我有用:stackoverflow.com/questions/39396024/…。向下滚动到“根据 Stefan Scherfke 的评论更新,将 req 显式传递给新进程:”。因此,这暂时有效。我确实想知道是否有一个我忽略的更简单的解决方案。谢谢!

标签: python simpy


【解决方案1】:

如果你想一次抓住 100 个资源,那么就这样做

import simpy
from simpy.events import AllOf
env = simpy.Environment()
processing_capacity_per_hour = simpy.Resource(env, capacity=1000)
DEMAND_IN_HOUR_1 = 100

def production_plan(env, processing_capacity, plan_for_hour_x): 
    yield env.timeout(1)
    print(f'The current time is {env.now}')

    req_list = [processing_capacity.request() for _ in range(plan_for_hour_x)]
    
    yield AllOf(env, req_list)
    print(f'Resources in use: {processing_capacity.count}')
    yield env.timeout(1)

    for req in req_list:
        processing_capacity.release(req)

    print(f'Resources in use: {processing_capacity.count}')
            
env.process(production_plan(env, 
                            processing_capacity_per_hour, 
                            DEMAND_IN_HOUR_1))
env.run(until=5)
print(f'The ending time is {env.now}')

这将打印出来

The current time is 1
Resources in use: 100
Resources in use: 0
The ending time is 5

但听起来容器可能是比资源更好的选择

【讨论】:

  • 谢谢!这更有意义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-03
  • 2014-07-02
  • 1970-01-01
  • 2023-03-25
相关资源
最近更新 更多