【问题标题】:SimPy Resource of 3 where each has different characteristics3 个 SimPy 资源,每个都有不同的特征
【发布时间】:2014-07-21 14:11:56
【问题描述】:

我试图模拟一种情况,即我们有 5 台机器出现在 1 -> 3 -> 1 的情况下。即中间的 3 个并行运行,以减少它们所花费的有效时间。

我可以通过创建一个值为 3 的 SimPy 资源来轻松模拟这一点,如下所示:

simpy.Resource(env, capacity=3)

但是在我的情况下,这三种资源中的每一种的运作方式都略有不同,有时我希望能够使用其中的任何一种(当我在运作时)或预订一个特定的资源(当我想要清理时)。基本上这三台机器以不同的速度慢慢地结垢并且运行速度较慢,我希望能够模拟这些并且当一台机器变得太脏时也能够进行清洁。

我尝试了几种模拟这种情况的方法,但每次都遇到问题和问题。

第一个是当它预订资源时,它还预订了 3 台机器(A、B、C)中的一个全局标志和一个标志本身来告诉它正在使用哪台机器。这可行,但它并不干净,并且很难理解到处都有巨大的 if 语句发生了什么。

第二个是将其建模为三个独立的资源,然后尝试等待并请求 3 台机器中的一台,例如:

reqA = A.res.request()
reqB = B.res.request()
reqC = C.res.request()

unitnumber = yield reqA | reqB | reqC
yield env.process(batch_op(env, name, machineA, machineB, machineC, unitnumber))

但这行不通,我无法找出最佳方式来考虑产生一个选择。

模拟这种情况的最佳方法是什么。为了完整起见,这是我正在寻找的:

  1. 请求 3 台机器中的任何一台
  2. 请求特定机器
  3. 让每台机器跟踪它的历史
  4. 每台机器的特性是否不同。即犯规更快,但最初工作更快
  5. 根据性能或指标检测和安排清洁

这是我目前尝试将每个资源建模为单独资源的最新版本的内容

class Machine(object):

    def __init__(self, env, cycletime, cleantime, k1foul, k2foul):
        self.env = env
        self.res = simpy.Resource(env, 1)

        self.cycletime = cycletime
        self.cleantime = cleantime
        self.k1foul = k1foul
        self.k2foul = k2foul
        self.batchessinceclean = 0

    def operate(self):
        self.cycletime = self.cycletime + self.k2foul * np.log(self.k1foul * self.batchessinceclean + 1)
        self.batchessinceclean += 1
        yield self.env.timeout(self.cycletime) 

    def clean(self):
        print('%s begin cleaning at %s' % (self.env.now))
        self.batchessinceclean = 0
        yield env.timeout(self.cleantime)
        print('%s finished cleaning at %s' % (self.env.now))

【问题讨论】:

    标签: python simpy


    【解决方案1】:

    你应该试试 (Filter)Store:

    import simpy
    
    
    def user(machine):
        m = yield machine.get()
        print(m)
        yield machine.put(m)
    
        m = yield machine.get(lambda m: m['id'] == 1)
        print(m)
        yield machine.put(m)
    
        m = yield machine.get(lambda m: m['health'] > 98)
        print(m)
        yield machine.put(m)
    
    
    env = simpy.Environment()
    machine = simpy.FilterStore(env, 3)
    machine.put({'id': 0, 'health': 100})
    machine.put({'id': 1, 'health': 95})
    machine.put({'id': 2, 'health': 97.2})
    
    env.process(user(machine))
    
    env.run()
    

    【讨论】:

    • 再次感谢这完美的作品! SimPy 是一个很棒的工具,对我的建模很有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-22
    • 2022-08-04
    • 1970-01-01
    • 1970-01-01
    • 2020-03-02
    相关资源
    最近更新 更多