如何确定同时发生的SimPy事件的优先级?

时间:2019-07-11 18:23:56

标签: python simpy

我在SimPy模拟中遇到了一个问题,其中多个事件以错误的顺序同时发生。具体来说,我正在对一条生产线建模,在该生产线中,机器会定期发生故障并接受维护。在t1时间修理一台机器时,它应该在那时恢复生产。但是,事件发生的顺序是

  1. 检查维修是否完成
  2. 完全维修
  3. 如果已修复,请恢复生产

当我想要的时候

  1. 完全维修
  2. 检查维修是否完成
  3. 如果已修复,请恢复生产

是否可以更改事件执行的顺序?

2 个答案:

答案 0 :(得分:1)

我建议更改您的代码以避免出现您描述的情况。您描述的代码设计对事件处理的时间/顺序很敏感,即使您正确地确定了事件的顺序,其他代码也会在以后的版本中出错。

如果更改代码设计,以便生产机器等待维修而不是定期检查,则应该避免该问题。

该过程将是:

  1. 生产机器坏了;等待维修。
  2. 修理工完成维修;通知生产机器。
  3. 生产机器恢复生产。

答案 1 :(得分:0)

当多个进程同时调用componentDidUpdate(){ if(this.props.user.associatedID){ console.log("Ok now we're good"); } else{ console.log("Still waiting!"); } } 时,似乎出现了问题。这是我找到的解决方案:

self.env.timeout(1)

此代码产生我期望的输出。

class machine:
    def __init__(self, env, process_time):
        self.env = env
        self.process_time = process_time

        self.remaining_process_time = process_time
        self.failed = False
        self.parts_made = 0

        env.process(self.production())

    def production(self):
        while True:
            while self.remaining_process_time:
                if random.random() < 0.1:
                    # machine fails                
                    print(f'Machine failed at t={self.env.now}')
                    self.failed = True
                    yield self.env.process(self.maintenance())

                    print(f'Resuming production at t={self.env.now}\n')

                yield self.env.timeout(1)
                self.remaining_process_time -= 1
            self.parts_made += 1
            self.remaining_process_time = self.process_time

    def maintenance(self):
        print(f'Starting repair at t={self.env.now}')
        ttr = random.randint(1,8)
        print(f'TTR={ttr}')
        yield self.env.timeout(ttr)
        self.remaining_process_time = self.process_time
        print(f'Finished repair at t={self.env.now}')

random.seed(1234)

env = simpy.Environment()
system = machine(env, 5)
env.run(until=50)