交通模拟系统左侧车道首位无更新问题及代码修正咨询
小型交通模拟系统问题排查与修复
问题现象
运行时左侧车道(lane_1)首位始终无车辆更新,运行快照如下:
[.....], (G), [.....] [.....], (G), [...S.] [.....], (G), [..SS.] [.....], (G), [.SSS.] [...S.], (G), [.SSS.] [..SS.], (G), [.SSS.] [.SSS.], (G), [.SSW.] [.SSS.], (G), [.SWS.] [.SSS.], (G), [.WSS.] [.SSW.], (G), [.SSS.] [.SWS.], (G), [.SSW.] [.WSS.], (G), [.SWW.] [.SSS.], (G), [.WWS.] [.SSW.], (G), [.WSW.] [.SWW.], (G), [.SWS.] [.WWS.], (G), [.WSS.] [.WSW.], (G), [.SSS.] [.SWS.], (G), [.SSW.] [.WSS.], (G), [.SWS.] [.SSS.], (G), [.WSW.] Final state: [.SSW.], (G), [.SWW.]
预期效果
期望目的地为'S'的车辆能出现在左侧车道首位,预期运行效果如下:
[.....] (G) [.....] [] [.....] (G) [....S] [] [.....] (G) [...SS] [] [.....] (G) [..SSS] [] [.....] (G) [.SSSS] [] [.....] (G) [SSSSS] [] [....S] (G) [SSSSW] [] [...SS] (G) [SSSWS] [] [..SSS] (R) [SSWSS] [] [.SSS.] (R) [SSWSS] ['S'] [SSS..] (G) [SSWSS] ['S', 'W'] [SS..S] (G) [SWSSS] ['W', 'W'] [S..SS] (G) [WSSSW] ['W', 'S'] [..SSW] (G) [SSSWW] ['S', 'W'] [.SSWS] (G) [SSWWS] ['W', 'S'] [SSWSS] (G) [SWWSW] ['S', 'S'] [SWSSS] (G) [WWSWS] ['S', 'S'] [WSSSW] (G) [WSWSS] ['S', 'W'] [SSSWW] (R) [SWSSS] ['W', 'S'] [SSWW.] (R) [SWSSS] ['W', 'S', 'W'] [SWW..] (G) [SWSSS] ['W', 'S', 'W', 'W'] [WW..S] (G) [WSSSW] ['S', 'W', 'W', 'S'] [W..SW] (G) [SSSWS] ['W', 'W', 'S', 'W'] [..SWS] (G) [SSWSW] ['W', 'S', 'W', 'W'] [.SWSS] (G) [SWSWW] ['S', 'W', 'W'] [SWSSS] (G) [WSWWS] ['W', 'W', 'S'] [WSSSW] (G) [SWWSW] ['W', 'S'] [SSSWS] (G) [WWSWW] ['S'] [SSWSW] (R) [WSWWS] [] [SWSW.] (R) [WSWWS] [] [WSW..] (G) [WSWWS] ['W'] [SW..W] (G) [SWWSW] ['S'] [W..WS] (G) [WWSWS] [] [..WSW] (G) [WSWS.] []
Destinations类工作逻辑
该类负责生成固定序列的车辆目的地,逻辑如下:
- 初始化时定义了一个长度为100的元组
_arrivals,其中:0代表本次无车辆生成1代表生成目的地为'W'的车辆2代表生成目的地为'S'的车辆
_internal_time作为内部计数器,记录当前使用序列的索引位置step()方法每次执行时:- 获取当前
_internal_time对应的_arrivals元素值 - 将
_internal_time加1,超过序列长度时取模循环 - 根据元素值返回对应目的地:1返回
'W',2返回'S',0返回None
- 获取当前
修正TrafficSystem的step方法
原step方法逻辑混乱,未遵循指定流程,且存在调用is_green时未加括号的错误(self.light.is_green是方法引用,需改为self.light.is_green())。以下是遵循指定流程修正后的step方法:
修正后的TrafficSystem类
class TrafficSystem: """Defines a traffic system""" def __init__(self): self.time = 0 self.destinations = ds.Destinations() self.lane_1 = tc.Lane(5) self.lane_2 = tc.Lane(5) self.light = tc.Light(10, 8) def snapshot(self): print( f"{self.lane_1.__str__()}, {self.light.__str__()}, {self.lane_2.__str__()}") def step(self): # 1. 移除左侧车道的首位车辆 self.lane_1.remove_first() # 2. 调用左侧车道的step方法 self.lane_1.step() # 3. 若信号灯为绿色,将右侧车道的首位车辆移至左侧车道 if self.light.is_green(): first_vehicle = self.lane_2.remove_first() if first_vehicle is not None: self.lane_1.enter(first_vehicle) # 4. 调用信号灯的step方法 self.light.step() # 5. 调用右侧车道的step方法 self.lane_2.step() # 6. 调用Destinations的step方法,若返回目的地则创建车辆并加入右侧车道末尾 dest = self.destinations.step() if dest is not None: new_vehicle = tc.Vehicle(dest, self.time) self.lane_2.enter(new_vehicle) # 更新系统时间 self.time += 1 def in_system(self): pass def print_statistics(self): pass
修正说明
- 严格按照指定的6步流程执行,确保每一步顺序正确
- 修复了
is_green的调用错误,改为调用方法self.light.is_green() - 新增系统时间
self.time作为车辆的borntime,符合Vehicle类的初始化要求 - 处理右侧车道移车时的空值情况,避免将None加入左侧车道
内容的提问来源于stack exchange,提问作者user17079709
相关产品推荐
相关产品推荐

