Skip to content

ZMGID/ev-charging-optimization

Repository files navigation

面向"碳中和"的电动汽车充电站选址-定容优化模型研究

Research on Location-Capacity Optimization Model for EV Charging Stations

1. 项目简介 (Project Overview)

本项目针对吉林市主城区电动汽车(EV)充电站规划问题,综合运用设施选址理论、排队论(M/M/c)及多目标优化算法(NSGA-II),构建了一个兼顾经济成本用户时间效率的双目标优化模型。

项目包含完整的数据处理、数学建模、算法求解、结果可视化及论文撰写流程。一次模型迭代会输出:

  • 45 个候选站点 / 60 个需求簇 / 日均 6328 次充电请求 规模的 Pareto 前沿(50 代 NSGA-II 收敛后通常给出约 49 个非支配解)
  • 一次性净投资落在 1219-1971 万元、对应年化 LCC 213-341 万元/年 的合理量级,与公开的 DC 快充站行业造价(单桩 1.5-3 万元/桩·年)对得上
  • 推荐的"均衡折中方案"在比成本最低端追加 24% 投入 的代价下能换取 87% 的系统耗时下降

2. 目录结构 (Directory Structure)

dataandmodel/
├── README.md                  # 本文档
├── CLAUDE.md                  # 给 Claude Code/未来维护者的项目导引
├── AGENTS.md                  # 仓库协作约定
├── config.py                  # 全局参数(经济、技术、API)单一信息源
├── app.py                     # Streamlit 交互式大屏(http://localhost:8501)
├── check_api.py               # AMap API key 自检
├── requirements.txt           # 基础依赖
├── src/                       # 源代码
│   ├── data_collection.py         # 高德 API 数据采集
│   ├── data_standardization.py    # POI → 标准化 CSV(含 K-Means 聚类)
│   ├── clustering.py              # 需求点聚类工具
│   ├── od_matrix.py               # OD 距离/时间矩阵生成
│   ├── queueing.py                # M/M/c 排队基础公式
│   ├── objectives.py              # 模型核心:Z1 / Z2 / repair 逻辑
│   ├── optimization_problem.py    # pymoo ElementwiseProblem 包装
│   ├── nsga2_custom.py            # 手写 NSGA-II(交叉/变异/精英)
│   ├── solver.py                  # 求解入口(产出 pareto_solutions.csv)
│   ├── analyze_results.py         # 结果绘图 + 单解拆解
│   └── generate_thesis_plots.py   # 论文用图批量生成
├── data/
│   ├── raw/                       # API 原始采集
│   ├── processed/                 # 清洗 + 聚类后的中间产物
│   └── standardized/              # 模型实际消费的 3 张表
│       ├── Do_demand_table.csv
│       ├── Cj_candidate_table.csv
│       └── Dij_od_table.csv
├── results/
│   ├── pareto_solutions.csv       # 求解器输出的 Pareto 解集(规范产物)
│   └── analysis/
│       ├── pareto_front.png       # 前沿散点图(横轴一次性净投资 万元)
│       ├── spatial_distribution.png
│       ├── mmc_sensitivity.png
│       └── solution_0_breakdown.csv
├── LWBX/                       # 论文主目录
│   ├── 面向"碳中和"…研究.md     # 论文主版本(单一信息源)
│   ├── images/                  # 论文用图(含 pareto_front.png 同名替换)
│   └── 论文word.docx            # 历史 docx 存档(已不再是真相源)
└── images/                     # 项目展示图(README/PPT 用)

3. 快速开始 (Quick Start)

环境依赖

Python 3.8+。requirements.txt 包含基础包,但实际还需要 pymoo / seaborn / folium / streamlit-folium 等:

python -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
pip install pymoo seaborn folium streamlit-folium

如果 .venv/bin/python 出现 broken symlink(Homebrew 升级 Python 后常见),直接 rm -rf .venv 然后重建。

运行步骤

# 0) 自检 AMap API key(可选)
python check_api.py

# 1) 数据准备(首次运行才需要)
python src/data_collection.py
python src/data_standardization.py

