数学建模竞赛中的配方优化:从水系电解液到多目标决策
2026/9/14 15:48:14 网站建设 项目流程

2026认证杯A题的题面发下来那一刻,我们队群里的第一反应不是“难”,而是“这到底算化学还是算数学”。说实话,“水系电解液配方”这六个字,乍一看像材料科学的实验课题,但真正上手之后你会发现,它就是把一个完整的“配方寻优”问题包装在了电化学背景里。无论是离子电导率预测、电化学窗口判断,还是成本约束下的多目标优化,每一问都能用数学建模的办法打穿。这篇文章我是以参赛者的身份来写的,把我们队伍从读题、查文献、建模、优化到拿奖的完整链路复盘一遍。对即将参加认证杯或者其他数学建模竞赛的同学来说,这里面的思路可以直接复用;对想了解配方优化类赛题如何入门的读者,也值得慢慢看。

1. 赛题拆解:这不是化学题,而是一个带约束的多目标优化问题

1.1 题目里真正需要数学建模的地方在哪里

我们拿到的A题给了这么一条主线:水是一种绿色、不可燃的溶剂,水系电解液相比有机电解液更安全、成本也更低,但水的电化学稳定窗口只有约1.23 V,限制了其在高压电池中的应用;同时电解液还需具备高离子电导率、低黏度、低温不结晶、环境友好等特点。题面通常会给一组“盐-溶剂-添加剂”的可选清单,并在后面设置三到四个小问:第一问要求根据已知实验样本建立性能预测模型;第二问要求在给定的组分范围内寻找让电导率最高的配方;第三问会加入成本和电化学窗口两个目标,让你给出综合最优的配方方案;如果有第四问,往往是针对-20℃低温或者高盐浓度的特殊工况进行延伸分析。

如果只看第一问,很多队伍会以为这就是回归拟合。但真正拉开差距的,是把后面几问当成一个整体来设计框架。我见过有队伍第一问用随机森林,第二问用同一批特征网格搜索,第三问才临时上多目标优化,结果三个问的模型口径不统一,最后评委根本看不出你到底有没有理解配方约束。正确做法是:先明确所有小问共享同一个“配方变量空间”,再统一建模。

1.2 水系电解液的“水”到底限制了什么

要建模,先得清楚水系电解液为什么特殊。水的优势是便宜、安全、不燃,但它最大的短板是电化学窗口窄。普通的锂离子电池有机电解液耐压能做到4 V以上,水系电解液稍不注意就容易析氢析氧,窗口只有1.23 V左右。想扩大窗口,一个常用思路就是提高盐浓度,让水分子都被锂离子或盐阴离子“锁”在溶剂化壳层里,降低自由水的活性。可问题是,盐浓度过高,溶液的黏度会迅速上升,离子迁移反而变慢,电导率会下降。这种非单调的关系,恰好是数学建模最爱的素材,也是最容易让参赛队伍翻车的地方。

我自己的理解是这样:水系电解液配方很像调一杯鸡尾酒。基酒决定了基本性格,但喝起来顺不顺口、后劲大不大,取决于几种配料的比例。电压窗口就像酒的度数,水本身“度数”低,加点高浓度盐可以把“度数”撑上去,但如果盐加太多,整杯“酒”变得像糖浆一样黏,离子跑不动,电导率反而下降。建模要做的事,就是把这种“多了也不行、少了也不行”的权衡量化出来。

1.3 隐藏约束:组分和、浓度上下限与溶解度极限

很多队伍把配方变量当成普通连续变量来处理,这是第一硬伤。电解液配方本质上是一个带约束的混合物设计问题,所有组分质量分数加起来必须等于1,而且每种组分都有实际溶解度的上下限。比如某盐在混合溶剂里的溶解度就是有限的,模型给出一个超过饱和浓度的配方,实验上根本配不出来。这类约束如果不写进优化模型,最后得到的“最优配方”就只是一个数学符号,没有任何工程意义。

我的建议是,无论是预测模型还是优化模型,都要把变量处理成“真实可用”的变量空间。最简单的做法是定义向量 x = (x1, x2, …, xn),其中 xi 表示第 i 个组分的质量分数,然后强制约束 sum(xi)=1 以及 xi_low ≤ xi ≤ xi_high。后面做贝叶斯优化或者遗传算法时,所有候选解都必须先过这一道真实性检验。别看这是个很基础的细节,判卷时评委一眼就能看出你是不是真正理解配方问题。

