火车寻路机制
Jump to navigation
Jump to search
在火车驶向目的地(例如车站)之前,它会根据铁路系统当时的运行情况计算出距离最近的行驶路线。
寻路算法惩罚
火车的寻路过程使用了简单的A*算法[1]:路径搜索器会首先构建一个与时刻表中车站名称匹配的非禁用车站列表,然后同时从火车的两端向外进行搜索,如果可能,会在路段中进行路线搜索。路段是指铁路中一段不间断的路径,不包含交叉路口、车站或铁路信号(这些都是铁路分段的标志)。在寻路算法中,权重(即距离)按以下加权规则进行计算:
- 区间或路段的基础权重是其长度(沿铁轨中心的网格长度)。
- 区间被火车占用时:惩罚
(区间长度 ÷ 路线起点到该区间起点间的区间数)× 2
格,因此远离该区间的路线受到的影响不大。 - 区间被受信号网络控制的铁路信号标记为禁入(即信号亮红灯)时:惩罚1000格。
- 路线经过车站时:惩罚2000格。
- 区间内有停靠在车站的火车时:惩罚500格。
- 区间内有停靠在车站的火车,且该火车的时刻表中没有其它可停靠车站时:惩罚1000格。
- 区间内有手动停车的火车,且车上有乘客时:惩罚2000格。
- 区间内有手动停车的火车,且车上没有乘客时:惩罚7000格。
- 区间内有未设置时刻表且自动驾驶的火车时:惩罚7000格。
- 区间内有正在进站的火车时:惩罚100格。
- 区间内有正在接近铁路信号的火车时:惩罚100格。
- 区间内有正在信号前等待的火车时:每等待1刻惩罚(100 + 0.1)格。
- 区间内有找不到路径的火车时:惩罚1000格。
火车会尽量选择最短路线行驶,路线的最终距离(经过算法加权后)越长,火车选择它的优先度就越低。
路径验证
火车的路径将会在任何使其无效的事件发生时重新进行验证。一旦发现路径无效,游戏就会重新规划火车路线。路径验证过程只会确认当前路径是否仍然有效,并不会计算其距离是否是最短的。
以下事件会导致路径重新进行验证:
- 一段铁路被摧毁,此时所有火车都会重新进行路径验证。
- 一段铁路被创建,并使铁路信号失效,此时所有火车都会重新进行路径验证。
- 铁路信号(常规或联锁)被创建或摧毁,此时所有火车都会重新进行路径验证。
- 铁路区间发生改变,并使铁路信号(常规或联锁)失效,此时所有火车都会重新进行路径验证。
- LuaTrain::recalculate_path()参数被脚本调用,应用于火车上。
- 列车时刻表更改。
- 火车制动力发生变化,无论火车在正常行驶中或是到达了铁路信号/车站。
- 火车在联锁信号处等待了5秒的整数倍时间
重置事件
重置事件会导致火车重新应用寻路工具计算路径,并在必要时改道。以下列出了可能导致路径重置的事件,当这些事件之一发生时,游戏会重新计算从火车当前位置到任何与列车时刻表中目的地名称匹配的车站的可能路径,并选择结果最短的路径继续行驶。
由玩家操作/脚本生成的事件
- 列车中的一部分机车转向。
- LuaTrain::recalculate_path(true)参数被脚本调用,应用于火车上。
- 火车从手动驾驶模式切换到自动驾驶模式。
- 使用火车界面中的“前往车站”按钮直接命令火车驶向指定的车站。
- 从列车时刻表中删除途经站(未设置发车条件的车站)。
正常行驶过程中的重置事件
- 路径验证失败的火车。
- 火车即将停靠的车站被重命名或摧毁。
- 火车在状态即将变为可通行的铁路信号处等待。
- 火车在亮红灯的信号前刹车。
- 火车进入新区间,且无法接收下一个所需信号的状态。
- 火车在联锁信号处等待了5秒的整数倍时间,且有多个同名的目的地车站。
- 火车在联锁信号处等待了30秒的整数倍时间,且仅有一个目的地车站。
- 火车从当前停靠的铁路信号处出发。
- 火车从车站出发。
- 火车正驶向一座被禁用的车站。
目的地满/找不到路径
- 创建新铁路。
- 列车时刻表中的车站被创建、启用或重命名。
- 列车时刻表中的车站根据限制条件从“满”状态变为“未满”状态。
- 火车无法到达的车站被停用或摧毁。
其它事件
- 火车与其它物体(如玩家)相撞,但火车之间相撞不在此例。
更新历史
- 0.18.1:
- 位于路段起点的车站不再计入路径惩罚(未在更新文档中记录)。
- 0.17.38:
- 当火车在一系列联锁信号区间中进行寻路时,路径搜索器会受到限制,在离开联锁信号控制的区间前无法通过被预留的区间。这解决了在使用临时车站或车站被信号网络启用/禁用导致路径更改时,即便使用了正确的联锁信号,火车在会车时仍可能发生死锁的问题。这也允许火车在一系列联锁信号区间中自动重新计算路径,因为现在它不会违反任何规则。
- 0.16.42:
- 为找不到路径的火车增加1000格惩罚。
- 0.16.0:
- 寻路惩罚数值可以在实用常数中找到,并允许模组进行更改(未在更新文档中记录)。
- 0.15.0:
- 为车站增加2000格的寻路惩罚,因此火车在寻路时会尽量避开无关的车站。
- 0.11.17:
- 手动停车火车的路径惩罚从200格增加到1000格。
- 0.11.13:
- 为手动停车的火车所在的区间增加200格的额外惩罚
- 0.11.11:
- 为寻路算法引入惩罚机制。对于在车站停靠的火车,停靠时间越长,惩罚越高。