# 2) NSGA-II 求解 → 产出 results/pareto_solutions.csv
python src/solver.py

# 3) 结果分析(图表 + Markdown 报告)
python src/analyze_results.py

# 4) 启动交互式大屏
streamlit run app.py

所有脚本须从仓库根目录执行(它们用相对路径 data/standardized/... 读文件,且 sys.path.append 项目根)。

4. 核心模型说明 (Core Model)

4.1 目标函数 1:最小化年化 LCC ($Z_1$)

采用项目设施成本视角(政府/公共基础设施),不计入用户支付的电度电费(pass-through)与服务费(转移支付):

$$ Z_1 = \sum_{j} x_j \cdot \Big[\big(C_g + c_j(C_e + C_v + a \cdot C_l) - S_j\big)\cdot \gamma + c_j \cdot C_e \cdot \theta_m\Big] $$

其中:

  • 站级固定项 $C_g$ = HV 高压侧站内总包(40 万/站,含 1250 kVA 箱变 + 高低压柜 + 站内基础与电缆) + 接入电缆($L_g \times C_{cable}$,典型 200 m × 1000 元/m)
  • 桩级线性项 $c_j(C_e + C_v + a \cdot C_l)$ = 设备 4.55 万 + 土建 1.4 万 + 单桩占地 30 m² × 587 元/m²
  • 建设补贴 $S_j = \min(c_j \cdot 120 \cdot 300,\ 0.5 \cdot c_j \cdot C_e)$,取小,即每桩有效补贴 22 750 元
  • 维护率 $\theta_m = 5%$(含寒区除雪、模块巡检)
  • 资金回收系数 $\gamma = \dfrac{r(1+r)^n}{(1+r)^n - 1} \approx 0.149$,$r=8%$、$n=10$ 年

大屏与论文里同时提供"一次性净投资 = $\sum_j x_j[C_g + c_j(C_e+C_v+aC_l) - S_j]$"作为更直观的展示,与 $Z_1$ 通过 $\gamma$ 互为换算。

4.2 目标函数 2:最小化用户社会总耗时 ($Z_2$)

$$ Z_2 = \sum_{i,j} y_{ij} \cdot (\lambda_i \cdot 24) \cdot \big(t_{ij} + W_j(c_j, \Lambda_j)\big) $$

  • $t_{ij}$:行驶时间(高德 API 返回的实际路况耗时)
  • $W_j$:M/M/c 平均排队等待时间(src/queueing.py)。$\rho_j \ge 1$ 时返回 9999 作为不稳定哨兵
  • $\Lambda_j = \sum_i y_{ij} \lambda_i$:站点 $j$ 的总到达率

4.3 关键约束

  • 最小规模:$c_j \ge n_{min} \cdot x_j = 5x_j`(单站至少 5 桩)
  • 服务强度:$\rho_j < 1$;违反时优先启发式修复(把 $c_j$ 推到稳态边界),修复后仍不可行才赋予 $10^{15}$ 惩罚

5. 论文 (Thesis)

主版本:LWBX/面向"碳中和"的电动汽车充电站选址-定容优化模型研究.md(597 行,单一信息源)。

如需 docx,使用 pandoc 反向导出:

brew install pandoc
pandoc 'LWBX/面向"碳中和"…研究.md' -o 论文.docx --resource-path=LWBX

旧的 LaTeX 工程位于 model/latex/(若存在),用 xelatex → biber → xelatex → xelatex 编译(ctexbook 文类要求 xelatex)。

6. 维护与修改

  • 改参数:config.py 是单一信息源,所有经济/技术常量都在那里;改完 python src/data_standardization.py 重生成 candidate 表,然后重跑 solver.py
  • 改算法:src/nsga2_custom.py 含交叉/变异/选择算子;src/objectives.pyevaluate(给 pymoo 用)和 evaluate_detailed(给大屏/分析用),两者的 demand-assignment + repair 逻辑必须保持一致。
  • 加新指标:在 evaluate_detailed 里追加返回字典字段,大屏 app.pyenrich_with_capex 会自动消费。
  • AMap key:config.py 里的是用户自己的 key,不要替换。

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages