Ortools VRP仍然受到燃料限制

ortools vrp remained fuel constraint

提问人:MJ Jung 提问时间:11/15/2023 更新时间:11/15/2023 访问量:16

问:

我正在研究一个VRP(车辆配送问题),它涉及以下复杂性:

  1. 在任意节点处开始和结束(节点 0 表示成本矩阵的第一行和第一列)。
  2. 提供多个充电站(充电站跨节点复制)。
  3. 车辆有不同的速度。

我的主要挑战是确保当车辆完成访问节点时,其剩余燃料(或可用运行时间)足以到达最近的充电站。我目前正在使用 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

考虑到不同的车速,谁能就如何有效地实施这一约束提供见解或建议?对相关资源的任何建议或指导将不胜感激。

谢谢!

分配 或工具 车辆路线

评论


答: 暂无答案