【发布时间】:2019-07-11 18:23:56
【问题描述】:
我在 SimPy 模拟中遇到了一个问题,即多个事件在同一时间步以错误的顺序发生。具体来说,我正在模拟一条生产线,其中机器会定期出现故障并接受维护。当一台机器在t1维修时,它应该在那个时候恢复生产。但是,事件发生的顺序是
- 检查是否修复完成
- 完成修复
- 如果修复,恢复生产
当我想要它时
- 完成修复
- 检查是否修复完成
- 如果修复,恢复生产
有没有办法改变事件的执行顺序?
这是我遇到的问题的一个最小示例:
import random
import simpy
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())
env.process(self.maintenance())
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
while self.failed:
# wait for maintenance to finish
yield self.env.timeout(1)
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):
while True:
while not self.failed:
# wait for failure to occur
yield self.env.timeout(1)
print(f'Starting repair at t={self.env.now}')
ttr = random.randint(1,8)
print(f'TTR={ttr}')
yield self.env.timeout(ttr)
self.failed = False
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)
输出是:
Machine failed at t=2
Starting repair at t=2
TTR=1
Finished repair at t=3
Resuming production at t=4
Machine failed at t=6
Starting repair at t=6
TTR=6
Finished repair at t=12
Resuming production at t=12
Machine failed at t=14
Starting repair at t=15
TTR=1
Finished repair at t=16
Resuming production at t=16
Machine failed at t=23
Starting repair at t=24
TTR=8
Finished repair at t=32
Resuming production at t=32
Machine failed at t=37
Starting repair at t=38
TTR=2
Finished repair at t=40
Resuming production at t=40
Machine failed at t=42
Starting repair at t=43
TTR=2
Finished repair at t=45
Resuming production at t=45
对于第一次故障,修复在t=3 正确完成,但直到t=4 才恢复生产。查看第三个故障,故障发生在t=14,但直到t=15 才开始修复。似乎这些进程并行运行(production 和maintenance)会产生问题并不一致地检查条件,所以我的想法是我需要完全重新设计它们。
【问题讨论】:
-
你能分享一些代码吗?答案可能很简单,只需重新排序一些代码行,或者可能需要事件逻辑。
-
我相信它是this question.的副本
-
我添加了一个示例,应该有助于解释我的问题。