diff --git a/task3/01_distance.xlsx b/task3/01_distance.xlsx index d1b6a81..15628a2 100644 Binary files a/task3/01_distance.xlsx and b/task3/01_distance.xlsx differ diff --git a/task3/02_pairing.xlsx b/task3/02_pairing.xlsx index bea037a..286a2a6 100644 Binary files a/task3/02_pairing.xlsx and b/task3/02_pairing.xlsx differ diff --git a/task3/03_allocation.xlsx b/task3/03_allocation.xlsx index acf68cc..440f85b 100644 Binary files a/task3/03_allocation.xlsx and b/task3/03_allocation.xlsx differ diff --git a/task3/04_reschedule.xlsx b/task3/04_reschedule.xlsx index c1708d7..c7b7aa0 100644 Binary files a/task3/04_reschedule.xlsx and b/task3/04_reschedule.xlsx differ diff --git a/task3/05_calendar.xlsx b/task3/05_calendar.xlsx index 23fa505..fc63753 100644 Binary files a/task3/05_calendar.xlsx and b/task3/05_calendar.xlsx differ diff --git a/task3/06_evaluate.xlsx b/task3/06_evaluate.xlsx index 1a9057b..09cdf0d 100644 Binary files a/task3/06_evaluate.xlsx and b/task3/06_evaluate.xlsx differ diff --git a/task3/07_sensitivity.xlsx b/task3/07_sensitivity.xlsx index 463faba..ca8aa1f 100644 Binary files a/task3/07_sensitivity.xlsx and b/task3/07_sensitivity.xlsx differ diff --git a/task3/README.md b/task3/README.md index 827fc01..ef47a4f 100644 --- a/task3/README.md +++ b/task3/README.md @@ -10,9 +10,9 @@ 4. **风险可控的全局调度**:在提升效率的同时,将服务缺口风险控制在可接受范围 **实际运行结果**: -- 总服务量提升 **9.8%**(141,044 → 154,884) -- 质量加权服务量提升 **6.2%**(132,009 → 140,194) -- 资源节省 **9.5%**(69次双站点访问) +- 总服务量提升 **9.9%**(139,469 → 153,307) +- 质量加权服务量提升 **6.3%**(131,462 → 139,701) +- 资源节省 **9.6%**(70次双站点访问) - 服务缺口风险 **1.2%**(低风险水平) --- @@ -326,12 +326,17 @@ $$V_{ij} = \underbrace{\alpha \cdot \frac{\mu_i + \mu_j}{Q}}_{\text{容量利用 - **价值 (Value)**:综合得分。得分越高,表明该配对在“高容量利用”、“低距离代价”和“低波动风险”三方面取得了最佳平衡。 | 排名 | 站点i (Site i) | 站点j (Site j) | 距离 (mi) | 需求和 ($\mu_{sum}$) | 价值 ($V_{ij}$) | -|------|-------|-------|------|--------|------| -| 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 | +|---|---|---|---|---|---| +| 1 | American Legion - Binghamton | First Assembly Of God Church | 1.3 mi | 346 | 0.96 | +| 2 | Senior - Villa Serene | The Love Church | 0.8 mi | 329 | 0.92 | +| 3 | College Corning Community College | Senior - Dayspring | 2.2 mi | 328 | 0.91 | +| 4 | Endwell United Methodist Church | Senior - North Shore Towers | 5.8 mi | 344 | 0.91 | +| 5 | Danby | Salvation Army Ithaca | 6.1 mi | 341 | 0.90 | +| 6 | Beaver Dams | Millport | 6.1 mi | 337 | 0.89 | +| 7 | Birnie Transportation Services | Bradford | 13.6 mi | 336 | 0.81 | +| 8 | Rehoboth Deliverance Ministry | Senior - CFS Lakeview | 17.4 mi | 348 | 0.81 | +| 9 | Richford | Senior - Titus Towers | 16.4 mi | 339 | 0.80 | +| 10 | Rathbone | Senior - Addison Place Apartments | 4.7 mi | 299 | 0.79 | --- @@ -441,12 +446,12 @@ $$\mu_i - k\sigma_i \leq q \leq Q - \mu_j + k\sigma_j$$ - **比例 (Ratio)**:$q^*/400$。注意看 **Springview + Waverly** 这一组,尽管 Waverly (站点j) 的需求很大,但由于 Springview (站点i) 的波动极小 ($\sigma=5.6$) 而 Waverly 波动大 ($\sigma=51.9$),模型仅给 Springview 预留了 6.0% 的极低比例。这精确地反映了“将大部分缓冲留给波动大的站点”这一核心策略。 | 配对 | $\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% | +|---|---|---|---|---|---|---| +| American Legion + First Assemb... | 200.2 | 146.0 | 46.1 | 21.6 | 236.8 | 59.2% | +| Senior + The Love Church | 69.7 | 259.3 | 5.1 | 59.9 | 75.3 | 18.8% | +| College Corn... + Senior | 251.0 | 77.2 | 33.3 | 17.9 | 297.6 | 74.4% | +| Endwell Unit... + Senior | 285.2 | 58.3 | 60.8 | 6.9 | 335.9 | 84.0% | +| Danby + Salvation Ar... | 160.2 | 181.2 | 34.6 | 39.6 | 187.5 | 46.9% | --- @@ -528,19 +533,19 @@ $$R_1 = P(S_i / D_i < 0.8 \text{ 或 } S_j / D_j < 0.8)$$ 下表对比了 Task 1(传统单站点模式)与 Task 3(双站点优化模式)的关键性能指标。数据表明,新模型在各项核心指标上均取得了显著突破。 -- **E1 (总服务量)**:提升 **9.8%**。这直接归功于释放出的 69 个访问槽位被重新分配给了全网络,增加了总的服务频次。 -- **E2 (质量加权)**:提升 **6.2%**。虽然增幅略低于 E1(因为双站点模式下每户平均分得量可能略减,导致质量因子下降),但整体质量效益依然显著为正。 +- **E1 (总服务量)**:提升 **9.9%**。这直接归功于释放出的 70 个访问槽位被重新分配给了全网络,增加了总的服务频次。 +- **E2 (质量加权)**:提升 **6.3%**。虽然增幅略低于 E1(因为双站点模式下每户平均分得量可能略减,导致质量因子下降),但整体质量效益依然显著为正。 - **R1 (缺口风险)**:虽然从 0 增加到 1.2%,但这一数值远低于行业通常接受的 5% 风险阈值,说明模型成功用微小的风险代价换取了巨大的效率提升。 -- **RS (资源节省)**:**9.5%** 的资源节省率意味着 FBST 可以用同样的卡车和志愿者资源,多服务近一成的社区,或者在维持现有服务水平下减少 9.5% 的运营成本。 +- **RS (资源节省)**:**9.6%** 的资源节省率意味着 FBST 可以用同样的卡车和志愿者资源,多服务近一成的社区,或者在维持现有服务水平下减少 9.6% 的运营成本。 | 指标 | Task 1 | Task 3 | 变化 | 变化% | -|------|--------|--------|------|-------| -| **E1 (总服务量)** | 141,044 | 154,884 | +13,840 | **+9.8%** | -| **E2 (质量加权)** | 132,009 | 140,194 | +8,184 | **+6.2%** | -| F1 (Gini系数) | 0.313 | 0.320 | +0.007 | +2.4% | -| F2 (最低满足率) | 2.00 | 2.00 | 0.00 | 0.0% | +|---|---|---|---|---| +| **E1 (总服务量)** | 139,469 | 153,307 | +13,838 | **+9.9%** | +| **E2 (质量加权)** | 131,462 | 139,701 | +8,240 | **+6.3%** | +| F1 (Gini系数) | 0.314 | 0.322 | +0.008 | +2.5% | +| F2 (最低满足率) | 2.000 | 2.000 | -0.000 | -0.0% | | **R1 (缺口风险)** | 0 | 0.012 | +0.012 | 新增 | -| **RS (资源节省)** | 0% | 9.5% | +9.5% | 新增 | +| **RS (资源节省)** | 0% | 9.6% | +9.6% | 新增 | **核心发现**: 1. 通过双站点模式,释放9.5%的访问槽位 @@ -570,11 +575,11 @@ $$R_1 = P(S_i / D_i < 0.8 \text{ 或 } S_j / D_j < 0.8)$$ **总体汇总(范围为扫描区间的最小值~最大值)** | 参数 | 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 | +|---|---|---|---| +| $r_{merge}$ | 143252 - 180189 (+22.69%) | 132637 - 142734 (+7.30%) | 0.1708 - 0.1708 | +| $l_{max}$ | 158014 - 162762 (+2.92%) | 137158 - 138424 (+0.92%) | 0.1447 - 0.1796 | +| $\mu_{sum,max}$ | 160273 - 163268 (+1.84%) | 135569 - 143460 (+5.71%) | 0.0262 - 0.2090 | +| $CV_{max}$ | 141014 - 162936 (+13.47%) | 132611 - 138445 (+4.22%) | 0.0000 - 0.1810 | **1. 合并比例 $r_{merge}$ — 影响 E1/E2 的主导参数** @@ -726,7 +731,7 @@ $$R_1 = P(S_i / D_i < 0.8 \text{ 或 } S_j / D_j < 0.8)$$ ### 10.1 主要发现 -1. **配对收益**:双站点模式可节省9.5%的访问槽位,服务量提升9.8% +1. **配对收益**:双站点模式可节省9.6%的访问槽位,服务量提升9.9% 2. **分配策略**:最优分配量 $q^*$ 与两站点需求波动性成反比——波动大的站点需要更多"缓冲" 3. **风险可控**:通过合理的配对选择和鲁棒性约束,服务缺口风险控制在1.2%以内 4. **参数敏感性分工明确**:合并比例主导 E1/E2;容量上限与CV阈值主导风险与E2;距离阈值快速进入平台期 diff --git a/task3/fig1_points.js b/task3/fig1_points.js index 175f19c..dae3ffb 100644 --- a/task3/fig1_points.js +++ b/task3/fig1_points.js @@ -1,4 +1,4 @@ // Auto-generated from `task3/01_distance.xlsx` (sites) + `task3/02_pairing.xlsx` (selected_pairs) // Usage: open `task3/fig1_carto.html` in a browser (same directory must contain this file). -window.FIG1_POINTS = [{"site_id":1,"site_name":"MFP American Legion - Binghamton","lat":42.108036,"lng":-75.887779,"mu":200.1818181818182,"sigma":46.0669473306365,"k":14,"is_paired":true},{"site_id":2,"site_name":"MFP Avoca","lat":42.4174468,"lng":-77.4358433,"mu":314.5833333333333,"sigma":57.3497377870416,"k":24,"is_paired":true},{"site_id":3,"site_name":"MFP Bath","lat":42.3362172,"lng":-77.3175047,"mu":279.4545454545454,"sigma":45.2534277958336,"k":19,"is_paired":true},{"site_id":4,"site_name":"MFP Beaver Dams","lat":42.2606415,"lng":-76.9559856,"mu":170.7,"sigma":28.7906234736241,"k":12,"is_paired":true},{"site_id":5,"site_name":"MFP Birnie Transportation Services","lat":42.172309,"lng":-77.1101217,"mu":213.375,"sigma":53.4039525021991,"k":15,"is_paired":true},{"site_id":6,"site_name":"MFP Boys and Girls Club","lat":42.1053841,"lng":-75.9213736,"mu":210.8,"sigma":52.3551971313896,"k":15,"is_paired":true},{"site_id":7,"site_name":"MFP Bradford","lat":42.3691309,"lng":-77.1081064,"mu":122.2727272727273,"sigma":29.7425315300864,"k":9,"is_paired":true},{"site_id":8,"site_name":"MFP Campbell","lat":42.2314129,"lng":-77.1948265,"mu":168.5,"sigma":40.968946111104,"k":12,"is_paired":true},{"site_id":9,"site_name":"MFP Canisteo","lat":42.272779,"lng":-77.606849,"mu":177.0,"sigma":51.3051870888531,"k":13,"is_paired":true},{"site_id":10,"site_name":"MFP Colesville","lat":42.1841905,"lng":-75.6329193,"mu":197.3333333333333,"sigma":66.2589044902074,"k":14,"is_paired":false},{"site_id":11,"site_name":"MFP College Corning Community College","lat":42.1172594,"lng":-77.0735445,"mu":251.0,"sigma":33.2505639049926,"k":17,"is_paired":true},{"site_id":12,"site_name":"MFP College Ithaca College","lat":42.4199351,"lng":-76.4969643,"mu":138.3333333333333,"sigma":66.1418929272515,"k":10,"is_paired":false},{"site_id":13,"site_name":"MFP College TC3 -College","lat":42.502126,"lng":-76.287671,"mu":261.5,"sigma":91.9929345112982,"k":19,"is_paired":false},{"site_id":14,"site_name":"MFP Conklin- Maines Community Center","lat":42.0870901,"lng":-75.8309647,"mu":153.1666666666667,"sigma":20.1125620325993,"k":11,"is_paired":true},{"site_id":15,"site_name":"MFP Danby","lat":42.3522565,"lng":-76.4800051,"mu":160.2222222222222,"sigma":34.5788149658782,"k":11,"is_paired":true},{"site_id":16,"site_name":"MFP Deposit","lat":42.0625771,"lng":-75.422248,"mu":156.5833333333333,"sigma":56.545168322378,"k":11,"is_paired":false},{"site_id":17,"site_name":"MFP Endwell United Methodist Church","lat":42.111296,"lng":-76.02203,"mu":285.25,"sigma":60.7814639806937,"k":21,"is_paired":true},{"site_id":18,"site_name":"MFP Erin","lat":42.1788978,"lng":-76.6922607,"mu":173.9090909090909,"sigma":27.3219858189501,"k":12,"is_paired":true},{"site_id":19,"site_name":"MFP First Assembly Of God Church","lat":42.1022814,"lng":-75.9129518,"mu":146.0,"sigma":21.6459108042479,"k":10,"is_paired":true},{"site_id":20,"site_name":"MFP Lamphear Court","lat":42.1598551,"lng":-77.0711389,"mu":126.0,"sigma":40.6803255750109,"k":9,"is_paired":false},{"site_id":21,"site_name":"MFP Lansing","lat":42.5183206,"lng":-76.5035538,"mu":181.0,"sigma":23.2937759927411,"k":13,"is_paired":true},{"site_id":22,"site_name":"MFP Lindley","lat":42.028142,"lng":-77.1392597,"mu":232.9,"sigma":49.6217918078562,"k":16,"is_paired":true},{"site_id":23,"site_name":"MFP Millport","lat":42.267172,"lng":-76.837356,"mu":166.0,"sigma":36.4996194805127,"k":12,"is_paired":true},{"site_id":24,"site_name":"MFP Montour Falls-Schuyler County Human Services Complex","lat":42.3409968,"lng":-76.8412703,"mu":149.3636363636364,"sigma":60.0387753493902,"k":11,"is_paired":false},{"site_id":25,"site_name":"MFP Nichols-The Creamery","lat":42.02302,"lng":-76.371793,"mu":122.4,"sigma":26.4253666010521,"k":9,"is_paired":true},{"site_id":26,"site_name":"MFP Owego VFW","lat":42.1043411,"lng":-76.2615965,"mu":176.25,"sigma":34.285234033433,"k":12,"is_paired":true},{"site_id":27,"site_name":"MFP Prattsburgh","lat":42.5272099,"lng":-77.2866,"mu":144.5,"sigma":50.8428952755446,"k":10,"is_paired":false},{"site_id":28,"site_name":"MFP Rathbone","lat":42.1306252,"lng":-77.3197915,"mu":269.0909090909091,"sigma":55.5687943821972,"k":19,"is_paired":true},{"site_id":29,"site_name":"MFP Reach for Christ Church Freeville","lat":42.4919905,"lng":-76.3443272,"mu":220.0,"sigma":22.6175939382498,"k":15,"is_paired":true},{"site_id":30,"site_name":"MFP Redeemer Lutheran Church","lat":42.1000047,"lng":-75.9224594,"mu":230.6,"sigma":93.4786963252412,"k":17,"is_paired":false},{"site_id":31,"site_name":"MFP Rehoboth Deliverance Ministry","lat":42.318273,"lng":-77.6493618,"mu":235.9,"sigma":56.9530996132393,"k":16,"is_paired":true},{"site_id":32,"site_name":"MFP Richford","lat":42.3551522,"lng":-76.2008963,"mu":265.9090909090909,"sigma":28.7974114998363,"k":18,"is_paired":true},{"site_id":33,"site_name":"MFP Saint Mary Recreation Center","lat":42.0988789,"lng":-75.9041391,"mu":148.3,"sigma":59.8313370140505,"k":11,"is_paired":false},{"site_id":34,"site_name":"MFP Salvation Army Ithaca","lat":42.4398066,"lng":-76.5019869,"mu":181.1818181818182,"sigma":39.5848915163808,"k":13,"is_paired":true},{"site_id":35,"site_name":"MFP Schuyler Outreach","lat":42.3770866,"lng":-76.8698425,"mu":138.8571428571429,"sigma":21.5362374571215,"k":10,"is_paired":true},{"site_id":36,"site_name":"MFP Senior - Addison Place Apartments","lat":42.1001876,"lng":-77.2371924,"mu":30.09090909090909,"sigma":5.02900676982135,"k":3,"is_paired":true},{"site_id":37,"site_name":"MFP Senior - Bragg","lat":42.0896598,"lng":-76.7977954,"mu":66.88888888888889,"sigma":6.03001750504186,"k":5,"is_paired":true},{"site_id":38,"site_name":"MFP Senior - Carpenter Apartments","lat":42.0930065,"lng":-76.7984317,"mu":31.09090909090909,"sigma":6.75950509215793,"k":3,"is_paired":true},{"site_id":39,"site_name":"MFP Senior - Cayuga Meadows","lat":42.464569,"lng":-76.5409393,"mu":25.88888888888889,"sigma":3.33333333333333,"k":3,"is_paired":true},{"site_id":40,"site_name":"MFP Senior - CFS Lakeview","lat":42.3488781,"lng":-77.3110763,"mu":112.0,"sigma":15.563490039905,"k":8,"is_paired":true},{"site_id":41,"site_name":"MFP Senior - Conifer Village","lat":42.4511294,"lng":-76.5323538,"mu":33.8,"sigma":10.3794669098819,"k":3,"is_paired":false},{"site_id":42,"site_name":"MFP Senior - Corning Senior Center","lat":42.1490255,"lng":-77.0619725,"mu":75.0,"sigma":30.9636884107821,"k":6,"is_paired":false},{"site_id":43,"site_name":"MFP Senior - Dayspring","lat":42.1420715,"lng":-77.0454685,"mu":77.18181818181819,"sigma":17.9489174148091,"k":6,"is_paired":true},{"site_id":44,"site_name":"MFP Senior - East Hill Senior Living","lat":42.1141777,"lng":-75.8720703,"mu":39.83333333333334,"sigma":2.16724933890169,"k":4,"is_paired":true},{"site_id":45,"site_name":"MFP Senior - Elizabeth Square, Waverly","lat":42.001546,"lng":-76.541203,"mu":29.0,"sigma":9.67658842962558,"k":3,"is_paired":false},{"site_id":46,"site_name":"MFP Senior - Ellis Hollow","lat":42.435955,"lng":-76.460374,"mu":24.72727272727273,"sigma":13.8064543536051,"k":3,"is_paired":false},{"site_id":47,"site_name":"MFP Senior - Flannery","lat":42.0819957,"lng":-76.8053269,"mu":61.72727272727273,"sigma":10.1103007778296,"k":5,"is_paired":true},{"site_id":48,"site_name":"MFP Senior - Harry L Apartments","lat":42.1237339,"lng":-75.9567565,"mu":32.83333333333334,"sigma":6.24232862533419,"k":3,"is_paired":true},{"site_id":49,"site_name":"MFP Senior - Jefferson Village","lat":42.3829923,"lng":-76.8713304,"mu":24.81818181818182,"sigma":2.78633026822672,"k":3,"is_paired":true},{"site_id":50,"site_name":"MFP Senior - Lincoln Court","lat":42.090217,"lng":-75.910198,"mu":26.0,"sigma":4.89897948556636,"k":3,"is_paired":true},{"site_id":51,"site_name":"MFP Senior - Long Meadow Senior Housing","lat":42.1135325,"lng":-76.2704045,"mu":34.75,"sigma":13.0043698949098,"k":3,"is_paired":false},{"site_id":52,"site_name":"MFP Senior - Metro Plaza Apartments","lat":42.1016977,"lng":-75.9085338,"mu":56.3,"sigma":19.9167712689024,"k":5,"is_paired":false},{"site_id":53,"site_name":"MFP Senior - North Shore Towers","lat":42.0966132,"lng":-75.9103884,"mu":58.33333333333334,"sigma":6.86051504383355,"k":5,"is_paired":true},{"site_id":54,"site_name":"MFP Senior - Northern Broome Senior Center, Whitney Point","lat":42.3269618,"lng":-75.9677778,"mu":50.90909090909091,"sigma":21.9565687002981,"k":4,"is_paired":false},{"site_id":55,"site_name":"MFP Senior - Park Terrace Congregate Apartments","lat":42.051364,"lng":-76.832954,"mu":24.36363636363636,"sigma":4.41073071662117,"k":3,"is_paired":true},{"site_id":56,"site_name":"MFP Senior - Springview Apartments","lat":42.0100399,"lng":-76.533895,"mu":27.58333333333333,"sigma":9.31722094084958,"k":3,"is_paired":false},{"site_id":57,"site_name":"MFP Senior - Titus Towers","lat":42.4317058,"lng":-76.504801,"mu":72.8,"sigma":4.31534728871525,"k":6,"is_paired":true},{"site_id":58,"site_name":"MFP Senior - Villa Serene","lat":42.1295916,"lng":-76.8158267,"mu":69.72727272727273,"sigma":5.0614406860282,"k":6,"is_paired":true},{"site_id":59,"site_name":"MFP Senior - Village Square/Manor","lat":42.159804,"lng":-77.09139,"mu":34.25,"sigma":6.48249390842192,"k":3,"is_paired":true},{"site_id":60,"site_name":"MFP Senior - Wells Apartments","lat":42.1076045,"lng":-75.9607932,"mu":23.5,"sigma":4.55216676124922,"k":3,"is_paired":false},{"site_id":61,"site_name":"MFP Senior - Woodsedge Apartments","lat":42.535151,"lng":-76.501086,"mu":17.2,"sigma":4.23739962188552,"k":2,"is_paired":true},{"site_id":62,"site_name":"MFP The Love Church","lat":42.1412225,"lng":-76.8137998,"mu":259.3333333333333,"sigma":59.8913157057824,"k":18,"is_paired":true},{"site_id":63,"site_name":"MFP Troupsburg","lat":42.0432505,"lng":-77.5456383,"mu":148.7142857142857,"sigma":50.2484304422015,"k":11,"is_paired":false},{"site_id":64,"site_name":"MFP Tuscarora","lat":42.0522655,"lng":-77.2737134,"mu":192.6363636363636,"sigma":29.8639338576576,"k":14,"is_paired":true},{"site_id":65,"site_name":"MFP Van Etten","lat":42.2080409,"lng":-76.579406,"mu":213.7,"sigma":19.9613515463145,"k":15,"is_paired":true},{"site_id":66,"site_name":"MFP Waverly","lat":42.0194466,"lng":-76.5236008,"mu":396.6363636363636,"sigma":51.8753751355548,"k":35,"is_paired":false},{"site_id":67,"site_name":"MFP Wayland","lat":42.5685797,"lng":-77.5957241,"mu":180.4166666666667,"sigma":35.2638324461179,"k":13,"is_paired":false},{"site_id":68,"site_name":"MFP Whitney Point","lat":42.3405329,"lng":-75.9765268,"mu":202.5454545454545,"sigma":30.4478690103713,"k":14,"is_paired":true},{"site_id":69,"site_name":"MFP Windsor","lat":42.0779615,"lng":-75.6427789,"mu":200.9090909090909,"sigma":34.8954281975578,"k":14,"is_paired":true},{"site_id":70,"site_name":"MFP Woodhull","lat":42.0798397,"lng":-77.4111295,"mu":176.0,"sigma":63.5438288256081,"k":12,"is_paired":false}]; +window.FIG1_POINTS = [{"site_id":1,"site_name":"MFP American Legion - Binghamton","lat":42.108036,"lng":-75.887779,"mu":200.1818181818182,"sigma":46.0669473306365,"k":14,"is_paired":true},{"site_id":2,"site_name":"MFP Avoca","lat":42.4174468,"lng":-77.4358433,"mu":314.5833333333333,"sigma":57.3497377870416,"k":22,"is_paired":true},{"site_id":3,"site_name":"MFP Bath","lat":42.3362172,"lng":-77.3175047,"mu":279.4545454545454,"sigma":45.2534277958336,"k":19,"is_paired":true},{"site_id":4,"site_name":"MFP Beaver Dams","lat":42.2606415,"lng":-76.9559856,"mu":170.7,"sigma":28.7906234736241,"k":12,"is_paired":true},{"site_id":5,"site_name":"MFP Birnie Transportation Services","lat":42.172309,"lng":-77.1101217,"mu":213.375,"sigma":53.4039525021991,"k":15,"is_paired":true},{"site_id":6,"site_name":"MFP Boys and Girls Club","lat":42.1053841,"lng":-75.9213736,"mu":210.8,"sigma":52.3551971313896,"k":15,"is_paired":true},{"site_id":7,"site_name":"MFP Bradford","lat":42.3691309,"lng":-77.1081064,"mu":122.2727272727273,"sigma":29.7425315300864,"k":9,"is_paired":true},{"site_id":8,"site_name":"MFP Campbell","lat":42.2314129,"lng":-77.1948265,"mu":168.5,"sigma":40.968946111104,"k":12,"is_paired":true},{"site_id":9,"site_name":"MFP Canisteo","lat":42.272779,"lng":-77.606849,"mu":177.0,"sigma":51.3051870888531,"k":13,"is_paired":true},{"site_id":10,"site_name":"MFP Colesville","lat":42.1841905,"lng":-75.6329193,"mu":197.3333333333333,"sigma":66.2589044902074,"k":14,"is_paired":false},{"site_id":11,"site_name":"MFP College Corning Community College","lat":42.1172594,"lng":-77.0735445,"mu":251.0,"sigma":33.2505639049926,"k":18,"is_paired":true},{"site_id":12,"site_name":"MFP College Ithaca College","lat":42.4199351,"lng":-76.4969643,"mu":138.3333333333333,"sigma":66.1418929272515,"k":10,"is_paired":false},{"site_id":13,"site_name":"MFP College TC3 -College","lat":42.502126,"lng":-76.287671,"mu":261.5,"sigma":91.9929345112982,"k":19,"is_paired":false},{"site_id":14,"site_name":"MFP Conklin- Maines Community Center","lat":42.0870901,"lng":-75.8309647,"mu":153.1666666666667,"sigma":20.1125620325993,"k":11,"is_paired":true},{"site_id":15,"site_name":"MFP Danby","lat":42.3522565,"lng":-76.4800051,"mu":160.2222222222222,"sigma":34.5788149658782,"k":12,"is_paired":true},{"site_id":16,"site_name":"MFP Deposit","lat":42.0625771,"lng":-75.422248,"mu":156.5833333333333,"sigma":56.545168322378,"k":11,"is_paired":false},{"site_id":17,"site_name":"MFP Endwell United Methodist Church","lat":42.111296,"lng":-76.02203,"mu":285.25,"sigma":60.7814639806937,"k":20,"is_paired":true},{"site_id":18,"site_name":"MFP Erin","lat":42.1788978,"lng":-76.6922607,"mu":173.9090909090909,"sigma":27.3219858189501,"k":13,"is_paired":true},{"site_id":19,"site_name":"MFP First Assembly Of God Church","lat":42.1022814,"lng":-75.9129518,"mu":146.0,"sigma":21.6459108042479,"k":11,"is_paired":true},{"site_id":20,"site_name":"MFP Lamphear Court","lat":42.1598551,"lng":-77.0711389,"mu":126.0,"sigma":40.6803255750109,"k":9,"is_paired":false},{"site_id":21,"site_name":"MFP Lansing","lat":42.5183206,"lng":-76.5035538,"mu":181.0,"sigma":23.2937759927411,"k":13,"is_paired":true},{"site_id":22,"site_name":"MFP Lindley","lat":42.028142,"lng":-77.1392597,"mu":232.9,"sigma":49.6217918078562,"k":16,"is_paired":true},{"site_id":23,"site_name":"MFP Millport","lat":42.267172,"lng":-76.837356,"mu":166.0,"sigma":36.4996194805127,"k":12,"is_paired":true},{"site_id":24,"site_name":"MFP Montour Falls-Schuyler County Human Services Complex","lat":42.3409968,"lng":-76.8412703,"mu":149.3636363636364,"sigma":60.0387753493902,"k":11,"is_paired":false},{"site_id":25,"site_name":"MFP Nichols-The Creamery","lat":42.02302,"lng":-76.371793,"mu":122.4,"sigma":26.4253666010521,"k":9,"is_paired":true},{"site_id":26,"site_name":"MFP Owego VFW","lat":42.1043411,"lng":-76.2615965,"mu":176.25,"sigma":34.285234033433,"k":13,"is_paired":true},{"site_id":27,"site_name":"MFP Prattsburgh","lat":42.5272099,"lng":-77.2866,"mu":144.5,"sigma":50.8428952755446,"k":11,"is_paired":false},{"site_id":28,"site_name":"MFP Rathbone","lat":42.1306252,"lng":-77.3197915,"mu":269.0909090909091,"sigma":55.5687943821972,"k":19,"is_paired":true},{"site_id":29,"site_name":"MFP Reach for Christ Church Freeville","lat":42.4919905,"lng":-76.3443272,"mu":220.0,"sigma":22.6175939382498,"k":16,"is_paired":true},{"site_id":30,"site_name":"MFP Redeemer Lutheran Church","lat":42.1000047,"lng":-75.9224594,"mu":230.6,"sigma":93.4786963252412,"k":16,"is_paired":false},{"site_id":31,"site_name":"MFP Rehoboth Deliverance Ministry","lat":42.318273,"lng":-77.6493618,"mu":235.9,"sigma":56.9530996132393,"k":17,"is_paired":true},{"site_id":32,"site_name":"MFP Richford","lat":42.3551522,"lng":-76.2008963,"mu":265.9090909090909,"sigma":28.7974114998363,"k":19,"is_paired":true},{"site_id":33,"site_name":"MFP Saint Mary Recreation Center","lat":42.0988789,"lng":-75.9041391,"mu":148.3,"sigma":59.8313370140505,"k":11,"is_paired":false},{"site_id":34,"site_name":"MFP Salvation Army Ithaca","lat":42.4398066,"lng":-76.5019869,"mu":181.1818181818182,"sigma":39.5848915163808,"k":13,"is_paired":true},{"site_id":35,"site_name":"MFP Schuyler Outreach","lat":42.3770866,"lng":-76.8698425,"mu":138.8571428571429,"sigma":21.5362374571215,"k":10,"is_paired":true},{"site_id":36,"site_name":"MFP Senior - Addison Place Apartments","lat":42.1001876,"lng":-77.2371924,"mu":30.09090909090909,"sigma":5.02900676982135,"k":3,"is_paired":true},{"site_id":37,"site_name":"MFP Senior - Bragg","lat":42.0896598,"lng":-76.7977954,"mu":66.88888888888889,"sigma":6.03001750504186,"k":5,"is_paired":true},{"site_id":38,"site_name":"MFP Senior - Carpenter Apartments","lat":42.0930065,"lng":-76.7984317,"mu":31.09090909090909,"sigma":6.75950509215793,"k":3,"is_paired":true},{"site_id":39,"site_name":"MFP Senior - Cayuga Meadows","lat":42.464569,"lng":-76.5409393,"mu":25.88888888888889,"sigma":3.33333333333333,"k":3,"is_paired":true},{"site_id":40,"site_name":"MFP Senior - CFS Lakeview","lat":42.3488781,"lng":-77.3110763,"mu":112.0,"sigma":15.563490039905,"k":8,"is_paired":true},{"site_id":41,"site_name":"MFP Senior - Conifer Village","lat":42.4511294,"lng":-76.5323538,"mu":33.8,"sigma":10.3794669098819,"k":3,"is_paired":false},{"site_id":42,"site_name":"MFP Senior - Corning Senior Center","lat":42.1490255,"lng":-77.0619725,"mu":75.0,"sigma":30.9636884107821,"k":6,"is_paired":false},{"site_id":43,"site_name":"MFP Senior - Dayspring","lat":42.1420715,"lng":-77.0454685,"mu":77.18181818181819,"sigma":17.9489174148091,"k":6,"is_paired":true},{"site_id":44,"site_name":"MFP Senior - East Hill Senior Living","lat":42.1141777,"lng":-75.8720703,"mu":39.83333333333334,"sigma":2.16724933890169,"k":4,"is_paired":true},{"site_id":45,"site_name":"MFP Senior - Elizabeth Square, Waverly","lat":42.001546,"lng":-76.541203,"mu":29.0,"sigma":9.67658842962558,"k":3,"is_paired":false},{"site_id":46,"site_name":"MFP Senior - Ellis Hollow","lat":42.435955,"lng":-76.460374,"mu":24.72727272727273,"sigma":13.8064543536051,"k":3,"is_paired":false},{"site_id":47,"site_name":"MFP Senior - Flannery","lat":42.0819957,"lng":-76.8053269,"mu":61.72727272727273,"sigma":10.1103007778296,"k":5,"is_paired":true},{"site_id":48,"site_name":"MFP Senior - Harry L Apartments","lat":42.1237339,"lng":-75.9567565,"mu":32.83333333333334,"sigma":6.24232862533419,"k":3,"is_paired":true},{"site_id":49,"site_name":"MFP Senior - Jefferson Village","lat":42.3829923,"lng":-76.8713304,"mu":24.81818181818182,"sigma":2.78633026822672,"k":3,"is_paired":true},{"site_id":50,"site_name":"MFP Senior - Lincoln Court","lat":42.090217,"lng":-75.910198,"mu":26.0,"sigma":4.89897948556636,"k":3,"is_paired":true},{"site_id":51,"site_name":"MFP Senior - Long Meadow Senior Housing","lat":42.1135325,"lng":-76.2704045,"mu":34.75,"sigma":13.0043698949098,"k":3,"is_paired":false},{"site_id":52,"site_name":"MFP Senior - Metro Plaza Apartments","lat":42.1016977,"lng":-75.9085338,"mu":56.3,"sigma":19.9167712689024,"k":5,"is_paired":false},{"site_id":53,"site_name":"MFP Senior - North Shore Towers","lat":42.0966132,"lng":-75.9103884,"mu":58.33333333333334,"sigma":6.86051504383355,"k":5,"is_paired":true},{"site_id":54,"site_name":"MFP Senior - Northern Broome Senior Center, Whitney Point","lat":42.3269618,"lng":-75.9677778,"mu":50.90909090909091,"sigma":21.9565687002981,"k":4,"is_paired":false},{"site_id":55,"site_name":"MFP Senior - Park Terrace Congregate Apartments","lat":42.051364,"lng":-76.832954,"mu":24.36363636363636,"sigma":4.41073071662117,"k":3,"is_paired":true},{"site_id":56,"site_name":"MFP Senior - Springview Apartments","lat":42.0100399,"lng":-76.533895,"mu":27.58333333333333,"sigma":9.31722094084958,"k":3,"is_paired":false},{"site_id":57,"site_name":"MFP Senior - Titus Towers","lat":42.4317058,"lng":-76.504801,"mu":72.8,"sigma":4.31534728871525,"k":6,"is_paired":true},{"site_id":58,"site_name":"MFP Senior - Villa Serene","lat":42.1295916,"lng":-76.8158267,"mu":69.72727272727273,"sigma":5.0614406860282,"k":6,"is_paired":true},{"site_id":59,"site_name":"MFP Senior - Village Square/Manor","lat":42.159804,"lng":-77.09139,"mu":34.25,"sigma":6.48249390842192,"k":3,"is_paired":true},{"site_id":60,"site_name":"MFP Senior - Wells Apartments","lat":42.1076045,"lng":-75.9607932,"mu":23.5,"sigma":4.55216676124922,"k":3,"is_paired":false},{"site_id":61,"site_name":"MFP Senior - Woodsedge Apartments","lat":42.535151,"lng":-76.501086,"mu":17.2,"sigma":4.23739962188552,"k":2,"is_paired":true},{"site_id":62,"site_name":"MFP The Love Church","lat":42.1412225,"lng":-76.8137998,"mu":259.3333333333333,"sigma":59.8913157057824,"k":18,"is_paired":true},{"site_id":63,"site_name":"MFP Troupsburg","lat":42.0432505,"lng":-77.5456383,"mu":148.7142857142857,"sigma":50.2484304422015,"k":11,"is_paired":false},{"site_id":64,"site_name":"MFP Tuscarora","lat":42.0522655,"lng":-77.2737134,"mu":192.6363636363636,"sigma":29.8639338576576,"k":14,"is_paired":true},{"site_id":65,"site_name":"MFP Van Etten","lat":42.2080409,"lng":-76.579406,"mu":213.7,"sigma":19.9613515463145,"k":15,"is_paired":true},{"site_id":66,"site_name":"MFP Waverly","lat":42.0194466,"lng":-76.5236008,"mu":396.6363636363636,"sigma":51.8753751355548,"k":29,"is_paired":false},{"site_id":67,"site_name":"MFP Wayland","lat":42.5685797,"lng":-77.5957241,"mu":180.4166666666667,"sigma":35.2638324461179,"k":13,"is_paired":false},{"site_id":68,"site_name":"MFP Whitney Point","lat":42.3405329,"lng":-75.9765268,"mu":202.5454545454545,"sigma":30.4478690103713,"k":14,"is_paired":true},{"site_id":69,"site_name":"MFP Windsor","lat":42.0779615,"lng":-75.6427789,"mu":200.9090909090909,"sigma":34.8954281975578,"k":14,"is_paired":true},{"site_id":70,"site_name":"MFP Woodhull","lat":42.0798397,"lng":-77.4111295,"mu":176.0,"sigma":63.5438288256081,"k":13,"is_paired":false}]; window.FIG1_LINKS = [{"site_i_id":1,"site_j_id":19,"site_i_name":"MFP American Legion - Binghamton","site_j_name":"MFP First Assembly Of God Church","distance":1.348436821527424},{"site_i_id":58,"site_j_id":62,"site_i_name":"MFP Senior - Villa Serene","site_j_name":"MFP The Love Church","distance":0.8092057380985171},{"site_i_id":11,"site_j_id":43,"site_i_name":"MFP College Corning Community College","site_j_name":"MFP Senior - Dayspring","distance":2.2349978091056},{"site_i_id":17,"site_j_id":53,"site_i_name":"MFP Endwell United Methodist Church","site_j_name":"MFP Senior - North Shore Towers","distance":5.804383712418112},{"site_i_id":15,"site_j_id":34,"site_i_name":"MFP Danby","site_j_name":"MFP Salvation Army Ithaca","distance":6.143925955556406},{"site_i_id":4,"site_j_id":23,"site_i_name":"MFP Beaver Dams","site_j_name":"MFP Millport","distance":6.074412981852127},{"site_i_id":5,"site_j_id":7,"site_i_name":"MFP Birnie Transportation Services","site_j_name":"MFP Bradford","distance":13.58110090990046},{"site_i_id":31,"site_j_id":40,"site_i_name":"MFP Rehoboth Deliverance Ministry","site_j_name":"MFP Senior - CFS Lakeview","distance":17.38378084014594},{"site_i_id":32,"site_j_id":57,"site_i_name":"MFP Richford","site_j_name":"MFP Senior - Titus Towers","distance":16.36265720561532},{"site_i_id":28,"site_j_id":36,"site_i_name":"MFP Rathbone","site_j_name":"MFP Senior - Addison Place Apartments","distance":4.720660032776843},{"site_i_id":25,"site_j_id":65,"site_i_name":"MFP Nichols-The Creamery","site_j_name":"MFP Van Etten","distance":16.61032388714411},{"site_i_id":8,"site_j_id":9,"site_i_name":"MFP Campbell","site_j_name":"MFP Canisteo","distance":21.23606041594513},{"site_i_id":2,"site_j_id":59,"site_i_name":"MFP Avoca","site_j_name":"MFP Senior - Village Square/Manor","distance":25.00335559264166},{"site_i_id":18,"site_j_id":35,"site_i_name":"MFP Erin","site_j_name":"MFP Schuyler Outreach","distance":16.40726185975893},{"site_i_id":14,"site_j_id":26,"site_i_name":"MFP Conklin- Maines Community Center","site_j_name":"MFP Owego VFW","distance":22.08036608633093},{"site_i_id":6,"site_j_id":44,"site_i_name":"MFP Boys and Girls Club","site_j_name":"MFP Senior - East Hill Senior Living","distance":2.595672199467672},{"site_i_id":22,"site_j_id":37,"site_i_name":"MFP Lindley","site_j_name":"MFP Senior - Bragg","distance":18.00067727329831},{"site_i_id":3,"site_j_id":49,"site_i_name":"MFP Bath","site_j_name":"MFP Senior - Jefferson Village","distance":22.97654515986252},{"site_i_id":29,"site_j_id":39,"site_i_name":"MFP Reach for Christ Church Freeville","site_j_name":"MFP Senior - Cayuga Meadows","distance":10.18287955207643},{"site_i_id":21,"site_j_id":61,"site_i_name":"MFP Lansing","site_j_name":"MFP Senior - Woodsedge Apartments","distance":1.168058001763275},{"site_i_id":48,"site_j_id":68,"site_i_name":"MFP Senior - Harry L Apartments","site_j_name":"MFP Whitney Point","distance":14.99319217055408},{"site_i_id":50,"site_j_id":69,"site_i_name":"MFP Senior - Lincoln Court","site_j_name":"MFP Windsor","distance":13.72039618876427},{"site_i_id":47,"site_j_id":64,"site_i_name":"MFP Senior - Flannery","site_j_name":"MFP Tuscarora","distance":24.07963686909654},{"site_i_id":38,"site_j_id":55,"site_i_name":"MFP Senior - Carpenter Apartments","site_j_name":"MFP Senior - Park Terrace Congregate Apartments","distance":3.373801467242223}]; diff --git a/task3/figures/fig3_sensitivity.png b/task3/figures/fig3_sensitivity.png index 54c15ed..af03054 100644 Binary files a/task3/figures/fig3_sensitivity.png and b/task3/figures/fig3_sensitivity.png differ diff --git a/task3/figures/fig4_calendar_heatmap.png b/task3/figures/fig4_calendar_heatmap.png index 02be6bd..a05d4c1 100644 Binary files a/task3/figures/fig4_calendar_heatmap.png and b/task3/figures/fig4_calendar_heatmap.png differ diff --git a/task3/generate_readme_tables.py b/task3/generate_readme_tables.py new file mode 100644 index 0000000..c041dfc --- /dev/null +++ b/task3/generate_readme_tables.py @@ -0,0 +1,162 @@ + +import pandas as pd +import numpy as np + +def format_table_1_pairings(): + try: + df = pd.read_excel('02_pairing.xlsx', sheet_name='selected_pairs') + df = df.sort_values('value', ascending=False).head(10) + + print("\n### Top 10 High Value Pairings") + print("| 排名 | 站点i (Site i) | 站点j (Site j) | 距离 (mi) | 需求和 (μ_sum) | 价值 (V_ij) |") + print("|---|---|---|---|---|---|") + + for idx, row in df.iterrows(): + rank = idx + 1 # Assuming index resets or we just use counter. Actually index might not be 0-based if sorted. + # But wait, df is from read_excel, default index 0..N. + # If I sorted it, index is shuffled. + # I should use a counter. + pass + + for i, (idx, row) in enumerate(df.iterrows()): + rank = i + 1 + site_i = row['site_i_name'].replace('MFP ', '') + site_j = row['site_j_name'].replace('MFP ', '') + dist = f"{row['distance']:.1f} mi" + mu_sum = f"{row['mu_sum']:.0f}" + val = f"{row['value']:.2f}" + print(f"| {rank} | {site_i} | {site_j} | {dist} | {mu_sum} | {val} |") + except Exception as e: + print(f"Error generating Table 1: {e}") + +def format_table_2_allocation(): + try: + df = pd.read_excel('03_allocation.xlsx', sheet_name='allocation') + df = df.sort_values('value', ascending=False).head(5) + + print("\n### Top 5 Pairings' Optimal Allocation Strategies") + print("| 配对 | μ_i | μ_j | σ_i | σ_j | q* | 比例 |") + print("|---|---|---|---|---|---|---|") + + for _, row in df.iterrows(): + name_i = row['site_i_name'].replace('MFP ', '').split(' - ')[0] + name_j = row['site_j_name'].replace('MFP ', '').split(' - ')[0] + # If still too long, take first 15 chars + if len(name_i) > 15: name_i = name_i[:12] + "..." + if len(name_j) > 15: name_j = name_j[:12] + "..." + + pair = f"{name_i} + {name_j}" + mu_i = f"{row['mu_i']:.1f}" + mu_j = f"{row['mu_j']:.1f}" + sigma_i = f"{row['sigma_i']:.1f}" + sigma_j = f"{row['sigma_j']:.1f}" + q_star = f"{row['q_final']:.1f}" + ratio = f"{row['q_ratio']:.1%}" + print(f"| {pair} | {mu_i} | {mu_j} | {sigma_i} | {sigma_j} | {q_star} | {ratio} |") + except Exception as e: + print(f"Error generating Table 2: {e}") + +def format_table_3_comparison(): + try: + df = pd.read_excel('06_evaluate.xlsx', sheet_name='comparison') + # The structure is Metric, Task 1, Task 3, Change, Change % + + print("\n### Actual Result Comparison Analysis") + print("| 指标 | Task 1 | Task 3 | 变化 | 变化% |") + print("|---|---|---|---|---|") + + for _, row in df.iterrows(): + metric = row['Metric'] + # Bold important metrics + if 'E1' in metric or 'E2' in metric or 'RS' in metric or 'R1' in metric: + metric = f"**{metric}**" + + task1 = row['Task 1'] + task3 = row['Task 3'] + change = row['Change'] + change_pct = row['Change %'] + + # Format numbers + if 'Gini' in row['Metric'] or '最低' in row['Metric'] or '风险' in row['Metric']: + t1_str = f"{task1:.3f}" if isinstance(task1, (int, float)) else task1 + t3_str = f"{task3:.3f}" if isinstance(task3, (int, float)) else task3 + ch_str = f"{change:+.3f}" if isinstance(change, (int, float)) else change + else: + t1_str = f"{task1:,.0f}" if isinstance(task1, (int, float)) else task1 + t3_str = f"{task3:,.0f}" if isinstance(task3, (int, float)) else task3 + ch_str = f"{change:+,.0f}" if isinstance(change, (int, float)) else change + + if '风险' in row['Metric'] and task1 == 0: + pct_str = "新增" + elif '节省' in row['Metric'] and task1 == 0: + pct_str = "新增" + else: + pct_str = f"{change_pct:+.1f}%" if isinstance(change_pct, (int, float)) else change_pct + + # Bold significant improvements + if isinstance(change_pct, (int, float)) and change_pct > 5: + pct_str = f"**{pct_str}**" + + print(f"| {metric} | {t1_str} | {t3_str} | {ch_str} | {pct_str} |") + + # Add R1 and RS from task3_metrics sheet + try: + metrics_df = pd.read_excel('06_evaluate.xlsx', sheet_name='task3_metrics') + r1_val = metrics_df.loc[metrics_df['metric']=='R1', 'value'].values[0] + rs_val = metrics_df.loc[metrics_df['metric']=='RS', 'value'].values[0] # Note: stored as RS/100 (e.g. 0.095) + visits_val = metrics_df.loc[metrics_df['metric']=='total_dual_visits', 'value'].values[0] + + print(f"\nTotal Dual Visits: {visits_val}") + + # Format R1 + # Task 1 R1 is 0 + print(f"| **R1 (缺口风险)** | 0 | {r1_val:.3f} | +{r1_val:.3f} | 新增 |") + + # Format RS + # Task 1 RS is 0% + rs_pct = rs_val * 100 + print(f"| **RS (资源节省)** | 0% | {rs_pct:.1f}% | +{rs_pct:.1f}% | 新增 |") + + except Exception as e2: + print(f"Error adding R1/RS: {e2}") + + except Exception as e: + print(f"Error generating Table 3: {e}") + +def format_table_4_sensitivity(): + try: + df = pd.read_excel('07_sensitivity.xlsx', sheet_name='summary') + + print("\n### Sensitivity Analysis Results") + print("| 参数 | E1范围 | E2范围 | R1范围 |") + print("|---|---|---|---|") + + for _, row in df.iterrows(): + param = row['Parameter'] + e1_range = row['E1_Range'] + e2_range = row['E2_Range'] + r1_range = row['R1_Range'] + + # Add variable percentage if available + e1_var = row['E1_Var%'] + e2_var = row['E2_Var%'] + + e1_str = f"{e1_range} ({e1_var:+.2f}%)" if pd.notnull(e1_var) else e1_range + e2_str = f"{e2_range} ({e2_var:+.2f}%)" if pd.notnull(e2_var) else e2_range + + # Map param names to symbols + if param == 'merge_ratio': param = '$r_{merge}$' + elif param == 'l_max': param = '$l_{max}$' + elif param == 'mu_sum_max': param = '$\mu_{sum,max}$' + elif param == 'cv_max': param = '$CV_{max}$' + + print(f"| {param} | {e1_str} | {e2_str} | {r1_range} |") + + except Exception as e: + print(f"Error generating Table 4: {e}") + +if __name__ == "__main__": + format_table_1_pairings() + format_table_2_allocation() + format_table_3_comparison() + format_table_4_sensitivity()