# 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 结果
70站点 + 730次分配
task1/03_allocate.xlsx] end subgraph TASK3["TASK 3: 双站点同车优化"] direction TB subgraph CORE["核心流程 ✅ 已完成"] subgraph PAIRING["阶段1: 配对选择"] B1[01_distance.py
距离矩阵计算] B2[02_pairing.py
可行性筛选+贪心选择] B1 --> B2 end subgraph ALLOCATION["阶段2: 分配优化"] C1[03_allocation.py
最优分配q*计算] end subgraph SCHEDULING["阶段3: 全局调度"] D1[04_reschedule.py
访问次数重分配] D2[05_calendar.py
日历排程生成] D1 --> D2 end subgraph EVALUATION["阶段4: 效果评估"] E1[06_evaluate.py
E1',E2',F1',F2',R1,RS] end B2 --> C1 --> D1 D2 --> E1 end subgraph VALIDATE["结果验证 ✅ 已完成"] V1[约束满足检验
每日2事件、总730次] V2[与Task 1对比
指标改进验证] V3[分配合理性
q*边界检查] end subgraph SENSITIVITY["敏感性分析 ✅ 已完成"] S1[07_sensitivity.py
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
距离矩阵] F2[02_pairing.xlsx
34对配对] F3[03_allocation.xlsx
最优分配] F4[04_reschedule.xlsx
访问次数] F5[05_calendar.xlsx
365天排程] F6[06_evaluate.xlsx
效果对比] F7[07_sensitivity.xlsx
敏感性结果] 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对比 │ │ │ 1/3,1/2,2/3 │ │ │ □ 日历热力图 │ │ 04_reschedule.xlsx│ │ │ │ │ │ ├──────────────┤ │ │ □ 风险分布图 │ │ 05_calendar.xlsx │ │ │ │ 结论: │ │ │距离阈值 │ │ │ │ │ 06_evaluate.xlsx │ │ │ │ E1↑16.9% │ │ │ 30-70 mi │ │ │ 图表清单: │ │ 07_sensitivity.xlsx│ │ │ │ E2↑5.3% │ │ ├──────────────┤ │ │ Fig.1-5 │ │ │ │ │ │ RS=19.5% │ │ │容量上限 │ │ │ │ │ │ │ │ │ R1=17.1% │ │ │ 400-500 │ │ │ │ │ │ │ │ │ │ │ ├──────────────┤ │ │ │ │ │ │ │ │ │ │ │CV阈值 │ │ │ │ │ │ │ │ │ │ │ │ 0.3-0.6 │ │ │ │ │ │ │ │ │ │ │ └──────────────┘ │ │ │ │ │ │ │ └──────────────────┘ └──────────────────┘ └──────────────────┘ └──────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────────────────────────────────────┘ ``` --- ## 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 | [1/3, 1/2, 2/3] | | 距离阈值 | $l_{max}$ | 50 mi | [30, 40, 50, 60, 70] | | 容量上限 | $\mu_{sum,max}$ | 450 | [400, 425, 450, 475, 500] | | CV阈值 | $CV_{max}$ | 0.5 | [0.3, 0.4, 0.5, 0.6] | ### 7.2 敏感性结果 **1. 合并比例 — 最敏感参数** | merge_ratio | 双站点次数 | E1 | E2 | F1 | R1 | |-------------|-----------|-----|-----|------|------| | **1/3 (0.333)** | 93 | 155,724 | 136,556 | 0.3200 | 0.1708 | | **1/2 (0.500)** | 142 | 163,777 | 138,699 | 0.3199 | 0.1708 | | **2/3 (0.667)** | 196 | 171,574 | 140,891 | 0.3122 | 0.1708 | - **E1变化幅度:9.68%** — 最敏感 - 提高合并比例可显著增加服务量,但可能略微降低公平性(F1)。 **2. 距离阈值 — 稳健** | l_max | 配对数 | E1 | E2 | F1 | R1 | |-------|--------|-----|-----|------|------| | 30 mi | 33 | 162,180 | 137,436 | 0.3173 | 0.1757 | | 40 mi | 34 | 163,252 | 138,368 | 0.3201 | 0.1714 | | 50 mi | 34 | 163,777 | 138,699 | 0.3199 | 0.1708 | | 60 mi | 34 | 163,763 | 138,587 | 0.3200 | 0.1714 | | 70 mi | 34 | 163,588 | 138,484 | 0.3201 | 0.1714 | - **E1变化幅度:0.98%** — 模型极其稳健 - 50英里是平衡效率与计算复杂度的理想选择。 **3. 容量上限 — 风险敏感** | mu_sum_max | E1 | E2 | F1 | R1 | |------------|-----|-----|------|------| | 400 | 162,858 | 140,271 | 0.3227 | 0.0937 | | 425 | 163,146 | 139,306 | 0.3213 | 0.1514 | | 450 | 163,777 | 138,699 | 0.3199 | 0.1708 | | 475 | 163,153 | 138,113 | 0.3185 | 0.1894 | | 500 | 162,688 | 136,835 | 0.3123 | 0.2036 | - **R1变化幅度:10.99%** — 对风险影响极大 - 较低容量上限(400)可将风险降低近一半,同时维持较高的质量加权服务量(E2)。 **4. CV阈值 — 准入敏感** | cv_max | 配对数 | E1 | E2 | F1 | R1 | |--------|--------|-----|-----|------|------| | 0.3 | 25 | 157,907 | 135,824 | 0.3190 | 0.1810 | | 0.4 | 31 | 161,248 | 137,282 | 0.3188 | 0.1748 | | 0.5 | 34 | 163,777 | 138,699 | 0.3199 | 0.1708 | | 0.6 | 35 | 163,951 | 138,873 | 0.3197 | 0.1659 | - **E1变化幅度:3.69%** - 增加CV阈值允许更多高波动性站点配对,略微提升总量但需谨慎对待。 ### 7.3 敏感性结论与汇总 | 参数 | E1影响范围 | E2影响范围 | R1影响范围 | 结论 | |------|-----------|-----------|-----------|------| | **merge_ratio** | 9.68% | 3.13% | 0.00% | ⚠️ 关键决策参数 | | **l_max** | 0.98% | 0.91% | 0.49% | ✅ 参数稳健 | | **mu_sum_max** | 0.66% | 2.48% | 10.99% | ⚠️ 风险控制参数 | | **cv_max** | 3.69% | 2.20% | 1.51% | ✅ 较稳健 | **建议**: 1. **合并比例**是最敏感参数,需根据风险承受能力选择 2. **距离阈值**和**CV阈值**影响有限,模型稳健 3. **容量上限**影响风险水平,保守选择400可降低风险50% --- ## 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. 待实现:可视化图表 ### 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对的缺口概率分布 | 风险识别 | ### 9.2 可视化脚本(待实现) ``` task3/ ├── 08_visualize.py # 可视化脚本 └── figures/ ├── fig1_pairing_map.png ├── fig2_allocation_scatter.png ├── fig3_sensitivity.png ├── fig4_calendar_heatmap.png └── fig5_risk_distribution.png ``` --- ## 10. 结论与政策建议 ### 10.1 主要发现 1. **配对收益**:双站点模式可节省19.5%的访问槽位,服务量提升16.9% 2. **分配策略**:最优分配量 $q^*$ 与两站点需求波动性成反比——波动大的站点需要更多"缓冲" 3. **风险可控**:通过合理的配对选择和鲁棒性约束,服务缺口风险控制在17%以内 4. **参数稳健**:除合并比例外,其他参数对结果影响有限 ### 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 ⏳ 可视化(待实现) │ └── 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 # 一键运行(可选) 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定义 |