我正在研究用无人机解决车辆路径问题(VRP)。每架无人机都有电池限制,这意味着它可能没有足够的电池来一次完成所有的取货和送货任务。为了解决这个问题,我想实施一个约束,如果无人机由于电池限制而无法继续执行下一个任务,则必须返回仓库充电。在充电站充电一定时间后,它应该继续完成任务。
如何使用 Google OR-Tools 在 VRP 中实现这种约束?任何指导或代码示例将不胜感激。
我在数据模型中创建了一个“battery_usage”矩阵来表示每个位置之间消耗的电池量。我还实施了一项限制,以在完成取货和送货后检查剩余电池。如果剩余电量低于某个阈值(max_battery),则要求无人机返回基地充电,而不是继续执行下一个任务。
但是我遇到的问题是,当无人机返回基地时,充电后并没有继续执行下一个任务。我不确定如何实现逻辑,让无人机在仓库充电后恢复其任务。
使用 Battery_usage 矩阵来捕获节点之间的电池消耗,包括仓库和交付位置。
定义每架无人机的最大电池容量(max_battery)。
引入代表充电站充电站的虚拟节点。这些虚拟节点允许无人机充电,然后恢复其路线。
修改成本和约束以考虑电池电量:
当无人机到达虚拟节点时,其电池重置为 max_battery
.创建一个维度来跟踪电池使用情况:
路由.AddDimensionWithVehicleCapacity( 电池消耗回调, slack_capacity, # 可选的松弛 max_battery, # 最大电池容量 True, # 从 0 开始累积电量 ‘电池’
.使用回调来计算节点之间的电池消耗。
.添加约束以在每次交付后检查电池电量: def Battery_constraint(管理器,路由,battery_dim): 对于范围内的车辆 ID(车辆数): 索引 = 路由.Start(vehicle_id) 而不是routing.IsEnd(index): Battery_var = 路由.CumulVar(index, Battery_dim) next_index = 路由.NextVar(索引) 路由.solver().Add( Battery_var >= Battery_conspiration_callback(index, next_index) ) 如果电池_var < min_battery: # Threshold for recharging routing.solver().Add(next_index == depot_index) index = next_index
5.充电后恢复任务
.确保无人机在访问仓库后继续其路线: .使用交货地点的顺序来定义优先约束。 .使用OR-Tools中的nextvar方法来保持连续性
routing.solver().Add(routing.NextVar(depot_revisit) == next_delivery_node)