说明:在通行机动车数量不多的道路路口通常不设置红绿灯,但会设置“Stop”标志,在有此标志的路口车辆必须先停车观察后通行,因此本文中主要想要仿真“Stop Sign”停车观察的功能。
本文由实习生Devon Cowling分享,他目前正在比勒陀利亚大学完成工业工程学位的最后一年项目,由Jaco-Ben Vosloo指导。在创建模型的过程中,他在使用AnyLogic道路交通库时遇到了因十字路口堵塞而导致的车辆失控拥堵(大规模交通堵塞)。我们希望这篇博文能为其他遇到类似问题的人提供一个潜在的解决方案。
作为比勒陀利亚大学工业工程专业的最后一年学生,我们的关键成果之一是展示我们工程技能的项目。我的项目涉及创建一个街区的交通仿真,以测试当街区入口关闭后或关闭时对拥堵的影响。
我模型中的道路网非常大且相当繁忙。白天大约有6000辆汽车进出该街区。由于道路网络的规模和复杂性,为道路网络的每个部分明确创建moveTo模块几乎是不可能的。相反,为保持模型逻辑尽可能简单,我们会尽可能少地使用moveTo模块。我的模型,通过一个模块会将智能体路由到分配给他们的目的地,还有一个模块在智能体完成区域内的所有活动后引导其离开该区域。通过这种设计,当入口被动态封锁时,我们不需要改变任何逻辑。然而,这一选择意味着汽车不会减速并在路口停车线停车,而是会继续保持速度行驶,直到到达目的地。到达路口激活让行函数在这里不再有用,因为向路口的所有方向添加的让行似乎会相互抵消。
下面是逻辑的简化版本,显示所有汽车不管它们从哪里出发都经过完全相同的逻辑块。
下面是所要模拟交通流的街区的图片。
我发现,moveTo模块和繁忙道路的结合意味着繁忙的交通方向控制,因为车辆不会停车,进而导致其他方向的车辆无法进入交叉口。这与实际是不符的,因为我所仿真街区的路口是有停车标志的。
我需要一些控制十字路口的方法,最好是可以直接模拟一个停车标志。但目前软件的道路交通库没有专门的停车标志功能。为此,我做了一个变通办法,在短时间内(大约5秒)使用交通灯,允许在每次相位变化时发送一辆车。
不幸的是,如果路网像我的一样繁忙,标准交通灯就会变得低效。这是因为车辆对路口之后道路上发生的情况一无所知。在标准交通条件下,无论前方道路是否被其他车辆阻挡,当绿灯变绿时,轻型汽车都会尝试向前行驶。这种行为会再次导致十字路口堵塞,并在绿灯变绿时阻止汽车行驶。
就在我失去希望的时候,我从Benjamin Schumann那里得到了非常有用的建议,在此表示非常感激。
他建议我可以通过代码在绿灯亮之前,检查十字路口上游有多少辆车。由此智能交通灯 “诞生”。下面我介绍一下具体的操作。
首先,需要手动创建路口的“红绿灯”,通过使用事件实现路口停车线相位(phase)的变更。
这对于创建智能交通灯是必要的,在减少模型使用的模块数时,也会有所帮助。图3中的交通灯可以用下面的事件重新创建,两者的作用相同。
下一步是添加一些代码,如果前面道路拥堵,这些代码将阻止汽车向前进入十字路口。道路拥堵情况,可以通过使用if语句来检查前方道路上有多少辆车,如果道路已满,则保持红灯。if语句如下所示:
下面是智能交通灯的代码。它检查road3公路上的汽车数量,如果超过3辆,通往road3的所有车灯都将变红,但允许车辆离开road3。
if (trafficLightCounter % 4 == 0) { if(road3.nCars(true) > 3 ) { stopLine.setSignal(SIGNAL_RED); stopLine1.setSignal(SIGNAL_RED); stopLine2.setSignal(SIGNAL_RED); stopLine3.setSignal(SIGNAL_GREEN); } else { stopLine.setSignal(SIGNAL_GREEN); stopLine1.setSignal(SIGNAL_RED); stopLine2.setSignal(SIGNAL_RED); stopLine3.setSignal(SIGNAL_RED); } trafficLightCounter = 0; } else if (trafficLightCounter % 4 == 1) { if(road3.nCars(true) > 3 ) { stopLine.setSignal(SIGNAL_RED); stopLine1.setSignal(SIGNAL_RED); stopLine2.setSignal(SIGNAL_RED); stopLine3.setSignal(SIGNAL_GREEN); } else { stopLine.setSignal(SIGNAL_RED); stopLine1.setSignal(SIGNAL_GREEN); stopLine2.setSignal(SIGNAL_RED); stopLine3.setSignal(SIGNAL_RED); } else if (trafficLightCounter % 4 == 2) if(road3.nCars(true) > 3 ) { stopLine.setSignal(SIGNAL_RED); stopLine1.setSignal(SIGNAL_RED); stopLine2.setSignal(SIGNAL_RED); stopLine3.setSignal(SIGNAL_GREEN); } else { stopLine.setSignal(SIGNAL_RED); stopLine1.setSignal(SIGNAL_RED); stopLine2.setSignal(SIGNAL_GREEN); stopLine3.setSignal(SIGNAL_RED); } } else if (trafficLightCounter % 4 == 3) { if(road3.nCars(true) > 3 ) { stopLine.setSignal(SIGNAL_RED); stopLine1.setSignal(SIGNAL_RED); stopLine2.setSignal(SIGNAL_RED); stopLine3.setSignal(SIGNAL_GREEN); } else { stopLine.setSignal(SIGNAL_RED); stopLine1.setSignal(SIGNAL_RED); stopLine2.setSignal(SIGNAL_RED); stopLine3.setSignal(SIGNAL_GREEN); } } trafficLightCounter++; |
---|
智能交通灯的每个相位(phase)都可以检查与上述相同或不同的情况,具体取决于汽车行驶的方向。
智能灯使十字路口保持开放状态,使相反方向的汽车可以自由行驶。
这种方法需要一些修补才能正确设置,但会显著改善AnyLogic交通模拟中车辆的移动。因此,下次您需要在AnyLogic中使用交通灯时,可以尝试让它变智能:)
请随意使用上面的代码创建您自己的智能交通灯,或者您可以下载示例模型或在AnyLogic云上运行示例模型。
Devon Cowling