Files
mcm-mfp/task3/README.md
2026-01-19 19:38:38 +08:00

769 lines
32 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Task 3: 双站点同车访问的随机优化方案
## 摘要
本文针对"同一辆卡车在单次行程中访问两个站点"的调度优化问题,提出一套**基于随机优化的完整解决方案**。核心创新点:
1. **问题本质识别**:将第一站点分配决策建模为**两阶段随机优化问题**,正确处理"第二站点需求不确定"的核心难点
2. **共生站点配对模型**:综合考虑距离、容量、波动性三维约束,构建配对价值函数
3. **解析最优分配策略**:推导出闭式解 $q^* = \frac{\sigma_j \mu_i + \sigma_i (Q - \mu_j)}{\sigma_i + \sigma_j}$
4. **风险可控的全局调度**:在提升效率的同时,将服务缺口风险控制在可接受范围
**实际运行结果**
- 总服务量提升 **16.9%**140,121 → 163,777
- 质量加权服务量提升 **5.3%**131,673 → 138,699
- 资源节省 **19.5%**142次双站点访问
- 服务缺口风险 **17.1%**(可控范围)
---
## 完整流程图
### Mermaid版本GitHub可渲染
```mermaid
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[合并比例: 0.10-0.90]
S3[距离阈值: 10-100mi]
S4[容量上限: 350-550]
S5[CV阈值: 0.10-1.00]
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**"——双站点是一次"行程"。
**重分配逻辑**
1. 计算释放的槽位:$\Delta N = \sum k_{ij} = 142$
2. 按需求比例分配给所有站点
3. 使用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% | 新增 |
**核心发现**
1. 通过双站点模式释放19.5%的访问槽位
2. 总服务量提升16.9%
3. 公平性几乎不变Gini仅增加1.9%
4. 代价是引入17.1%的服务缺口风险
---
## 7. 敏感性分析
### 7.1 分析参数
| 参数 | 符号 | 基准值 | 扫描范围 |
|------|------|--------|---------|
| 合并比例 | $r_{merge}$ | 1/2 | 0.100.90步长0.01共81点 |
| 距离阈值 | $l_{max}$ | 50 mi | 10100步长1共91点 |
| 容量上限 | $\mu_{sum,max}$ | 450 | 350550步长5共41点 |
| CV阈值 | $CV_{max}$ | 0.5 | 0.101.00步长0.01共91点 |
### 7.2 敏感性结果(高分辨率)
![Fig.3 敏感性曲线E1/E2 与 R1](figures/fig3_sensitivity.png)
> 说明:每次扫描仅改变一个参数,其余保持基准值;完整结果见 `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 → 255E1/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}$ 取 4555 可兼顾“覆盖足够配对 + 计算与运营可控”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}$ 放宽会显著推高 R10.0262 → 0.2090),属于最敏感的风险参数。
- 取值建议:若以“控风险+提升E2”为主优先考虑 350400若更强调“资源节省/双站点次数规模”,可保持基准 450但需接受更高的缺口风险水平。
**4. CV 阈值 $CV_{max}$ — 准入门槛参数(过严会显著损失 E1/E2**
- 阈值过严(如 0.10)会导致仅剩极少配对(最少 2 对),从而 E1/E2 明显下降;当 $CV_{max}\\ge 0.44$ 时可恢复到 34 对配对规模并进入平台期。
- 曲线形态E1/E2 在 0.500.60 附近达到峰值(本数据在 0.56 处最高),之后提升有限。
- 取值建议:$CV_{max}$ 取 0.500.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% | ⚠️ 过严会导致配对崩塌 |
**建议**
1. **合并比例**决定双站点次数规模是提升E1/E2的主要旋钮但也带来更高运营复杂度
2. **距离阈值**很快进入平台期约22 mi后配对数基本饱和基准 50 mi 合理
3. **容量上限**与 **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.1-5 已完成)
### 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.1/2/4/5 已由 `08_visualize.py` 生成Fig.3 已由 `07_sensitivity.py` 生成。
### 9.2 可视化脚本(已实现)
```
task3/
├── fig1_carto.html # 交互地图CartoDB 底图)
├── fig1_points.js # ✅ 自动生成08_visualize.py
├── 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
```
### 9.3 可视化结果
![Fig.1 站点配对地图](figures/fig1_pairing_map.png)
交互版:用浏览器打开 `task3/fig1_carto.html`(同目录需有 `task3/fig1_points.js`;需联网加载 CartoDB 底图)。
![Fig.2 分配策略散点图](figures/fig2_allocation_scatter.png)
![Fig.4 日历热力图](figures/fig4_calendar_heatmap.png)
![Fig.5 风险分布图](figures/fig5_risk_distribution.png)
---
## 10. 结论与政策建议
### 10.1 主要发现
1. **配对收益**双站点模式可节省19.5%的访问槽位服务量提升16.9%
2. **分配策略**:最优分配量 $q^*$ 与两站点需求波动性成反比——波动大的站点需要更多"缓冲"
3. **风险可控**通过合理的配对选择和鲁棒性约束服务缺口风险控制在17%以内
4. **参数敏感性分工明确**:合并比例主导 E1/E2容量上限与CV阈值主导风险与E2距离阈值快速进入平台期
### 10.2 对FBST的建议
| 建议 | 理由 |
|------|------|
| 采用双站点模式 | 可释放19.5%资源服务更多需求 |
| 优先配对低需求、地理相近站点 | 容量利用率高,风险低 |
| 保留高需求站点的单独访问 | 避免服务不足 |
| 记录双站点访问的实际服务量 | 校准模型参数 |
| 合并比例取1/2 | 平衡效率与运营复杂度 |
### 10.3 模型局限性
1. **需求独立性假设**:实际中相邻站点需求可能相关
2. **服务时间固定**:大需求站点可能需要更长服务时间
3. **天气因素未纳入**可与Task 2结合考虑
4. **简化的不确定性传播**:忽略了 $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 ✅ 可视化Fig.1/2/4/5
│ └── figures/ (5张图)
└── README.md ✅ 本文档
```
---
## 附录C运行命令
```bash
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
python 08_visualize.py
# 一键运行(可选)
for i in 01 02 03 04 05 06 07; do python ${i}_*.py; done
python 08_visualize.py
```
---
## 附录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定义 |