我试图模拟这样一种情况:我们有 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))
但这是行不通的,我无法找出最好的方法来产生一个选择。
模拟这种情况的最佳方法是什么?为了完整起见,我正在寻找以下内容:
- 请求 3 台机器中的任意一个
- 请求特定机器
- 让每台机器跟踪它的历史
- 每台机器的特性都不同。即犯规速度更快,但最初工作速度更快
- 根据性能或指标检测并安排清洁
这是我迄今为止尝试将每个资源建模为单独资源的最新版本的内容
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))