如何在AnyLogic中通过GIS路径优化实现差异化配送频率配置
AnyLogic GIS路径优化实现差异化配送频率实操方案
原生AnyLogic GIS路径优化模块没有内置单点位多频次配送的直接配置项,车辆不按指定频率执行任务的核心原因是引擎默认将单个客户点位识别为单次配送任务,无法自动拆分多频次需求,按以下步骤配置即可实现差异化频率要求:
1. 任务层:按配送频率拆分虚拟配送点
不要直接将实体客户作为配送点输入优化引擎,先做点位转换:
- 为每个客户生成和日配送频次数量一致的虚拟配送点:客户A日配4次就生成4个关联A的虚拟点,客户B日配8次就生成8个关联B的虚拟点,所有虚拟点的GIS坐标、配送需求量、服务时长完全和对应实体客户一致。
- 给每个虚拟点绑定独立不重叠的配送时间窗:按24小时均分间隔设置即可,比如客户A的4个虚拟点时间窗设为
[0,6]、[6,12]、[12,18]、[18,24],客户B的8个虚拟点按3小时间隔拆分时间窗,从规则上避免引擎合并同客户的多次配送任务。 - 给每个虚拟点绑定
linkedCustomer参数,关联到对应的实体客户实例,方便后续逻辑判断。
2. 优化引擎参数配置
- 将所有生成的虚拟配送点作为输入集合传入GIS路径优化组件的
Delivery locations参数,不要传入原始实体客户点位。 - 打开组件的约束设置面板,勾选严格执行点位时间窗选项,将默认的时间窗偏移容忍度修改为0,禁止引擎为了压缩路径成本跨时间窗合并配送任务。
- 车辆资源配置中,取消单车单次任务的最大访问点位数限制,按排班设置车辆的可用时段:如果是单日全时段配送,将车辆最大工作时长设为1440分钟(24小时),避免因为运力上限导致点位被引擎自动舍弃。
3. 运行逻辑补全,规避路径显示和计算冲突
同个客户的多个虚拟点坐标完全一致,直接运行会出现同一位置反复触发停靠动画、路径计算冗余的问题,需要在车辆的点位到达回调函数中加判断逻辑,参考代码如下:
// 车辆到达配送点位触发逻辑 if (currentStop.linkedCustomer == lastServedCustomer && currentStop.getGISLocation().distance(lastServedCustomer.getGISLocation()) < 1) { // 同客户的连续配送点,跳过停靠动画直接执行配送 updateDeliveryRecord(currentStop.linkedCustomer, currentStop.demand); proceedToNextStop(); } else { // 不同客户点位,正常执行停靠、服务流程 triggerArrivalAnimation(); startServiceTimer(currentStop.serviceTime); updateDeliveryRecord(currentStop.linkedCustomer, currentStop.demand); lastServedCustomer = currentStop.linkedCustomer; }
- 每轮路径优化计算完成后,增加校验步骤:遍历所有实体客户,统计关联虚拟点被纳入配送路径的数量,如果数量小于客户要求的配送频次,就将未纳入的虚拟点优先级设为普通任务的10倍,强制下一轮优化优先排程,避免漏配。
高频问题排查
如果配置后还是出现配送频次不达标,优先检查以下配置项:
- 检查虚拟点时间窗是否存在重叠:时间窗重叠时引擎会默认将两个任务合并为一次配送,直接导致频次不足。
- 检查总运力是否足够:统计所有虚拟点的总服务时长+路径预估行驶时长,如果总时长超过所有车辆的总可用工作时长,引擎会自动舍弃部分低优先级任务,需要对应增加车辆或者调整配送批量。
- 检查是否开启了「同点位任务自动合并」的默认选项:部分版本的AnyLogic优化组件默认开启同坐标点位合并,需要手动在高级设置里关闭该选项。
内容的提问来源于stack exchange,提问作者Konrad
相关产品推荐
相关产品推荐