2. 数据从哪里来:特征工程是国奖和优秀奖的分水岭

2.1 官方数据不够,三类补充方案

竞赛给的数据量一般不会太大,通常在几十组到两百组之间,指望纯数据硬train出一个很深很准的模型并不现实。我们当时做的是三条线并行:第一,从已发表的学术论文里摘录相近水系电解液体系的实验数据,整理成统一格式的表格;第二,利用电化学中的经验公式生成理论特征,比如黏度估算、介电常数估算,而不是只用原始的“质量分数”;第三,对明显不合理或单位不一致的数据做清洗,缺失值用物理关系推算。

有人担心“抄”文献数据会不会被看作作弊,其实不会。建模竞赛本来就是开放数据环境,只要你在论文里标注数据来源、筛选标准和清洗过程,它反而说明你们的资料收集能力很强。关键是不要堆砌数据,要说明哪些文献、为什么选这些数据、数据与题目体系的匹配度如何。我当时在附录里列了一个表格,把每篇文章的体系、盐浓度范围、温度范围都标了出来,评委很容易就能看出我们对数据做过功课。

2.2 从“配方组成”到“物理化学特征”

直接拿组分的质量分数喂给机器学习模型,模型也能跑,但泛化能力通常一般。原因是质量分数是“配料表”,而不是“物性”。真正决定电导率的是背后的物理化学量,比如有效的电荷载流子浓度、离子迁移速率、溶剂化结构、黏度等。我们构造的输入特征大致包括:盐的摩尔浓度、混合溶剂的介电常数、混合溶剂的估算黏度、阳离子半径、醇类或酯类官能团的比例,以及温度倒数 1/T。下面这个表格是我们在复现时常用的特征模板。

特征名称计算方式物理含义
盐摩尔浓度由质量分数、溶剂密度和摩尔质量换算决定可迁移的离子数量
混合溶剂介电常数各溶剂介电常数按体积分数加权影响盐的解离程度
混合溶剂估算黏度对数混合规则估算影响离子迁移速度和最终电导率
溶剂化有效配位数官能团比例与文献配位数加权反映高盐浓度下的溶剂化结构
温度倒数1/(t+273.15)体现阿伦尼乌斯型温度依赖

这套特征最大的好处是把“组分百分数”变成了“有物理单位的量”。举个例子,质量分数一样的高氯酸钠和六氟磷酸钾,因为摩尔质量不同,实际的离子浓度差异很大,模型如果只看质量分数就很难区分。但把盐摩尔浓度作为输入,模型就有机会学到更真实的规律。特征构造这一步,往往决定了模型最终能不能从0.85的R²走到0.93,我认为这是普通队和国奖队的第一个分水岭。

2.3 数据切分和归一化:先切分,再标准化

提到数据切分,很多人会觉得这是基本功,但实际操作时最容易翻车。我们第一次做交叉验证时,先对全量数据做了标准化,然后再随机划分训练集和测试集,结果模型在验证集上的表现虚高了不少。原因是标准化时用了测试集的信息,相当于数据泄漏。后来我们把顺序纠正过来:先切分,再在训练集上fit标准化器,再对测试集做transform。

from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, random_state=42 ) scaler = StandardScaler().fit(X_train) X_train_scaled = scaler.transform(X_train) X_test_scaled = scaler.transform(X_test)

这个细节对气体组分、溶液配方这类强物理约束的问题特别重要。如果数据本身就存在分布偏移,错误的标准化的确会让模型看起来很好,但实际部署时完全失效。比赛结束后我把这个代码片段反复看了好几遍,觉得它比大多数花哨的模型都值得记录。

3. 建模思路:为什么我们放弃了纯机理模型

3.1 从电化学理论到回归模型,一个对照实验

理论上,离子电导率可以写成 σ = Σ zi F ci ui,其中 zi 是电荷数,F 是法拉第常数,ci 是离子浓度,ui 是离子迁移率。再往深走,离子迁移率又和黏度、溶剂化半径、温度相关。这套机理模型看起来很完美,但用到实际多组分电解液里就很痛苦,因为溶剂化结构、离子对缔合、黏度非线性变化都不是简单公式能描述的。

