提问人:MJ Jung 提问时间:11/15/2023 更新时间:11/15/2023 访问量:16
Ortools VRP仍然受到燃料限制
ortools vrp remained fuel constraint
问:
我正在研究一个VRP(车辆配送问题),它涉及以下复杂性:
- 在任意节点处开始和结束(节点 0 表示成本矩阵的第一行和第一列)。
- 提供多个充电站(充电站跨节点复制)。
- 车辆有不同的速度。
我的主要挑战是确保当车辆完成访问节点时,其剩余燃料(或可用运行时间)足以到达最近的充电站。我目前正在使用 a 来跟踪剩余的燃料。但是,我正在努力执行以下限制,即剩余燃料必须始终大于到达最近的充电站所需的燃料(或旅行时间)。fuel_dimension
每辆车的不同速度增加了这个问题的复杂性。 这是我当前实现的一个片段
fuel_callback_indices = []
for v_id in range(self.mission["n_vehicle"]):
def vehicle_fuel_callback(from_index, to_index, i=v_id):
from_node = manager.IndexToNode(from_index)
to_node = manager.IndexToNode(to_index)
transit_dist = (self.mission["distance_matrix"][from_node][to_node] / self.vehicle_vel[i] * self.scale)
return -int(transit_dist)
fuel_callback_index = routing.RegisterTransitCallback(vehicle_fuel_callback)
fuel_callback_indices.append(fuel_callback_index)
fuel_dimension_name = "fuel"
routing.AddDimensionWithVehicleTransitAndCapacity(
fuel_callback_indices,
int(np.max(self.vehicle_max_time) * self.scale),
(self.vehicle_max_time * self.scale).astype(int),
False,
fuel_dimension_name)
fuel_dimension = routing.GetDimensionOrDie(fuel_dimension_name)
for v in range(self.mission["n_vehicle"]):
fuel_dimension.SlackVar(routing.Start(v)).SetValue(0)
fuel_dimension.CumulVar(routing.Start(v)).SetValue(int(self.vehicle_initial_remained_time[v]*self.scale))
penalty = 0
for node in range(len(self.mission["distance_matrix"])):
if (node in self.mission["starts"]) or (node in self.mission["ends"]):
continue
elif node in self.mission["task"]:
index = manager.NodeToIndex(node)
fuel_dimension.SlackVar(index).SetValue(0)
routing.AddVariableMinimizedByFinalizer(fuel_dimension.CumulVar(index))
else:
index = manager.NodeToIndex(node)
routing.AddDisjunction([index], penalty)
solver = routing.solver()
for node in range(len(self.mission["distance_matrix"])):
if node in self.mission["charging_station"]:
index = manager.NodeToIndex(node)
if (index % self.vehicle_type_num) == 0:
solver.Add(fuel_dimension.CumulVar(index)+fuel_dimension.SlackVar(index) == int(self.vehicle_max_time[0]*self.scale))
elif (index % self.vehicle_type_num) == 1:
solver.Add(fuel_dimension.CumulVar(index)+fuel_dimension.SlackVar(index) == int(self.vehicle_max_time[1]*self.scale))
else:
raise NotImplementedError
考虑到不同的车速,谁能就如何有效地实施这一约束提供见解或建议?对相关资源的任何建议或指导将不胜感激。
谢谢!
答: 暂无答案
评论