字数 1945,阅读大约需 10 分钟
1. 项目核心目标
一句话总结:使用贝叶斯优化(Bayesian Optimization)自动优化粗粒度(Coarse-Grained, CG)分子动力学模型的力场参数,使其在密度(ρ)、回转半径(Rg)和玻璃化转变温度(Tg)三个物理性质上与原子级参考数据匹配。
2. 采用的主要算法/方法/技术栈
| | |
|---|
| 优化算法 | | |
| 分子动力学引擎 | | |
| 力场类型 | | |
| 数据分析 | scikit-learn LinearRegression | |
| 参数注入 | | |
| 目标函数设计 | | |
3. 整体代码目录结构
bo_cgff/├── bo_cg_search.py # 主优化脚本(211行)- 核心入口├── utils.py # 工具函数(17行)- Rg和均值计算├── requirements.txt # Python依赖├── parameters_search.dat # LAMMPS参数模板(含占位符)├── input.dat # LAMMPS主模拟输入脚本├── input_vaccum.dat # LAMMPS真空参考模拟输入├── structure.dat # 分子结构文件├── parameters.dat # 初始参数值├── README.md # 项目文档│├── Atomistic_PEBAX_50chains/ # 原子级参考数据│ ├── input.dat│ ├── structure.dat│ ├── parameters.dat│ └── README.md│└── optimal_parameters_simulation/ # 优化结果验证 ├── get_mean.py # 计算平均值工具 ├── input.dat ├── structure.dat ├── parameters.dat │ └── Rg_vaccum/ # 真空Rg计算 ├── get_rg.py # 提取回转半径 └── get_mean.py
4. 最核心的执行流程 / Pipeline
详细步骤:
- 1. 初始化:创建Optuna Study,配置TPE采样器,SQLite持久化存储
- 2. 参数生成(
new_parameters):定义37维搜索空间(6键+14角+5σ+5ε+5γ+6键长),使用suggest_float采样 - 3. 参数注入:复制模板文件→使用sed批量替换37个占位符→生成
parameters_search_aux.dat - • 密度:读取
2.28-2.31和2.39-2.42共8个温度点的平均值文件 - • Rg:读取
2.28-2.42共15个链的回转半径
- • 密度误差:低温区(150-225K)和高温区(425-500K)线性插值后比较
- • 斜率惩罚:
(a_sim - a_target)² / a_target²,反映Tg准确性 - • Rg误差:15个链的相对误差平方和,权重因子
2×len(density_range)/len(rg_chains)
- 7. 迭代优化:Optuna根据历史结果更新代理模型,指导下一次采样
- 8. 结果保存:最优参数保存至SQLite数据库,支持中断恢复
5. 关键类的职责或主要函数的作用
| | | |
|---|
new_parameters(trial) | | 参数空间定义与注入 | 37个suggest_float调用,6类参数(bond_k, angle_k/theta, sigma, epsilon, gamma_r, bond_l),使用sed进行37次占位符替换 |
objective(trial) | | 目标函数计算 | 调用LAMMPS→解析输出→计算三项目标→返回标量损失 |
get_mean(filename) | | 密度数据读取 | np.loadtxt |
get_rg() | | 回转半径提取 | 遍历15个文件(2.28-2.42),跳过前5行取均值 |
LinearRegression | | Tg提取 | |
optuna.create_study() | | 优化器管理 | TPE采样、SQLite持久化、load_if_exists支持断点续跑 |
subprocess.run(sed...) | | 模板渲染 | 37个sed命令顺序执行,替换parameters_search_aux.dat |
6. 参数/配置/搜索空间的组织
搜索空间维度:37维连续参数
| | | | |
|---|
| 键力常数 | | bond_tX_tY_k | | |
| 角力常数 | | angle_tX_tY_tZ_k | | |
| 平衡角 | | angle_tX_tY_tZ_theta | | |
| Mie σ | | sigma_tN | | |
| Mie ε | | epsilon_tN | | |
| Mie γ | | gamma_r_tN | | |
| 键平衡长度 | | l_tXtY | | |
配置组织方式:
- • 模板文件:
parameters_search.dat使用占位符(如k_bond_t1t2, sigma_t1) - • 运行时生成:每次trial复制模板→sed替换→生成
parameters_search_aux.dat - • 硬编码目标值:密度参考值直接写在代码中(y_1=[1.2344, 1.2288, 1.2187, 1.2115])
- • 原子级Rg参考:15个链的Rg值硬编码在
objective()函数中
7. 设计亮点与取舍
亮点
- • 使用sed进行参数替换而非Python字符串操作,保持LAMMPS文件格式完整性
- • 37个参数通过命名占位符管理,可读性强于索引数组
- • 密度误差和Rg误差通过
2×len(density_range)/len(rg_chains)因子平衡量级 - • 斜率惩罚项直接关联Tg物理意义,避免单独优化Tg点
- •
load_if_exists=True + SQLite持久化,支持3000次trial的长期运行中断恢复
取舍
- • 目标密度值、Rg参考值、温度点全部硬编码,修改需改源码
- • 每次trial阻塞等待LAMMPS完成(~3分钟×3000次≈150小时)
- • 取舍原因:实现简单,但未利用Optuna的异步优化能力
- • 37维同时优化,未采用先优化键/角参数再优化非键参数的分层策略
- • 取舍原因:依赖TPE采样器处理高维空间,但收敛可能较慢
8. 可能的优化方向
- • 将目标值(密度、Rg参考数据)、温度点、权重因子移至YAML/JSON配置文件
- • 使用Optuna的
n_jobs参数或集成Joblib/Dask,同时运行多个trial
- • 集成Optuna的
MedianPruner或HyperbandPruner,在trial中途判断 hopeless 并终止 - • 可节省30-50%计算资源(基于MD模拟中途物理量已明显偏离目标)
- • 分析参数相关性(如相同原子类型的σ/ε可能相关),使用PCA或手动分组减少独立维度
- • 或采用两阶段优化:先粗粒度网格搜索确定大致范围,再BO精细优化
总结:这是一个针对聚合物材料(Pebax)CG模型参数化的专业工具,采用Optuna+LAMMPS的经典组合,代码结构清晰但存在硬编码和串行执行的可优化空间。核心创新在于通过线性回归斜率间接优化Tg,避免了玻璃化转变点的精确定义难题。