我们起初也尝试建立半经验模型,后来发现拟合效果远不如数据驱动模型。于是做了一个系统的对照实验:线性回归、岭回归、随机森林、XGBoost、高斯过程回归,都用同一套物理化学特征。当时在验证集上大致结果是线性回归 R²约0.82,随机森林约0.88,XGBoost约0.90,高斯过程回归约0.93。这个实验告诉我们,在几十到两百个样本的规模下,树模型和贝叶斯类模型的性价比明显更高,深度学习反而容易过拟合。

3.2 高斯过程回归为什么适合配方小样本

我们最后选择高斯过程回归作为电导率的代理模型,原因有两点。第一,高斯过程对样本量的需求不像深度神经网络那么大,在几十到两三百个样本下也能给出平滑且合理的预测;第二,也是最关键的,它能输出预测的不确定性,也就是均值和方差。这个方差非常有用,知道模型对哪些区域没把握,在后面的贝叶斯优化里就能主动去探索那些不确定性高的配方区间。

打个比方,普通回归模型像是一个只告诉你“这条路大概要走30分钟”的导航,高斯过程还会告诉你“这个时间误差可能只有5分钟,也可能有20分钟,因为前面路况未知”。在配方优化这种高代价场景里,知道自己不知道,比假装知道更有价值。我们后面做优化时,代理模型的不确定性直接参与了采集函数的计算,让算法在“开发目前看起来好的区域”和“探索没试过的区域”之间自动平衡。

3.3 贝叶斯优化怎么用在配方空间

有了高斯过程作为代理模型,配方搜索就可以走贝叶斯优化。经典贝叶斯优化的大致流程是:先随机获取少量初始样本点,训练一个高斯过程代理模型;然后在候选空间里最大化采集函数(比如期望改进量EI),选择下一个要评估的点;把新样本加入训练集,更新代理模型;反复迭代。这样做的好处是,不需要暴力网格搜索,也不需要做大量真实实验,就能在较少的模型评估次数下逼近最优配方。

# 简化伪代码,说明核心逻辑 for i in range(n_iter): # mean, std 来自高斯过程 mean, std = surrogate.predict(candidates) ei = (mean - best - xi) * norm.cdf(z) + std * norm.pdf(z) next_x = candidates[ei.argmax()] next_y = objective(next_x) surrogate.update(next_x, next_y)

这里特别要注意变量空间的定义。配方中有很多组分百分比,它们必须满足相加为1的约束。一种做法是用罚函数把约束写进目标函数,不满足约束的候选直接给一个很差的适应度;另一种做法是先用无约束的参数生成,再通过归一化映射到可行域。我们更推荐第一种,因为罚函数更透明,写论文的时候也更容易解释。

3.4 温度维度:单独建模还是放进模型

题面里如果出现不同温度下的实验数据,很多队伍会纠结要不要单独建模。其实两条路都行。单独建模就是每个温度点拟合一个电导率预测模型,好处是物理意义清晰,坏处是样本被切碎,模型统计量不够。把温度作为输入特征放进同一个模型,好处是能利用所有数据点,温度的影响也由数据自动学出来,坏处是模型更容易变得复杂,需要小心过拟合。

我们当时选了“温度作为输入特征”的方案,因为数据里温度范围不大,在0℃到60℃之间,而且组分的交互效应比温度效应更复杂。建模完成后,我们还专门画了一张 ln σ 与 1/T 的阿伦尼乌斯图,从图上确认预测曲线在物理趋势上是合理的,没有出现“温度升高电导率反而骤降”这种离谱行为。能在论文里放进这一页图,价值其实不低于那些复杂的数学公式。

4. 多目标优化:电导率、电压窗口和成本的三方博弈

4.1 目标函数与约束的数学表达

到第三问以后,题目通常不再要求只把电导率做大,而是要在多个性能指标之间做平衡。我们当时把目标拆成了三个:最大化离子电导率 σ,最大化电化学稳定窗口 ΔV,最小化单位体积原料成本 cost。这三个目标的量纲不一样,电导率是 mS/cm,窗口是 V,成本是 元/L,不能直接加权求和就算了,否则结果会被量级最大的那个目标牵着走。

标准做法是先定义Pareto支配关系,再用多目标优化算法找到一组互不支配的候选解。约束方面,除了组分和为1、组分上下限,我们还加了一个电导率不低于某阈值、电化学窗口不低于某阈值的硬性约束。这样优化器不会给出一个“电导率极高但电压窗口只有1.1 V”的不安全配方。其实这类问题非常像工程设计中的多目标寻优,数学上不难,难的是把每个约束都解释清楚。

