经过上一篇无形忍者-禁忌搜索算法求解带时间窗的车辆路径规划问题详解(附python代码)的介绍,我们对带时间窗的车辆路径问题(VRPTW问题)已经有了一定的了解。另外经过这一篇无形忍者-OR-Tools-VRPTW带时间窗的车辆路径问题 的介绍我们对ortools求解器也有了一定的了解,这篇文章是使用ortools的自带库来解决VRPTW问题的。
但是实际工作中遇到的VRPTW问题更复杂,比如约束更多,或者是多目标的。这时候使用ortools中解决车辆路线的自带库会有一定的局限性。所以,本次我们尝试用ortools中的CP-SAT求解器来自行建模求解。接下来,我们先复习一下之前的介绍。
1.什么是VRPTW?
VRPTW(Vehicle Routing Problem with Time Windows,带时间窗的车辆路径问题)是一种经典的组合优化问题,是基于VRP(Vehicle Routing Problem,车辆路径问题)的扩展。在VRPTW中,除了考虑车辆如何有效地访问一组客户点以最小化总行驶成本外,还必须满足每个客户点的时间窗约束。
在VRPTW中,问题的目标是找到一组车辆的最佳路径,以便在满足以下条件的情况下最小化总成本:
①每辆车必须从仓库出发,最终返回仓库;
②每个客户只被1辆车服务;
③每辆车的载重不超过总容量Q;
④每辆车的总时间不超过Dk;
⑤车辆需要在时间窗 内服务客户i,并且需要在
时间窗内返回仓库点
因此,VRPTW需要考虑更多约束条件和限制,使得问题更具挑战性。
2.VRPTW问题建模
2.1问题背景
VRPTW 问题是不仅考虑CVRP的所有约束,还需要考虑时间窗约束,也就是每个顾客对应一个时间窗 ,其中 和
和
分别代表该点的最早到达时间和最晚到达时间。通过下面介绍的参数说明和决策变量,结合参考文献(Desaulniers et al.,2006),我们将给出VRPTW 问题的标准模型
2.2参数说明
2.3决策变量
2.4目标函数
2.5约束条件
-
约束1~4分别约束如下:每个客户只被1辆车服务;每辆车必须从仓库出发;经过一个点就离开那个点;车辆最终返回仓库,其中点n+1是仓库点的一个备份,是为了方便实现。
-
约束5为车辆的容量约束
-
约束6~7是时间窗约束,分别约束如下:车辆到达每个顾客点的时间均在时间窗内;
3.部分python代码
# -*- coding: utf-8 -*-#
# 作者: 无形忍者
# 时间: 2024/3/18 13:14
# 描述: Python调用ortools求解VRPTW数学模型
import math
import re
import time
import matplotlib.pyplot as plt
from ortools.sat.python import cp_model
class InputData:
customer_num = 0
node_num = 0
vehicle_num = 0
capacity = 0
cor_x = []
cor_y