AnyLogic铁路库列车解耦时,如何将原列车自定义变量同步至新列车?
我刚好踩过这个坑,Rail Library默认的Train Decouple组件只会处理列车的内置属性(比如长度、重量、速度这些),咱们自己加的自定义变量确实不会自动复制到分离出来的新列车上。下面是亲测有效的解决步骤:
具体实现步骤
1. 确认自定义Train Agent的变量定义
先确保你的自定义Train Agent类(比如我自己命名的MyCustomTrain)里已经添加了需要保留的变量,比如trainNumber(列车编号)、assignedRoute这类自定义字段。
2. 在Train Decouple组件的事件中手动复制变量
找到你的Train Decouple组件,双击打开属性面板,定位到On decouple事件(列车完成解耦操作后触发的钩子),在这里写代码把原列车的自定义变量同步给分离出去的新列车:
方式一:逐个赋值(适合少量变量)
因为默认train(原列车)和decoupledTrain(分离出的新列车)的类型是Rail Library自带的Train类,所以得先强制转换成咱们的自定义Train类,再赋值:
// 强制转换为自定义Train类型 MyCustomTrain originalTrain = (MyCustomTrain) train; MyCustomTrain newSplitTrain = (MyCustomTrain) decoupledTrain; // 复制自定义变量 newSplitTrain.trainNumber = originalTrain.trainNumber; newSplitTrain.assignedRoute = originalTrain.assignedRoute; // 其他需要复制的变量依次添加即可
方式二:封装复制方法(适合多变量场景)
如果自定义变量比较多,建议在MyCustomTrain类里写个专门的复制方法,代码更整洁也方便后续维护:
在MyCustomTrain的代码区域添加:
public void copyCustomProps(MyCustomTrain sourceTrain) { this.trainNumber = sourceTrain.trainNumber; this.assignedRoute = sourceTrain.assignedRoute; this.passengerLoad = sourceTrain.passengerLoad; // 所有需要同步的自定义变量都在这里处理 }
然后在Train Decouple的On decouple事件里调用这个方法:
((MyCustomTrain)decoupledTrain).copyCustomProps((MyCustomTrain)train);
3. 验证效果
运行模型,等列车完成解耦后,分别查看剩余列车和分离出的新列车的自定义变量,应该都能保留原列车的数值了。
为什么会出现这个问题?
Rail Library的Train Decouple组件默认逻辑是基于内置Train类的属性来生成分离后的列车对象,它不知道咱们自己加的自定义变量,所以不会自动处理这些属性的复制,必须手动干预才行。
内容的提问来源于stack exchange,提问作者Mohammad Hasan N.