4.2 为什么选NSGA-II,而不是简单加权求和

很多没有接触过优化算法的队伍,会在这一步选择最简单的加权求和,给电导率、窗口、成本分别加一个权重,变成单目标优化。这样做不是不行,但有两个致命问题:一是权重很难凭经验定,电导率0.5和成本0.3这两个权重到底代表什么,很难说清楚;二是加权求和只能得到一个解,评委看不到方案的多样性,也无法理解为什么放弃另一个可能更好的配方。

我们使用NSGA-II,理由很简单:实现稳定、解释成熟、社区资料多。它通过快速非支配排序把候选解分成不同层,再用拥挤度距离保证解集尽可能均匀分布在Pareto前沿上。我们设置的参数是种群规模200,迭代400代,交叉概率0.8,变异概率0.1。用Python的 pymoo 或 geatpy 都能方便调用。最终得到的Pareto前沿是一整个解集,而不是孤零零一个点,这样论文里画出来的图非常有说服力。

4.3 从Pareto前沿到最终决策:熵权TOPSIS

拿到一组Pareto前沿解之后,还需要做决策,因为评委要看到一个最终配方。我们用熵权TOPSIS对候选解排序:先对三个目标做标准化,信息熵大的指标权重稍低,信息熵小的指标权重稍高,然后计算每个解与理想解、负理想解的距离,按贴近度排序。下面是当时候选方案的简化结果:

方案电导率(mS/cm)电压窗口(V)成本(元/L)综合得分
配方A12.62.1850.76
配方B11.22.6780.85
配方C10.13.0700.81

最后我们选了配方B。它不是单项最强的,但综合得分最高,而且在后续灵敏度分析中表现最稳定。这里想提醒一句:多目标优化最后的“选点”不是一个纯粹的数学问题,还要结合工程直觉。当时我们额外查了配方B的原料来源,确认都不是稀缺材料,才最终定下。评委看到这种细节时,会更容易相信你们真正理解了问题。

5. 论文呈现:评委眼里“国奖版”论文长什么样

5.1 摘要和问题重述:前两页决定大半印象

竞赛论文的评委一天要翻几十份论文,花在每篇上的时间很有限,摘要和问题重述基本决定了第一印象。一份足够好的摘要,必须能在五句话内让人知道你们做了什么:第一句讲问题背景和核心矛盾,第二句说明你们建模的整体思路,第三句到第五句分别概括三个小问的方法和关键结果,最后再来一句“模型在交叉验证中R²为0.93,Pareto最优解相比基准方案电导率提升18%”之类的硬指标。最忌讳的是把摘要写成“本文先后建立了模型一、模型二、模型三”,却没有一句具体结果。

问题重述也不要照抄题目。很多队伍会把题目原文整段粘过来,占了一页纸,评委看得很累。我们当时做了个压缩:用三句话重新描述“水系电解液配方”的物理背景,然后明确说“根据题意,我们把问题分解为四个子问题”,接着用一个小列表把每个子问题的输入、输出、约束列清楚。这样一来,评委能很快确认我们没有偏题,也方便他们后面快速定位对应的模型章节。

5.2 图表设计的三个说服力细节

图表是评委快速判断论文水平的重要信号,也是“国奖版”和普通版肉眼可见的差别。第一张必须要有的是预测值与真实值的散点图,对角线y=x加进去,R²标注在角落,模型整体好坏一眼就能看出来。第二张是Pareto前沿图,横坐标可以是电导率,纵坐标可以是成本,颜色深度表示电压窗口,最后把你选定的最终配方案子用一个五角星单独标出来,评委一眼就知道你在多目标解集里是怎么决策的。第三张是灵敏度分析的误差条形图,比如把样本量从80%变化到120%,看R²误差条的变化。

图表不是越多越好,而是要每张图都有“一句话就能讲完的信息量”。我们当时删掉了很多看起来炫酷但解释不清的三维图,只保留了几张关键的二维图和热力图。热力图展示特征相关性、变量对电导率的影响强度,可以帮助评委很快理解你们构造的特征确实有物理依据。这个环节投入产出比非常高,同样一份模型,图做好看的队伍分数往往高一个档次。

5.3 灵敏度分析与模型稳健性

