做物流算法的人,基本都绕不过VRP这个老问题。但当每个客户点变成“必须在某个时间段内送到”时,问题就不再只是“怎么走最近”那么简单了。这就是VRPTW(带时间窗的车辆路径问题)。真实配送场景里,时间窗约束几乎无处不在:生鲜配送要赶在早高峰前送到,快递柜有最晚入柜时间,工厂产线物料必须卡在某个时段进场。谁能在这些约束下把路线排得又快又省,谁就是真正的降本增效。
这篇文章想分享的是:如何用蚁群优化算法(ACO)求解带时间窗的车辆配送问题,并给出完整的Matlab实现思路。我会先从问题本身讲起,再拆解ACO原理,然后落到代码结构、参数调优、常见坑点。不管你是运筹优化入门者、物流算法工程师,还是Matlab用户,只要想搞懂ACO-VRPTW的落地细节,这篇应该能让你少走不少弯路。
1. 带时间窗的车辆路径问题:不只是“最短路径”那么简单
1.1 从VRP到VRPTW:约束变多了,问题变难了
经典的VRP要回答的问题是:一组车辆从配送中心出发,服务所有客户点,每辆车有载重限制,目标是总行驶距离最短或总成本最低。这本身已经是NP难问题,但当每个客户点加上一个服务时间窗口后,问题复杂度会进一步飙升。时间窗通常分两类:硬时间窗和软时间窗。硬时间窗要求车辆必须在窗口内到达,早到要等待,晚到直接失败;软时间窗则允许违反窗口,但会产生惩罚成本。实际运营中,大多数企业用的是“硬时间窗+少量缓冲”的混合策略,因此算法必须具备处理严格时间约束的能力。
一个容易忽略的细节是:时间窗不只影响到达时刻,还会改变车辆路径的可行结构。比如两个客户点A和B,从距离上看A→B远比B→A顺路,但如果A的时间窗已经过了,车辆必须先绕过A等待下一窗口,这时B→A反而成了唯一可行解。这类“非线性”的约束连锁反应,正是VRPTW比VRP难解的本质原因。所以,写ACO代码时,绝对不能只把时间窗当成路径代价的一个惩罚项,必须在构造路径的过程中实时检查可行性。
1.2 数学模型:目标函数与四大约束
我把VRPTW的数学模型整理成下面这个标准形式,方便后续代码对照。假设有n个客户点,编号1到n,配送中心编号为0和n+1(同一个物理位置),车辆集合K,每辆车载重Q,客户i的需求量为q_i,服务时间为s_i,时间窗为[e_i, l_i],i到j的行驶时间为t_ij。决策变量x_ijk表示车辆k是否从i驶向j,还需要辅助变量a_ik表示车辆k到达i的时刻,以及w_ik表示在i的等待时间。
目标函数通常取总行驶距离最小,也可以扩展为“行驶距离 + 车辆使用数 × 大权重”,因为减少一辆车的固定成本往往比省几十公里油钱更重要。在蚁群算法里,这个目标函数最终会映射为信息素和启发式信息的引导方向。
约束条件可以归纳为四组:
- 流平衡约束:每个客户点必须有且仅有一辆车进入和离开,保证所有客户被服务且不被拆分;
- 载重约束:每辆车路径上累计需求不超过车辆载重Q;
- 时间窗约束:车辆到达i的时刻a_i必须在[e_i, l_i]范围内,早到则需要等待,即a_i = max(前序到达时刻+前序服务时间+行驶时间, e_i),且不能超过l_i;
- 车辆起终点约束:车辆从配送中心出发,最终返回配送中心,形成闭合或开放路线(常见为闭合路线)。
这些约束里面,时间窗约束是最容易在代码中产生隐蔽bug的地方。尤其是“等待时间”是否计入后续到达时间,以及服务时间要不要加在到达判断之前,不同文献处理方式不一样。我在实现时统一采用“到达后先等待到窗口最早时间,再开始服务,服务结束后再出发”的策略,这点在后续代码里会体现。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 为什么选蚁群算法:正反馈机制天然适合组合优化
2.1 蚁群算法核心要素:信息素、启发式信息、状态转移
蚁群算法模拟的是蚂蚁觅食时通过释放信息素来交流的行为。应用到VRPTW时,每只蚂蚁负责构造一组完整车辆路径,路径质量越好,路径上释放的信息素就越多,后续蚂蚁越倾向于选择信息素浓度高的边,于是形成正反馈。这个过程天然适配路径搜索类问题,因为它不需要问题具有连续的梯度信息,只需要能评价一条路径的优劣。
实现时有三个核心要素:
第一是信息素浓度τ_ij,表示边(i,j)被历史蚂蚁选择时留下的“痕迹”。初始化时可以给所有边一个相同小值,比如τ0 = 1 / (n * Lnn),其中Lnn是最近邻启发式得到的路径长度。这个初始化方法比随便给个1效果更稳。
第二是启发式信息η_ij,通常取1 / (t_ij + 某个时间窗紧迫度惩罚项)。经典ACO只用距离,但在VRPTW里,我更建议把时
