路线编译上下文模型
1. 概述
路线编译上下文将可行路线编译为受限主问题(RMP),拥有路线使用变量、人工覆盖变量、客户覆盖行、车队数量行和分阶段目标。
1. 依赖上下文
VRP 上下文提供客户、车型和成本语义;路线生成上下文提供可行路线列。应用层控制分支节点、列生成迭代及阶段切换。
2. 概念 / 实体
1. 客户与车型
2. 路线列
3. 分支节点与阶段
分支节点
3. 变量
1. 决策变量
2. 辅助变量
3. Kotlin/Rust 注册形式
Kotlin 用 UIntVariable1 注册路线变量,列生成求解器通过 linearRelax() 显式转成连续松弛;人工覆盖使用 URealVariable1。Rust 的路线与人工覆盖变量直接以
覆盖等式与非负性会推出
4. 谓词
5. 集合
以下公式均针对固定的
6. 中间值
1. 客户覆盖量
描述:客户覆盖是路线使用量按覆盖系数加权的和。
2. 车队使用量
描述:每条路线消耗一辆相应车型的车。
3. 路线总成本
7. 断言
每条列必须先通过路线可行性检查并满足当前分支规则:
每条可用路线指定一个车型且不重复访问客户:
8. 约束
1. 客户覆盖(Customer Coverage)
描述:每个客户必须被路线或第一阶段人工量恰好覆盖一次。
2. 车队数量(Fleet Limit)
描述:选中路线消耗的车辆数不能超过可用数量。
3. 第二阶段人工量固定(Phase-II Artificial Fixing)
描述:进入成本优化阶段后,不再允许用人工量替代真实服务。
推论:此时覆盖行化为
9. 目标函数(如适用)
1. 第一阶段
描述:最小化未由真实路线覆盖的人工量。
2. 第二阶段
描述:固定全部人工量为零后,最小化真实路线成本。
这是两个阶段,不是用未定义的大常数
10. 算法引用
| 算法 | 引用位置 | 说明 |
|---|---|---|
| 受限主问题求解 | 第 3、8、9 节 | 求解节点 LP 并提取客户和车队行对偶价格 |
| 列插入 | 第 5、6 节 | 更新变量池及覆盖、车队和目标系数 |
| 两阶段切换 | 第 8、9 节 | 在人工覆盖消除后固定人工量并切换目标 |
| 分支定价 | 应用层 | 处理分数解、节点界与整数可行方案 |
Kotlin 路线编译源码;Kotlin/Rust 示例入口。
11. 通用语言
| 术语 | 符号 | 定义 |
|---|---|---|
| 路线使用量 | 路线列在主问题中的取值 | |
| 人工覆盖 | 第一阶段临时补足的客户覆盖 | |
| 覆盖量 | 真实路线对客户的覆盖 | |
| 车队使用量 | 指定车型被使用的车辆数 | |
| 受限主问题 | 只包含当前节点已有路线列的主问题 |
12. 设计决策
| 决策 | 备选方案 | 原因 |
|---|---|---|
| 明确 LP 与整数方案的变量域 | 在所有阶段声明整数变量 | 对偶定价需要节点 LP |
| 分阶段处理人工覆盖与成本 | 使用未定义的大常数混合目标 | 明确可行性恢复和成本优化的不同职责 |
| 按分支节点过滤路线池 | 所有节点共享未经筛选的列 | 保证分支规则贯穿主问题与定价 |
13. 变更记录
| 版本 | 变更 | 原因 |
|---|---|---|
| 1.1 | 对齐双语变量域、覆盖行及两阶段目标 | 消除旧子页与整体模型之间的矛盾 |