评委最担心的一件事,就是模型只对给定数据有效,换两个点就崩了。为了打消这种质疑,我们做了三组分析:一是改变训练集和测试集的比例,从70/30试到90/10,看性能指标波动;二是把组分上下限整体上下浮动5%,重新跑优化,看最优配方是否仍然落在同一区域;三是对预测模型做交叉验证,输出每个样本的残差分布。只要这三个结果都在合理范围,论文的稳健性说服力就上来了。

这里有个容易被忽略的小技巧:灵敏度分析不只服务于“验证”,还可以服务于“解释”。比如我们在做组分上下限浮动时发现,某一种共溶剂的比例从10%调到15%,最优电导率变化很小。这说明这个组分相对冗余,于是我们在分析里明确指出“该组分对电导率的影响不敏感,真正敏感的是盐浓度和温度”。这种结论能让评委觉得你们不是只会套模型,而是真的理解了体系特性。

6. 参赛过程中的踩坑记录与最终心得

6.1 我们最严重的失误:归一化顺序错误

说起来有点丢人,但这是我们队伍在比赛第二天犯下的最大错误。当时我们想快速出一个基准结果,于是把全量数据读进来之后,直接对X做了标准化,然后才用交叉验证训练模型。结果随机森林的性能高得离谱,R²甚至接近0.99,大家还高兴了好一阵。后来我仔细一看,标准差缩放器在fit的时候用了所有样本的信息,模型在验证集上的“优秀表现”很多是数据泄漏带来的幻觉。

发现问题之后,我们把流程改成“先切分、再fit、再transform”,重跑了一遍,R²回落到接近0.93。虽然数字变低了,但心里反而踏实了。这里也提醒所有参赛队伍:模型的分数不是越高越好,而是要能经得起交叉验证和不同的随机种子。评委也许不会去复现你们的每一段代码,但一旦在附录里看到数据泄漏这种低级错误,整篇论文的可信度都会受到质疑。

6.2 单位、温度和溶剂配比:三个看着小却能救命的细节

这次比赛我们差点在单位上翻车。文献里电导率有的用 mS/cm,有的用 S/m,两者差了一个数量级;温度有的用摄氏度,有的用开尔文。如果没做统一,模型的特征数据就会混入完全不在一个尺度上的量,严重干扰训练。我们当时专门写了一个清洗脚本,把所有数据都转成同一单位:电导率统一为 mS/cm,温度统一为摄氏度,浓度统一为 mol/L,并在论文附录里放了一份单位换算表。

还有一个容易忽略的点是“溶剂比”。有些文献用体积比,有些用质量比,直接混用会导致同一个配方在不同数据源里算出的浓度不同。我们的处理方法是优先使用质量分数,因为质量分数不随温度变化,而且与题面常见的“配方配比”一致。如果题目本身给的是体积比,我们就在特征构造时先换算成质量分数再建模,保证所有数据源口径一致。

6.3 给下一届参赛者的工具箱和时间分配建议

最后聊一点实战分配。我们队的节奏大概是这样:第一天前18小时只做三件事——读题、查文献、列数据需求表;第二天到第三天上午处理数据、搭基准模型,争取在第二天结束前跑出第一版预测结果;第三天下午开始做多目标优化,晚上进入论文写作;第四天上午集中做灵敏度分析和画图,下午留出时间统一排版、检查公式编号和附录代码。整个过程最忌讳的是前三天都在调参数,最后一天才发现论文还没开始写。

工具方面,数据处理用 pandas、numpy,机器学习用 scikit-learn,高斯过程可以用 scikit-learn 的 GaussianProcessRegressor,多目标优化用 pymoo 或 geatpy,画图用 matplotlib,再配一个如意或者 Overleaf 写 LaTeX 论文。这一套组合足够应对大部分赛题。印象很深的是,我们在第四天凌晨改图的时候,发现Pareto前沿图因为图例字体太小,打印出来几乎看不清,临时放大了字重。这种小细节看似不重要,但在纸质打印评阅环境下,体验影响很大。

比赛结束之后回头再看,我觉得“国奖版”的核心不是某个神秘算法,而是一整套严格的处理流程:从物理背景梳理、数据特征构造,到模型选择、多目标优化,最后再到论文呈现和稳健性分析,每一步都有明确的理由和结果支撑。哪怕你们最终没有站上领奖台,这种训练带来的思路和习惯,才是参赛最值回票价的部分。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询