如何确定 AnyLogic 中火车代理的移动方向?

问题描述 投票:0回答:1

我正在使用铁路库,并动态地提供要移动到的火车轨道。由于我事先不知道我的火车将前往何处,因此我需要动态地决定它是向前还是向后移动。为了测试其他算法和系统的目的,我使用了基于预定义路线(轨道列表)的硬编码布尔值列表。

我知道火车代理可以返回其在轨道上的方向,但我如何使用该信息根据给定路线中的下一个轨道确定运动方向?我确实可以访问下一个铁路轨道对象。

请注意,在尝试计算下一个运动的方向时,火车是静态的。所以我不能使用任何处理目标偏移或运动方向的函数。

我确实查看了铁路轨道、道岔、火车和铁路网络的功能来寻找解决方案,但找不到。

我的另一个想法是以某种方式在 MoveTo 块周围有一个

try catch
块,这样我就可以捕获向错误方向移动的错误并尝试另一个方向。

anylogic
1个回答
0
投票

我用4条信息就解决了这个问题。我当前所在轨道的对象、我要移动到的下一个轨道的对象、火车相对于当前轨道的方向,以及了解给定开关处于轨道的哪一端。

我正在维护火车行驶的每个轨道对象的离散列表。这个列表是我获取当前和下一个跟踪对象的方式。

根据 AnyLogic Track 文档,您可以致电

track.getEndSwitch()
track.getStartSwitch()
。这两个函数返回它们各自的开关,如果没有,则返回 null。对于此解决方案,您只需要使用一个即可。

当我们查看switches的文档时。我们可以找到函数

railSwitch.stateExist(currentTrack, nextTrack)
。如果给定的
railSwitch
currentTrack
铁路轨道对象存在状态,则此函数将返回 true。因此,如果返回 true 并且
nextTrack
我们正在走向轨道的尽头。
最后,我们可以使用 

train

文档来查找 railSwitch == trackEndSwitch 函数。参数是 bool,告诉函数使用火车的前部或后部;这可能很重要,具体取决于火车的长度。如果火车方向相同,则返回 true。

现在我们可以利用两条信息来决定列车的运行方向。如果我们对火车的方向(与轨道相同为真)和正在移动的道岔(对于末端道岔为真)进行异或,它将为我们提供火车向前或向后移动的值。 False 表示向前移动,True 表示向后移动。

|方向|走向终点开关|运动方向 (x ^ y)

|走向赛道终点|是的 |错误

|走向赛道终点|没有 |正确

|走向轨道开始|是的 |正确

|走向轨道开始|没有 |错误

© www.soinside.com 2019 - 2024. All rights reserved.