我一直在用Simpy手册中的总线故障示例进行实验,我真的很难理解为什么当我创建多个总线实例时,最后一个实例在第一次修复后似乎得到了“顺序”。我稍微修改了手册中initialize()语句下面的示例代码,以创建总线的两个实例(Bus1和Bus2)。下面是我的代码:
from SimPy.Simulation import *
class Bus(Process):
def operate(self,repairduration,triplength): # PEM
tripleft = triplength
# "tripleft" is the driving time to finish trip
# if there are no further breakdowns
while tripleft > 0:
yield hold,self,tripleft # try to finish the trip
# if a breakdown intervenes
if self.interrupted():
print self.interruptCause.name, 'at %s' %now()
tripleft=self.interruptLeft
# update driving time to finish
# the trip if no more breakdowns
self.interruptReset() # end self-interrupted state
# update next breakdown time
reactivate(br,delay=repairduration)
# impose delay for repairs on self
yield hold,self,repairduration
print '%s repaired at %s' %(self.name, now())
else: # no breakdowns intervened, so bus finished trip
break
print 'Bus has arrived at %s' %now()
class Breakdown(Process):
def __init__(self,myBus):
Process.__init__(self,name='Breakdown '+myBus.name)
self.bus=myBus
def breakBus(self,interval): # Process Execution Method
while True:
yield hold,self,interval # driving time between breakdowns
if self.bus.terminated(): break
# signal "self.bus" to break itself down
self.interrupt(self.bus)
initialize()
for i in range(1,5):
b=Bus('Bus%s' %i) # create a Bus object "b" called "Bus"
activate(b,b.operate(repairduration=20,triplength=1000))
# create a Breakdown object "br" for bus "b", and
br=Breakdown(b)
# activate it with driving time between
# breakdowns equal to 300
activate(br,br.breakBus(300))
simulate(until=4000)
print 'SimPy: No more events at time %s' %now()上面的输出如下:
Breakdown Bus1 at 300
Breakdown Bus2 at 300
Bus1 repaired at 320
Bus2 repaired at 320
Breakdown Bus1 at 600
Bus1 repaired at 620
Breakdown Bus2 at 620
Bus2 repaired at 640
Breakdown Bus1 at 900
Bus1 repaired at 920
Breakdown Bus2 at 920
Bus2 repaired at 940
Bus has arrived at 1060
Bus has arrived at 1060
SimPy: No more events at time 1240现在,问题来了:在t=600点上,为什么总线1在总线2出现故障之前就得到了修复?我本以为两辆公交车都会出故障,然后在“锁步”中被修好。此外,如果我创建了四个总线,前三个总线将失败,并在"lock step“中得到修复,如下所示;然而,总线4在第一次修复后的第20个位置脱离了顺序。我不明白为什么会发生这种情况,如果有人能提供任何见解,我将不胜感激。它总是发生在最后一个实例上。
Breakdown Bus1 at 300
Breakdown Bus2 at 300
Breakdown Bus3 at 300
Breakdown Bus4 at 300
Bus1 repaired at 320
Bus2 repaired at 320
Bus3 repaired at 320
Bus4 repaired at 320
Breakdown Bus1 at 600
Breakdown Bus2 at 600
Breakdown Bus3 at 600
Bus1 repaired at 620
Bus2 repaired at 620
Bus3 repaired at 620
Breakdown Bus4 at 620
Bus4 repaired at 640
Breakdown Bus1 at 900
Breakdown Bus2 at 900
Breakdown Bus3 at 900
Bus1 repaired at 920
Bus2 repaired at 920
Bus3 repaired at 920
Breakdown Bus4 at 920
Bus4 repaired at 940
Bus has arrived at 1060
Bus has arrived at 1060
Bus has arrived at 1060
Bus has arrived at 1060
SimPy: No more events at time 1240谢谢,西摩
发布于 2012-05-17 21:38:23
这似乎像预期的那样工作。分解过程必须在总线类中初始化和激活。
from SimPy.Simulation import *
class Bus(Process):
def __init__(self,name):
Process.__init__(self,name)
self.name = name
self.br=Breakdown(self)
activate(self.br,self.br.breakBus(300))
def operate(self,repairduration,triplength): # PEM
tripleft = triplength
while tripleft > 0:
yield hold,self,tripleft # try to finish the trip
if self.interrupted():
print self.interruptCause.name, 'at %s' %now()
tripleft=self.interruptLeft
self.interruptReset() # end self-interrupted state
# update next breakdown time
reactivate(self.br,delay=repairduration)
yield hold,self,repairduration
print '%s repaired at %s' %(self.name, now())
else: # no breakdowns intervened, so bus finished trip
break
print 'Bus has arrived at %s' %now()
class Breakdown(Process):
def __init__(self,myBus):
Process.__init__(self,name='Breakdown '+myBus.name)
self.bus=myBus
def breakBus(self,interval): # Process Execution Method
while True:
yield hold,self,interval # driving time between breakdowns
if self.bus.terminated(): break
# signal "self.bus" to break itself down
self.interrupt(self.bus)
initialize()
for i in range(1,5):
b=Bus('Bus%s' %i)
activate(b,b.operate(repairduration=20,triplength=1000))
simulate(until=4000)
print 'SimPy: No more events at time %s' %now()这会导致总线同时中断的四个实例同时被修复,如以下输出所示:
Breakdown Bus1 at 300
Breakdown Bus2 at 300
Breakdown Bus3 at 300
Breakdown Bus4 at 300
Bus1 repaired at 320
Bus2 repaired at 320
Bus3 repaired at 320
Bus4 repaired at 320
Breakdown Bus1 at 600
Breakdown Bus2 at 600
Breakdown Bus3 at 600
Breakdown Bus4 at 600
Bus1 repaired at 620
Bus2 repaired at 620
Bus3 repaired at 620
Bus4 repaired at 620
Breakdown Bus1 at 900
Breakdown Bus2 at 900
Breakdown Bus3 at 900
Breakdown Bus4 at 900
Bus1 repaired at 920
Bus2 repaired at 920
Bus3 repaired at 920
Bus4 repaired at 920
Bus has arrived at 1060
Bus has arrived at 1060
Bus has arrived at 1060
Bus has arrived at 1060
SimPy: No more events at time 1200https://stackoverflow.com/questions/10627531
复制相似问题