AnyLogic中创建确定性顺序列车车厢的实现方法问询
用父类统一车厢类型实现确定性列车创建
完全可以通过创建一个父代理类来解决不同车厢类型的返回问题,具体操作步骤如下:
创建通用父车厢代理
新建一个代理类(比如命名为BaseRailCar),让你所有的车厢代理(OpenCar、BoxCar这类)都继承这个父类。在AnyLogic创建代理时,选择“继承自”选项,指定BaseRailCar作为父类即可。编写正确的
createUniform()函数
把函数的返回类型设置为BaseRailCar(或者直接用Agent,因为所有代理都默认继承Agent),这样就能返回任意子类车厢实例。举个实现例子:public List<BaseRailCar> createUniform(List<Class<? extends BaseRailCar>> carOrder, int totalCars) { List<BaseRailCar> trainCars = new ArrayList<>(); int typePos = 0; for(int i=0; i<totalCars; i++){ // 获取当前顺序对应的车厢类 Class<? extends BaseRailCar> carClass = carOrder.get(typePos); // 创建车厢实例(用AnyLogic内置的添加方法更稳妥) BaseRailCar newCar = add_railCarCollection(carClass); trainCars.add(newCar); // 循环切换车厢类型,按传入的顺序重复 typePos = (typePos + 1) % carOrder.size(); } return trainCars; }注:
add_railCarCollection是你在主代理中创建的车厢集合对应的添加方法,替换成你自己的集合名称即可;如果用newInstance()创建实例,需要处理实例化异常。解决类型转换报错
你之前遇到的cannot cast OpenCar to Agent其实是个误区——AnyLogic里所有代理类本身就继承自Agent,OpenCar本身就是Agent的子类,根本不需要强制转换。报错大概率是你写法有问题,比如错误地用了反向转换或者变量类型声明错误,用父类BaseRailCar或者直接用Agent作为变量类型就能避免这类问题。调用函数生成确定性列车
调用时传入你想要的固定车厢顺序和总长度,比如:// 定义固定顺序:敞车→棚车→罐车,循环重复 List<Class<? extends BaseRailCar>> fixedOrder = Arrays.asList(OpenCar.class, BoxCar.class, TankCar.class); List<BaseRailCar> finishedTrain = createUniform(fixedOrder, 12); // 将创建好的车厢逐一添加到列车中 for(BaseRailCar car : finishedTrain){ myTrain.addCar(car); // myTrain是你的列车代理实例 }
内容的提问来源于stack exchange,提问作者LukeDev
相关产品推荐
相关产品推荐

