P3: codes and results

This commit is contained in:
2026-01-18 17:06:19 +08:00
parent ae3d4cffde
commit 5f3d5c95ed
10 changed files with 1433 additions and 5 deletions

View File

@@ -53,11 +53,10 @@ Optimize a 365-day schedule with at most 2 visits per day and minimum gap constr
其中 `lat0` 可取所有站点纬度均值(单位:英里)。若仅需相对距离,也可用
`|lat_i - lat_j| + |lon_i - lon_j|` 作为无量纲近似。
具体配对流程(可直接脚本化):
- **距离筛选**:对每个站点 `i`,计算与所有 `j != i` 的 `d_ij`保留 `d_ij <= d_max`
或取 `k` 个最近邻(如 `k=5~8`),得到近邻集合 `N(i)`。
- **需求均衡筛选**:对候选 `(i, j)`,要求
`mu_i / mu_j` 处于区间 `[r_min, r_max]`(如 `[0.5, 2.0]`
或 `|mu_i - mu_j| <= delta_mu`,避免极端失衡导致第二站缺货。
- **距离筛选**:对每个站点 `i`,计算与所有 `j != i` 的 `d_ij` `k` 个最近邻
(默认 `k=6`),得到近邻集合 `N(i)`。
- **运载量筛选**:对候选 `(i, j)`,要求 `mu_i + mu_j <= 250`
(将每次访问的平均客户数视为需求均值),确保双站总需求不超过单车载量。
- **波动风险筛选**:若 `sigma_i` 或 `sigma_j` 过大(如 `sigma / mu > 0.5`
则优先作为第二站(或直接剔除)以降低不确定性风险。
- **最终候选集**`P = {(i, j) | j in N(i) 且满足需求/波动筛选}`
@@ -97,3 +96,26 @@ Optimize a 365-day schedule with at most 2 visits per day and minimum gap constr
- **动态修正**:若某站点连续出现“后站不足”,在后续排程中降低其作为第一站的概率或提高 `q_i` 分位数阈值。
该方案与当前脚本兼容:`kmin_effectiveness.py` 提供需求统计与 Monte Carlo 框架;`scheduling_optimization.py` 的 CP-SAT 可扩展为“单站/双站二选一”的排程模型。
### 候选配对生成脚本
- `python3 candidate_pairs.py --k 6 --capacity 250`
- 输出:`data/candidate_pairs_k6_cap250.csv`
### 第一站分配量优化脚本
- `python3 two_stop_allocation.py --input data/candidate_pairs_k6_cap250.csv`
- 输出:`data/ordered_pairs_allocation_k6_cap250.csv`
- 说明:对每个无序候选对生成 `(i -> j)` 与 `(j -> i)` 两条有序记录,并用 Monte Carlo
在 `q_i ∈ [0, C]` 上搜索最优第一站分配量。
### Task 3 频次分配(双站合并出车)
- `python3 p3_kmin.py --input-pairs data/ordered_pairs_allocation_k6_cap250.csv`
- 输出:
- `data/p3_kmin_data.csv`:扫 `k_min` 的有效性/公平性指标 + 出车统计
- `data/p3_kmin_sites.csv`:每站单独次数/双站次数统计
- `data/p3_kmin_pairs.csv`:有序双站出车次数 + 第一站上限 `q_opt`
- `data/p3_kmin_effectiveness.png`Task 3 的 `k_min` 指标曲线图
![p3 kmin effectiveness](data/p3_kmin_effectiveness.png)