SimPy资源3,每个都有不同的特征

时间:2014-07-21 14:11:57

标签: python simpy

我正在尝试模拟我们有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. 根据效果或指标
  6. 检测并安排清洁

    到目前为止,这是我最近一次尝试将每个模型作为单独资源进行建模的方法

    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))
    

1 个答案:

答案 0 :(得分:4)

你应该尝试(过滤)商店:

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()