干货 | 10分钟教你用column generation求解vehicle routing problems

本文通过一个实例详述了如何用column generation方法解决车辆路径问题(VRPTW),包括模型建立、列生成(Master Problem、Restricted Master Problem、Subproblem)、迭代过程,并指出在特定情况下,线性松弛的解可能是整数最优解。

OUTLINE

  • 前言
  • VRPTW description
  • column generation
  • Illustration
  • code
  • reference

00 前言

此前向大家介绍了列生成算法的详细过程,以及下料问题的代码。相信各位小伙伴对column generation已经有了一个透彻的了解了。今天我们在来一点干货,用column generation求解vehicle routing problems。

01 VRPTW description

关于VRPTW问题的描述,以及建模方式,可以参照此文干货|十分钟快速掌握CPLEX求解VRPTW数学模型(附JAVA代码及CPLEX安装流程)。不过今天给大家带来的是VRPTW的另外一个建模方式,它是在传统的模型上利用了Dantzig-Wolfe decomposition分解算法得到的。

关于Dantzig-Wolfe decomposition分解算法,可以参照文章:

Formulation:[1]

  • $\Omega $ :the set of feasible vehicle routes, i.e., the set of paths in G issued from the
    depot, going to the depot, satisfying capacity and time window constraints and visiting
    at most once each customer.
  • \(c_k\) :the cost of route \(r_k \in \Omega\).
  • $ a_{ik}$ := 1 if route\(r_k\)visits customer\(v_i\) and
### 使用 Set Covering 模型求解 VRP 车辆路径问题 #### 定义与背景 车辆路径问题(Vehicle Routing Problem, VRP)是一类经典的组合优化问题,其中 Capacitated Vehicle Routing Problem (CVRP) 是最基础的形式之一[^3]。基于集覆盖(Set Covering, SC)的模型是一种常用的数学规划方法来描述和求解 CVRP 问题。 在 Set Covering 模型中,目标是从一组候选路径中选出若干条路径,使得这些路径能够完全覆盖所有的客户节点需求,并使总运输成本最小化。该模型的核心思想是将每一条可能的路径视为一个决策变量 \( x_i \),如果选择了某条路径,则对应的变量取值为 1;否则为 0。 #### 数学表达形式 以下是基于 Set Covering 的 VRP 模型的一般表示: \[ \text{Minimize } Z = \sum_{i=1}^{m} c_i x_i \] 约束条件如下: \[ \sum_{i: j \in S_i} x_i \geq 1, \quad \forall j \in N, \] \[ x_i \in \{0, 1\}, \quad i = 1, ..., m. \] 上述公式中的参数定义如下: - \( m \): 所有可能路径的数量; - \( c_i \): 第 \( i \) 条路径的成本; - \( S_i \): 对应于第 \( i \) 条路径所服务的客户集合; - \( N \): 所有客户的集合; - \( x_i \): 是否选择第 \( i \) 条路径作为解决方案的一部分。 此模型由 Balinski 和 Quandt 最初提出并应用于 VRP 中[^1]。 然而,当涉及实际应用时,由于候选路径集合 \( \Omega \) 可能非常庞大甚至无法枚举,因此直接求解完整的 Set Covering 模型变得不可行。针对这一挑战,通常采用列生成技术来进行逐步逼近最优解的方法[^4]。 #### 列生成过程详解 列生成算法的主要流程可以分为以下几个方面的工作内容: 1. **初始化阶段**: 构造初始主问题(Master Problem),仅包含少量预选路径或者随机选取的一些基本路径。 2. **主问题求解**: 应用线性规划工具对当前简化版主问题进行计算得到松弛后的最优解向量以及相应影子价格信息。 3. **子问题构建与求解**: 设计脉冲算法(Pulse Algorithm)[^2]或其他启发式/精确方法寻找具有负约减费用的新潜在有效路径加入到现有路径池当中形成扩展版本的主问题重新执行步骤二直至不再发现任何满足条件的新列为止。 最终完成整个迭代循环从而获得全局近似最佳方案。 ```python def solve_vrp_with_set_covering(customers, depot, capacity): from pulp import LpProblem, lpSum, LpVariable, value prob = LpProblem("VRP_Set_Covering", sense=LpMinimize) # Generate all feasible routes using some heuristic or exact method routes = generate_all_feasible_routes(customers, depot, capacity) route_vars = {route: LpVariable(f"x_{routes.index(route)}", cat='Binary') for route in routes} objective_function = lpSum([cost_of_route(r) * var for r, var in route_vars.items()]) prob += objective_function for customer in customers: covering_constraint = sum(var for r, var in route_vars.items() if customer in r.customers_served()) >= 1 prob.addConstraint(covering_constraint) status = prob.solve() selected_routes = [r for r, v in route_vars.items() if value(v) == 1] return selected_routes ``` 以上代码片段展示了如何利用 Python PuLP 库实现简单的 Set Covering 建模框架。 ---
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值