31 KiB
Task 3: 双站点同车访问的随机优化方案
摘要
本文针对"同一辆卡车在单次行程中访问两个站点"的调度优化问题,提出一套基于随机优化的完整解决方案。核心创新点:
- 问题本质识别:将第一站点分配决策建模为两阶段随机优化问题,正确处理"第二站点需求不确定"的核心难点
- 共生站点配对模型:综合考虑距离、容量、波动性三维约束,构建配对价值函数
- 解析最优分配策略:推导出闭式解
q^* = \frac{\sigma_j \mu_i + \sigma_i (Q - \mu_j)}{\sigma_i + \sigma_j} - 风险可控的全局调度:在提升效率的同时,将服务缺口风险控制在可接受范围
实际运行结果:
- 总服务量提升 16.9%(140,121 → 163,777)
- 质量加权服务量提升 5.3%(131,673 → 138,699)
- 资源节省 19.5%(142次双站点访问)
- 服务缺口风险 17.1%(可控范围)
完整流程图
Mermaid版本(GitHub可渲染)
flowchart TB
subgraph INPUT["数据输入"]
A[Task 1 结果<br/>70站点 + 730次分配<br/>task1/03_allocate.xlsx]
end
subgraph TASK3["TASK 3: 双站点同车优化"]
direction TB
subgraph CORE["核心流程 ✅ 已完成"]
subgraph PAIRING["阶段1: 配对选择"]
B1[01_distance.py<br/>距离矩阵计算]
B2[02_pairing.py<br/>可行性筛选+贪心选择]
B1 --> B2
end
subgraph ALLOCATION["阶段2: 分配优化"]
C1[03_allocation.py<br/>最优分配q*计算]
end
subgraph SCHEDULING["阶段3: 全局调度"]
D1[04_reschedule.py<br/>访问次数重分配]
D2[05_calendar.py<br/>日历排程生成]
D1 --> D2
end
subgraph EVALUATION["阶段4: 效果评估"]
E1[06_evaluate.py<br/>E1',E2',F1',F2',R1,RS]
end
B2 --> C1 --> D1
D2 --> E1
end
subgraph VALIDATE["结果验证 ✅ 已完成"]
V1[约束满足检验<br/>每日2事件、总730次]
V2[与Task 1对比<br/>指标改进验证]
V3[分配合理性<br/>q*边界检查]
end
subgraph SENSITIVITY["敏感性分析 ✅ 已完成"]
S1[07_sensitivity.py<br/>4参数扫描]
S2[合并比例: 1/3,1/2,2/3]
S3[距离阈值: 30-70mi]
S4[容量上限: 400-500]
S5[CV阈值: 0.3-0.6]
S1 --> S2
S1 --> S3
S1 --> S4
S1 --> S5
end
subgraph VISUAL["可视化 ⏳ 待实现"]
P1[Fig.1 站点配对地图]
P2[Fig.2 分配策略散点图]
P3[Fig.3 敏感性曲线]
P4[Fig.4 日历热力图]
P5[Fig.5 风险分布图]
end
CORE --> VALIDATE
CORE --> SENSITIVITY
VALIDATE --> VISUAL
SENSITIVITY --> VISUAL
end
subgraph OUTPUT["输出文件"]
F1[01_distance.xlsx<br/>距离矩阵]
F2[02_pairing.xlsx<br/>34对配对]
F3[03_allocation.xlsx<br/>最优分配]
F4[04_reschedule.xlsx<br/>访问次数]
F5[05_calendar.xlsx<br/>365天排程]
F6[06_evaluate.xlsx<br/>效果对比]
F7[07_sensitivity.xlsx<br/>敏感性结果]
end
A --> B1
E1 --> F1
E1 --> F2
E1 --> F3
E1 --> F4
E1 --> F5
E1 --> F6
S1 --> F7
style CORE fill:#90EE90
style VALIDATE fill:#90EE90
style SENSITIVITY fill:#90EE90
style VISUAL fill:#FFE4B5
ASCII版本(详细)
┌─────────────────────────────────────────────────────────────────────────────────────────────┐
│ TASK 3 完整流程 │
├─────────────────────────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────────────────────────────────────┐ │
│ │ 核心流程 [已完成 ✓] │ │
│ │ │ │
│ │ task1/03_allocate.xlsx │ │
│ │ │ │ │
│ │ ▼ │ │
│ │ ┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐ │ │
│ │ │ 01_distance.py │ ──▶ │ 02_pairing.py │ ──▶ │ 03_allocation.py │ │ │
│ │ │ 距离矩阵70×70 │ │ 34对配对选择 │ │ 最优分配q* │ │ │
│ │ └──────────────────┘ └──────────────────┘ └────────┬─────────┘ │ │
│ │ │ │ │
│ │ ▼ │ │
│ │ ┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐ │ │
│ │ │ 06_evaluate.py │ ◀── │ 05_calendar.py │ ◀── │ 04_reschedule.py │ │ │
│ │ │ 效果评估对比 │ │ 365天日历排程 │ │ 访问次数重分配 │ │ │
│ │ └──────────────────┘ └──────────────────┘ └──────────────────┘ │ │
│ └─────────────────────────────────────────────────────────────────────────────────────┘ │
│ │ │
│ ┌─────────────┼─────────────┬───────────────────────────┐ │
│ │ │ │ │ │
│ ▼ ▼ ▼ ▼ │
│ ┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐ │
│ │ 结果验证 [✓] │ │ 敏感性分析 [✓] │ │ 可视化 [待实现] │ │ 输出文件 │ │
│ │ │ │ │ │ │ │ │ │
│ │ ✓ 每日2事件 │ │ 07_sensitivity │ │ □ 配对地图 │ │ 01_distance.xlsx │ │
│ │ ✓ 总730次访问 │ │ ┌──────────────┐ │ │ □ 分配散点图 │ │ 02_pairing.xlsx │ │
│ │ ✓ q*边界检查 │ │ │合并比例 │ │ │ ✓ 敏感性曲线 │ │ 03_allocation.xlsx│ │
│ │ ✓ Task 1对比 │ │ │ 0.10-0.90 │ │ │ □ 日历热力图 │ │ 04_reschedule.xlsx│ │
│ │ │ │ ├──────────────┤ │ │ □ 风险分布图 │ │ 05_calendar.xlsx │ │
│ │ 结论: │ │ │距离阈值 │ │ │ │ │ 06_evaluate.xlsx │ │
│ │ E1↑16.9% │ │ │ 10-100 mi │ │ │ 图表清单: │ │ 07_sensitivity.xlsx│ │
│ │ E2↑5.3% │ │ ├──────────────┤ │ │ Fig.1-5 │ │ │ │
│ │ RS=19.5% │ │ │容量上限 │ │ │ │ │ │ │
│ │ R1=17.1% │ │ │ 350-550 │ │ │ │ │ │ │
│ │ │ │ ├──────────────┤ │ │ │ │ │ │
│ │ │ │ │CV阈值 │ │ │ │ │ │ │
│ │ │ │ │ 0.10-1.00 │ │ │ │ │ │ │
│ │ │ │ └──────────────┘ │ │ │ │ │ │
│ └──────────────────┘ └──────────────────┘ └──────────────────┘ └──────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────────────────────────┘
1. 问题本质与底层逻辑
1.1 题目核心要求
题目原文关键句:
"decide on the amount of food to dispense at the first site (since without pre-registration the demand at the next site is not known for sure)"
为什么这是核心难点?
传统的单站点访问:需求已知(或可估计),分配是确定性问题。
双站点访问的困境:
卡车出发时 ──▶ 到达站点i ──▶ 服务完成 ──▶ 前往站点j ──▶ 服务站点j
│ │ │ │
│ 需求D_i实现 │ 需求D_j实现
│ │ │ │
└── 决策点:预留多少给i? └── 剩余Q-S_i给j
问题本质:这是一个两阶段随机优化问题(Two-Stage Stochastic Optimization)
- 第一阶段决策:在出发前决定 $q$(给站点i预留多少)
- 第二阶段决策:观测到
D_i后,$S_i = \min(D_i, q)$,剩余Q - S_i给站点j
1.2 为什么采用双站点模式?
底层逻辑:资源效率优化
| 单站点模式 | 双站点模式 |
|---|---|
| 每天2次独立访问 | 每天可能1次双站点+1次单站点 |
| 730次/年 | 释放部分槽位 |
| 灵活但资源密集 | 效率更高但有风险 |
核心权衡:
- 收益:释放访问槽位 → 可服务更多需求
- 成本:需求不确定性 → 可能导致某站点服务不足
2. 符号定义与参数估计
2.1 符号体系
| 符号 | 定义 | 来源/估计 |
|---|---|---|
\mu_i, \sigma_i |
站点 i 的需求均值和标准差 |
2019年历史数据 |
\tilde{\mu}_i |
截断修正后的真实需求 | Task 1截断回归 |
D_i |
站点 i 的随机需求 |
D_i \sim N(\mu_i, \sigma_i^2) |
Q |
卡车单次总服务能力 | 400户 |
q |
第一站点预分配量 | 决策变量 |
l_{ij} |
站点间距离 | Haversine公式计算 |
k_i |
站点 i 的年度访问次数 |
Task 1 Hamilton分配 |
2.2 关键参数推导
为什么 $Q = 400$?
题面信息:
- 卡车运力 = 15,000 lbs
- 典型服务 = 200-250户
推导:
\text{每户食物量} = \frac{15000}{225} \approx 67 \text{ lbs}
但数据显示 $\mu_{max} = 396.6$,说明实际每户分配可能更少:
\text{实际每户} \approx \frac{15000}{400} = 37.5 \text{ lbs}
取 Q = 400 作为容量上限,与数据一致。
3. 共生站点配对模型
3.1 配对约束的底层逻辑
约束1:同日可达性
为什么需要距离约束?
单日时间预算分析:
工作日时间 = 8小时
单站点服务 = 2小时 × 2 = 4小时
转场+准备 = 0.5 + 行驶时间
可用行驶时间 = 8 - 4 - 0.5 = 3.5小时
假设平均车速30 mph(含路况):
l_{max} = 3.5 \times 30 = 105 \text{ miles}
为什么取50英里而非105英里?
- 保守设计:留有余量应对交通延误
- 敏感性分析显示:50英里已覆盖足够多的配对
距离计算公式(Haversine简化):
l_{ij} = 69.0 \times \sqrt{(\Delta lat)^2 + \cos^2(lat_{avg})(\Delta lon)^2}
- 69.0 = 1度纬度对应的英里数
\cos^2(lat_{avg})= 经度修正因子(高纬度地区经度圈变小)
约束2:容量可行性
为什么 $\mu_i + \mu_j \leq 450$?
- 卡车容量
Q = 400 - 允许10%溢出($\delta = 50$):因为需求是随机的,平均值之和略超容量时,实际服务可能仍在容量内
\mu_i + \mu_j \leq Q + \delta = 450
约束3:需求稳定性
为什么限制CV(变异系数)?
变异系数 CV = \sigma / \mu 衡量需求的相对波动性。
高CV站点的问题:
- 需求高度不确定
- 分配策略难以优化
- 服务缺口风险高
经验阈值:$CV_{max} = 0.5$(即标准差不超过均值的一半)
3.2 配对价值函数的设计逻辑
为什么需要价值函数?
满足约束的配对可能有上千个(实际1568对),需要选择最优的子集。
价值函数设计:
V_{ij} = \underbrace{\alpha \cdot \frac{\mu_i + \mu_j}{Q}}_{\text{容量利用率}} - \underbrace{\beta \cdot \frac{l_{ij}}{l_{max}}}_{\text{距离惩罚}} - \underbrace{\gamma \cdot \frac{\sigma_i^2 + \sigma_j^2}{(\mu_i + \mu_j)^2}}_{\text{风险惩罚}}
各项解释:
| 项 | 逻辑 | 权重 |
|---|---|---|
| 容量利用率 | 需求和接近Q的配对更有价值 | \alpha = 1.0 |
| 距离惩罚 | 距离远的配对效率低 | \beta = 0.3 |
| 风险惩罚 | 波动大的配对风险高 | \gamma = 0.5 |
为什么用贪心算法而非整数规划?
- 贪心算法:O(n²),实现简单,结果接近最优
- 整数规划:精确但复杂度高,收益有限
- 约束"每站点最多配对一次"使贪心算法非常有效
3.3 实际运行结果
配对筛选:
- 候选配对数:1568对(满足3个约束)
- 最终选择:34对(覆盖68个站点,97%)
- 未配对站点:2个
Top 10 高价值配对:
| 配对 | 站点i | 站点j | 距离 | 需求和 | 价值 |
|---|---|---|---|---|---|
| 1 | Boys and Girls Club | Redeemer Lutheran | 0.4 mi | 441 | 1.07 |
| 2 | Rathbone | Woodhull | 5.8 mi | 445 | 1.06 |
| 3 | Bath | Campbell | 9.6 mi | 448 | 1.05 |
| 4 | Springview Apts | Waverly | 0.8 mi | 424 | 1.05 |
| 5 | Birnie Transport | Lindley | 10.1 mi | 446 | 1.04 |
4. 第一站点分配的随机优化模型
4.1 问题形式化
为什么建模为随机优化?
确定性思维的错误:
"给站点i分配 $\mu_i$,给站点j分配 $Q - \mu_i$"
问题:实际需求 D_i 可能大于或小于 $\mu_i$:
- 若 $D_i > \mu_i$:站点i服务不足
- 若 $D_i < \mu_i$:多余食物浪费在站点i,站点j也可能不足
正确的建模:
决策变量:q = 为站点i预留的食物量
服务量:
S_i = \min(D_i, q), \quad S_j = \min(D_j, Q - S_i)
目标:最大化期望总服务量
\max_q \quad E[S_i + S_j]
4.2 解析解的推导过程
引理:截断正态期望
对于 $X \sim N(\mu, \sigma^2)$:
E[\min(X, c)] = \mu \cdot \Phi(z) - \sigma \cdot \phi(z) + c \cdot (1 - \Phi(z))
其中 $z = \frac{c - \mu}{\sigma}$。
推导:
E[\min(X, c)] = \int_{-\infty}^{c} x \cdot f(x) dx + c \cdot P(X > c)
第一项通过分部积分,第二项直接计算,得到上述公式。
最优条件推导:
简化假设:D_i, D_j 独立,忽略 S_i 的随机性对 E[S_j] 的影响。
E[S_i] \approx g(q; \mu_i, \sigma_i)
E[S_j] \approx g(Q - q; \mu_j, \sigma_j)
对 q 求导并令其为零:
\frac{\partial E[S_i]}{\partial q} = \frac{\partial E[S_j]}{\partial (-q)}
利用截断正态的导数性质:
\frac{\partial E[\min(X, c)]}{\partial c} = 1 - \Phi\left(\frac{c - \mu}{\sigma}\right)
得到:
1 - \Phi\left(\frac{q - \mu_i}{\sigma_i}\right) = 1 - \Phi\left(\frac{Q - q - \mu_j}{\sigma_j}\right)
\Phi\left(\frac{q - \mu_i}{\sigma_i}\right) = \Phi\left(\frac{Q - q - \mu_j}{\sigma_j}\right)
由 \Phi 的单调性:
\frac{q - \mu_i}{\sigma_i} = \frac{Q - q - \mu_j}{\sigma_j}
解得:
\boxed{q^* = \frac{\sigma_j \mu_i + \sigma_i (Q - \mu_j)}{\sigma_i + \sigma_j}}
4.3 最优分配公式的物理解释
改写公式:
q^* = \frac{\sigma_j}{\sigma_i + \sigma_j} \cdot \mu_i + \frac{\sigma_i}{\sigma_i + \sigma_j} \cdot (Q - \mu_j)
解释:
- 当 $\sigma_j \gg \sigma_i$:$q^* \to \mu_i$(为站点i精确分配,因为j波动大需要更多缓冲)
- 当 $\sigma_i \gg \sigma_j$:$q^* \to Q - \mu_j$(为站点j预留更多,因为i波动大)
- 当 $\sigma_i = \sigma_j$:$q^* = \frac{\mu_i + Q - \mu_j}{2}$(平均分配)
核心洞察:波动大的站点需要更多"缓冲"空间。
4.4 鲁棒性约束
为什么需要约束?
极端情况下,q^* 可能导致某站点获得很少的预留:
- 若 $q^* < \mu_i - \sigma_i$:站点i很可能服务不足
- 若 $Q - q^* < \mu_j - \sigma_j$:站点j很可能服务不足
约束设计:
\mu_i - k\sigma_i \leq q \leq Q - \mu_j + k\sigma_j
取 $k = 1$(约84%保护水平)。
实际效果:34对配对中,无一触及边界约束——说明最优解本身已经是鲁棒的。
4.5 实际分配结果
| 统计量 | 值 |
|---|---|
q^* 范围 |
[23.9, 315.6] |
| 分配比例范围 | [6.0%, 78.9%] |
| 平均分配比例 | 50.6% |
| 平均效率 | 94.2% |
Top 5 配对的分配方案:
| 配对 | \mu_i |
\mu_j |
\sigma_i |
\sigma_j |
q^* |
比例 |
|---|---|---|---|---|---|---|
| Boys & Girls + Redeemer | 210.8 | 230.6 | 28.9 | 93.5 | 195.9 | 49.0% |
| Rathbone + Woodhull | 269.1 | 176.0 | 38.2 | 35.9 | 248.1 | 62.0% |
| Bath + Campbell | 279.5 | 168.5 | 67.9 | 33.9 | 254.3 | 63.6% |
| Springview + Waverly | 27.6 | 396.6 | 5.6 | 51.9 | 23.9 | 6.0% |
| Birnie + Lindley | 213.4 | 232.9 | 27.8 | 56.9 | 189.4 | 47.3% |
5. 全局调度优化
5.1 合并比例的设计逻辑
为什么不全部合并?
风险考虑:
- 双站点访问有服务缺口风险
- 保留部分单独访问作为"保险"
合并比例公式:
k_{ij} = \lfloor \min(k_i, k_j) / 2 \rfloor
示例:站点i有10次访问,站点j有6次
- 双站点访问次数:
\lfloor \min(10, 6) / 2 \rfloor = 3 - 站点i剩余单独访问:
10 - 3 = 7 - 站点j剩余单独访问:
6 - 3 = 3
5.2 释放槽位的重分配
为什么双站点访问算1次事件?
题目说"sending the same truck to visit two sites on some of the trips"——双站点是一次"行程"。
重分配逻辑:
- 计算释放的槽位:
\Delta N = \sum k_{ij} = 142 - 按需求比例分配给所有站点
- 使用Hamilton方法取整
5.3 实际运行结果
| 指标 | 值 |
|---|---|
| 配对数 | 34 |
| 双站点访问次数 | 142 |
| 释放槽位 | 142 |
| 最终单站点访问 | 588 |
| 最终总事件 | 730(符合约束) |
6. 效果评估
6.1 指标定义与逻辑
E1':期望总服务量
E_1' = \sum_{\text{单站点}} k_i \cdot \mu_i + \sum_{\text{双站点}} k_{ij} \cdot E[S_i + S_j]
E2':质量加权服务量
为什么需要质量加权?
当服务户数超过250时,每户分得的食物减少:
q(\mu) = \min\left(1, \frac{250}{\mu}\right)
双站点的质量计算(总量法):
q_{ij} = \min\left(1, \frac{250}{\mu_i + \mu_j}\right)
为什么用总量而非分站点计算?
- 双站点共享同一卡车的食物
- 总负载决定每户分得的量
- 更符合物理实际
满足率 $r_i$(与Task 1定义一致):
r_i = \frac{k_i \cdot \mu_i}{\tilde{\mu}_i}
对于参与配对的站点:
r_i = \frac{k_i^{single} \cdot \mu_i + k_{ij} \cdot E[S_i]}{\tilde{\mu}_i}
R1:服务缺口风险
R_1 = P(S_i / D_i < 0.8 \text{ 或 } S_j / D_j < 0.8)
6.2 实际结果对比
| 指标 | Task 1 | Task 3 | 变化 | 变化% |
|---|---|---|---|---|
| E1 (总服务量) | 140,121 | 163,777 | +23,656 | +16.9% |
| E2 (质量加权) | 131,673 | 138,699 | +7,026 | +5.3% |
| F1 (Gini系数) | 0.314 | 0.320 | +0.006 | +1.9% |
| F2 (最低满足率) | 2.0 | 2.0 | 0 | 0% |
| R1 (缺口风险) | 0 | 0.171 | +0.171 | 新增 |
| RS (资源节省) | 0% | 19.5% | +19.5% | 新增 |
核心发现:
- 通过双站点模式,释放19.5%的访问槽位
- 总服务量提升16.9%
- 公平性几乎不变(Gini仅增加1.9%)
- 代价是引入17.1%的服务缺口风险
7. 敏感性分析
7.1 分析参数
| 参数 | 符号 | 基准值 | 扫描范围 |
|---|---|---|---|
| 合并比例 | r_{merge} |
1/2 | 0.10–0.90(步长0.01,共81点) |
| 距离阈值 | l_{max} |
50 mi | 10–100(步长1,共91点) |
| 容量上限 | \mu_{sum,max} |
450 | 350–550(步长5,共41点) |
| CV阈值 | CV_{max} |
0.5 | 0.10–1.00(步长0.01,共91点) |
7.2 敏感性结果(高分辨率)
说明:每次扫描仅改变一个参数,其余保持基准值;完整结果见
07_sensitivity.xlsx(共304个扫描点)。
总体汇总(范围为扫描区间的最小值~最大值)
| 参数 | E1范围 | E2范围 | R1范围 |
|---|---|---|---|
r_{merge} |
143,904 ~ 181,014(-12.13% ~ +10.52%) | 132,849 ~ 143,124(-4.22% ~ +3.19%) | 0.1708 ~ 0.1708 |
l_{max} |
158,665 ~ 163,777(-3.12% ~ +0.00%) | 137,369 ~ 138,699(-0.96% ~ +0.00%) | 0.1447 ~ 0.1796 |
\mu_{sum,max} |
160,924 ~ 164,140(-1.74% ~ +0.22%) | 135,781 ~ 143,672(-2.10% ~ +3.59%) | 0.0262 ~ 0.2090 |
CV_{max} |
141,666 ~ 163,951(-13.50% ~ +0.11%) | 132,823 ~ 138,873(-4.24% ~ +0.13%) | 0.0000 ~ 0.1810 |
1. 合并比例 r_{merge} — 影响 E1/E2 的主导参数
- 单调性:
r_{merge}越大,双站点次数越多(18 → 255),E1/E2 基本近似线性上升(相关系数≈0.999)。 - 风险:R1 几乎不变(本模型中 R1 衡量“配对本身”的缺口概率,与双站点次数规模无关)。
- 取值建议:若以“提升服务量”为主,
r_{merge}越大越好;若考虑运营复杂度与稳健性,基准r_{merge}=0.5是折中点。
2. 距离阈值 l_{max} — 主要影响“可配对数量”,之后快速进入平台期
- 当
l_{max}从 10 增加到约 22 时,可配对数从 27 增至 34;之后继续放宽距离对 E1/E2 的增益几乎为 0(平台期)。 - 风险:在小
l_{max}下 R1 更低(例如l_{max}=10时 R1≈0.1447),放宽距离后 R1 波动不大但略有上升空间。 - 取值建议:
l_{max}取 45–55 可兼顾“覆盖足够配对 + 计算与运营可控”,50 mi 作为基准合理。
3. 容量上限 \mu_{sum,max} — 风险与质量(E2) 的关键控制阀
- E1:整体变化很小(±2% 内),说明“总服务量”对该参数相对稳健。
- E2:
\mu_{sum,max}越小,E2 越高(350 时 E2 最大≈143,672),原因是质量折扣q(\\mu_{sum})=\\min(1,250/\\mu_{sum})对高\mu_{sum}组合惩罚更重。 - 风险:
\mu_{sum,max}放宽会显著推高 R1(0.0262 → 0.2090),属于最敏感的风险参数。 - 取值建议:若以“控风险+提升E2”为主,优先考虑 350–400;若更强调“资源节省/双站点次数规模”,可保持基准 450,但需接受更高的缺口风险水平。
4. CV 阈值 CV_{max} — 准入门槛参数(过严会显著损失 E1/E2)
- 阈值过严(如 0.10)会导致仅剩极少配对(最少 2 对),从而 E1/E2 明显下降;当
CV_{max}\\ge 0.44时可恢复到 34 对配对规模并进入平台期。 - 曲线形态:E1/E2 在 0.50–0.60 附近达到峰值(本数据在 0.56 处最高),之后提升有限。
- 取值建议:
CV_{max}取 0.50–0.60 较稳健,基准 0.50 与最优点非常接近。
7.3 敏感性结论与汇总
| 参数 | E1影响范围 | E2影响范围 | R1影响范围 | 结论 |
|---|---|---|---|---|
| merge_ratio | 22.66% | 7.41% | 0.00% | ⚠️ E1/E2 主导参数 |
| l_max | 3.12% | 0.96% | 3.49% | ✅ 快速平台化,较稳健 |
| mu_sum_max | 1.96% | 5.69% | 18.27% | ⚠️ 风险与E2关键控制参数 |
| cv_max | 13.61% | 4.36% | 18.10% | ⚠️ 过严会导致配对崩塌 |
建议:
- 合并比例决定双站点次数规模,是提升E1/E2的主要旋钮(但也带来更高运营复杂度)
- 距离阈值很快进入平台期(约22 mi后配对数基本饱和),基准 50 mi 合理
- 容量上限与 CV阈值共同决定“允许哪些站点进入配对池”,会显著影响风险与E2,应作为风险治理参数重点管理
8. 结果验证
8.1 约束满足检验
| 检验项 | 要求 | 实际 | 结果 |
|---|---|---|---|
| 每日访问事件数 | 2 | min=2, max=2 | ✅ 通过 |
| 年度总事件数 | 730 | 730 | ✅ 通过 |
| 站点覆盖 | 全覆盖 | 70/70 | ✅ 通过 |
| $q^*$边界检查 | 在[q_lower, q_upper]内 | 34/34在边界内 | ✅ 通过 |
8.2 模型有效性验证
与Task 1对比:
- E1提升16.9%:释放的槽位被有效利用
- F1几乎不变:公平性未受损
- R1可控:17.1%的缺口风险在合理范围
物理合理性:
- 高价值配对的需求和接近容量(平均413)
- 最优分配比例接近50%(平均50.6%)
- 低需求配对的双站点次数较少(合理)
9. 可视化图表(Fig.3 已完成)
9.1 图表清单
| 图编号 | 图名 | 内容 | 目的 |
|---|---|---|---|
| Fig.1 | 站点配对地图 | 70站点+34条配对连线 | 展示空间分布 |
| Fig.2 | 分配策略散点图 | q* vs (μ_i, σ_i, σ_j) | 验证分配逻辑 |
| Fig.3 ✅ | 敏感性曲线 | 4参数对E1,E2,R1的影响 | 参数选择依据 |
| Fig.4 | 日历热力图 | 365天×2槽位 | 排程可视化 |
| Fig.5 | 风险分布图 | 34对的缺口概率分布 | 风险识别 |
Fig.3 已由
07_sensitivity.py生成:figures/fig3_sensitivity.png。
9.2 可视化脚本(待实现:Fig.1/2/4/5)
task3/
├── 08_visualize.py # 可视化脚本
└── figures/
├── fig1_pairing_map.png
├── fig2_allocation_scatter.png
├── fig3_sensitivity.png # ✅ 已生成(07_sensitivity.py)
├── fig4_calendar_heatmap.png
└── fig5_risk_distribution.png
10. 结论与政策建议
10.1 主要发现
- 配对收益:双站点模式可节省19.5%的访问槽位,服务量提升16.9%
- 分配策略:最优分配量
q^*与两站点需求波动性成反比——波动大的站点需要更多"缓冲" - 风险可控:通过合理的配对选择和鲁棒性约束,服务缺口风险控制在17%以内
- 参数敏感性分工明确:合并比例主导 E1/E2;容量上限与CV阈值主导风险与E2;距离阈值快速进入平台期
10.2 对FBST的建议
| 建议 | 理由 |
|---|---|
| 采用双站点模式 | 可释放19.5%资源服务更多需求 |
| 优先配对低需求、地理相近站点 | 容量利用率高,风险低 |
| 保留高需求站点的单独访问 | 避免服务不足 |
| 记录双站点访问的实际服务量 | 校准模型参数 |
| 合并比例取1/2 | 平衡效率与运营复杂度 |
10.3 模型局限性
- 需求独立性假设:实际中相邻站点需求可能相关
- 服务时间固定:大需求站点可能需要更长服务时间
- 天气因素未纳入:可与Task 2结合考虑
- 简化的不确定性传播:忽略了
S_i对S_j的随机影响
附录A:关键公式速查
| 公式 | 用途 | 来源 |
|---|---|---|
q^* = \frac{\sigma_j \mu_i + \sigma_i (Q - \mu_j)}{\sigma_i + \sigma_j} |
最优第一站点分配 | 4.2节推导 |
V_{ij} = \alpha \frac{\mu_i + \mu_j}{Q} - \beta \frac{l_{ij}}{l_{max}} - \gamma \frac{\sigma_i^2 + \sigma_j^2}{(\mu_i + \mu_j)^2} |
配对价值函数 | 3.2节设计 |
E[\min(X, c)] = \mu \Phi(z) - \sigma \phi(z) + c(1-\Phi(z)) |
截断正态期望 | 统计引理 |
q(\mu) = \min(1, 250/\mu) |
质量折扣因子 | Task 1定义 |
k_{ij} = \lfloor \min(k_i, k_j) / 2 \rfloor |
合并次数 | 5.1节设计 |
附录B:程序流水线
task3/
├── 01_distance.py ✅ 距离矩阵计算
│ └── 01_distance.xlsx (70×70矩阵)
├── 02_pairing.py ✅ 配对筛选与选择
│ └── 02_pairing.xlsx (34对配对)
├── 03_allocation.py ✅ 最优分配计算
│ └── 03_allocation.xlsx (q*值)
├── 04_reschedule.py ✅ 访问次数重分配
│ └── 04_reschedule.xlsx (k'值)
├── 05_calendar.py ✅ 日历排程生成
│ └── 05_calendar.xlsx (365天)
├── 06_evaluate.py ✅ 效果评估
│ └── 06_evaluate.xlsx (指标对比)
├── 07_sensitivity.py ✅ 敏感性分析
│ └── 07_sensitivity.xlsx (4参数)
├── 08_visualize.py ⏳ 可视化(待实现)
│ └── figures/ (5张图)
└── README.md ✅ 本文档
附录C:运行命令
cd task3
# 完整流程
python 01_distance.py
python 02_pairing.py
python 03_allocation.py
python 04_reschedule.py
python 05_calendar.py
python 06_evaluate.py
python 07_sensitivity.py
# 一键运行(可选)
for i in 01 02 03 04 05 06 07; do python ${i}_*.py; done
附录D:参数设置汇总
| 参数 | 符号 | 基准值 | 敏感性 | 依据 |
|---|---|---|---|---|
| 卡车容量 | Q |
400户 | - | 数据推断 |
| 距离阈值 | l_{max} |
50 mi | 低 | 时间预算 |
| 容量上限 | \mu_{sum,max} |
450 | 中(风险) | Q+10% |
| CV上限 | CV_{max} |
0.5 | 低 | 经验值 |
| 合并比例 | r_{merge} |
1/2 | 高 | 效率-风险平衡 |
| 鲁棒性水平 | k |
1 | - | 84%保护 |
| 质量阈值 | \bar{C} |
250 | - | Task 1定义 |
