getDistanceTravelled()示例模型查询及叉车仿真数据提取问题咨询
叉车拣选仿真:行驶距离与拣选时间提取方案
一、修复getDistanceTravelled()未定义错误
getDistanceTravelled()是AnyLogic中Forklift代理的内置方法,不能直接在Main主体中调用,必须绑定具体的叉车实例:
- 若叉车是直接拖拽到Main画布的(比如命名为
forklift1),直接通过实例调用:forklift1.getDistanceTravelled() - 若叉车由流程模块生成,需提前将实例存入Main的集合变量(比如
Collection<Forklift> forklifts),再通过集合遍历获取实例调用方法
二、在Forklift代理内提取单次拣选任务数据
在Forklift代理内通过变量记录单次任务的距离与时间,步骤如下:
- 新增3个变量:
double currentTripDistance:存储单次拣选行驶距离double currentTripStartTime:记录单次任务开始时间double lastTripTotalDistance:记录上一次任务结束时的累计行驶距离
- 拣选任务启动时(比如
Move块的on enter事件)初始化变量:currentTripStartTime = time(); lastTripTotalDistance = getDistanceTravelled(); - 拣选任务完成时(比如最后一个
Move块的on exit事件)计算并传递数据到Main:currentTripDistance = getDistanceTravelled() - lastTripTotalDistance; double currentTripTime = time() - currentTripStartTime; // 调用Main的方法存储数据 main.saveSingleTripData(currentTripDistance, currentTripTime);
三、单次/千次运行的数据收集
单次运行
在Main中添加全局变量double totalPickTime、double totalTravelDistance,并在Main的on stop事件中写入:
totalPickTime = time(); totalTravelDistance = forklift1.getDistanceTravelled(); // 控制台输出 traceln("总拣选时间:" + totalPickTime + " 秒"); traceln("总行驶距离:" + totalTravelDistance + " 米");
1000次重复运行
借助AnyLogic的实验功能实现批量数据收集:
- 在Main中创建两个
Dataset类型变量:datasetPickTimes、datasetTravelDistances - 在Main的
on stop事件中,将当前运行数据写入数据集:datasetPickTimes.add(time()); datasetTravelDistances.add(forklift1.getDistanceTravelled()); - 创建
Monte Carlo实验,设置重复次数为1000,运行结束后可直接查看数据集统计,或导出为CSV:datasetPickTimes.writeCSV(new File("./pick_times.csv")); datasetTravelDistances.writeCSV(new File("./travel_distances.csv"));
四、注意事项
- 单次任务的行驶距离必须通过累计距离增量计算,避免直接使用
getDistanceTravelled()的累计值 - 确保所有调用
getDistanceTravelled()的代码都关联到正确的叉车实例 - 若需统计单任务的拣选时间而非总仿真时间,需在任务开始/结束节点单独记录时间戳
内容的提问来源于stack exchange,提问作者Alan Jaison
相关产品推荐
相关产品推荐

