本项目针对吉林市主城区电动汽车(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% 的系统耗时下降
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 用)
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 项目根)。
采用项目设施成本视角(政府/公共基础设施),不计入用户支付的电度电费(pass-through)与服务费(转移支付):
其中:
-
站级固定项
$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$ 互为换算。
-
$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$ 的总到达率
- 最小规模:$c_j \ge n_{min} \cdot x_j = 5x_j`(单站至少 5 桩)
-
服务强度:$\rho_j < 1$;违反时优先启发式修复(把
$c_j$ 推到稳态边界),修复后仍不可行才赋予$10^{15}$ 惩罚
主版本: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)。
- 改参数:
config.py是单一信息源,所有经济/技术常量都在那里;改完python src/data_standardization.py重生成 candidate 表,然后重跑solver.py。 - 改算法:
src/nsga2_custom.py含交叉/变异/选择算子;src/objectives.py有evaluate(给 pymoo 用)和evaluate_detailed(给大屏/分析用),两者的 demand-assignment + repair 逻辑必须保持一致。 - 加新指标:在
evaluate_detailed里追加返回字典字段,大屏app.py的enrich_with_capex会自动消费。 - AMap key:
config.py里的是用户自己的 key,不要替换。