供暖季的凌晨两点,城市电网进入用电低谷,但供热管网仍必须保持温度。那台抽汽供热机组被几十兆瓦的热负荷硬生生拽在高出力区间,电力市场现货电价跌到几分钱,还得照发不误。这就是热电联产调度里最常被吐槽的“以热定电”:热负荷一来,电出力跟着被锁住,经济性完全让位于供热安全性。我最早认真研究这个问题,是在给某区域综合能源系统做模拟调度时,发现传统优化方法在真实工况下一套套失灵,才下决心把深度强化学习引入热电联产的经济调度。
这篇内容是我在这个方向上的完整思路梳理:从热电耦合的机理、传统优化方法的瓶颈,到马尔可夫决策过程建模、算法选型、训练避坑,再到现场部署时不得不解决的工程问题。它适合正在做能源系统优化的算法工程师、想入门店级经济调度的研究生,以及那些手头有供热机组、想找出路的运行技术人。
1. 热电联产调度:被“热电耦合”一直卡住的难题
1.1 热和电的“紧绑”关系,不是加一串约束就行
热电联产机组的特殊性在于,电出力和热出力不是两个相互独立的变量,而是被同一个蒸汽做功过程绑在一起的物理量。以最常见的抽汽式汽轮机为例,主蒸汽先进高压缸做功发电,中间抽出一部分蒸汽去供热。抽汽量越大,汽轮机用于发电的蒸汽就变少,电出力上限跟着下降。反过来,如果为了多发电而减少抽汽,热出力又不够,供热管网就冷了。所以每个工况下,电出力和热出力之间有一个可行域,形状像梯形或多边形,不是简简单单加两条不等式约束就能描述的“独立区间”。
背压式机组更极端,排汽全部用于供热,电出力和热出力几乎成固定比例,机组的调度空间基本是一条线,而不是一个面。很多人写论文时把热电联产简化成“电出力减热出力耦合系数”,这种线性假设在定性分析阶段没问题,一旦要做经济调度,误差立刻传导到启停决策和蓄热罐策略上,最后结果就是“模型算得很好,现场一跑就亏”。
“以热定电”这个词就是在这种物理约束下诞生的。冬季夜间,热负荷居高不下,机组为了满足供热,电出力被迫保持在最小技术出力之上。这时候电网电价可能只有几分钱,机组发出来的电卖不出价,但因为热不能停,电也不得不发。换句话说,热网把电网的负荷低谷“绑架”了。某个模拟场景里,低谷期热负荷约40兆瓦,为了供热,机组最小电出力被抬到25兆瓦,现货电价不足2分钱,一晚上额外发的电亏了好几万元。调度员看到报表想删表,但物理规律摆在那里——这就是热电联产调度最让人头疼的根。
1.2 经济调度到底在优化什么
热电联产系统的经济调度,目标函数看着不难:每个调度时段(15分钟或1小时)的燃料成本、机组启停成本、外购电成本、售电收益,综合起来最小。难的是约束条件,而且这些约束相互咬合,形成了强耦合、跨时段的优化问题。
首先是两个平衡约束。电平衡是硬性约束,发电和用电必须每秒都相等,差一点都是频率事故,没有商量余地。热平衡相对温和,因为热网本身有巨大的热惯性,供水温度允许短期波动,用户侧感受到的温度变化滞后半小时甚至更久,所以热平衡可以容忍一定的松弛量。这种“电要死磕、热可商量”的不对称性,对后来设计强化学习的奖励函数至关重要。
其次是机组自身的物理限制:出力上下限、爬坡速率、最小启停时间、抽汽工况约束,还有蓄热罐的容量和充放速率。启停机组尤其麻烦——一台锅炉从冷态启动到并网可能要几个小时,一旦启动,未来几个时段的状态全变了。所以经济调度的本质不是一个静态最优化问题,而是一个跨时段、带记忆的序贯决策问题,每一时刻的动作都会影响后面几十个时段的状态。
1.3 为什么这个问题的难度被长期低估
我见过太多从经典运筹学切入的人,一开始都觉得热电联产调度不过是一个混合整数规划,把煤耗曲线分段线性化,让求解器去跑就行。复杂度在三个地方被低估了。
第一是高维非凸非线性,机组的煤耗特性、效率曲线都是非线性,分段线性化一旦分段数上去,二进制变量爆炸,求解时间从秒级涨到分钟级甚至小时级。现场调度不可能等你算完。第二是整数变量的组合爆炸,机组越多,启停组合越复杂,一台机组两个状态,十台机组就是1024种组合,再乘上调度时段,搜索空间大得离谱。第三也是最致命的——不确定性。热负荷预测、电负荷预测、新能源出力、现货电价,全都在波动。一个输入参数偏差8%,最优解就可能变成次优甚至不可行解。
一句话概括:热电联产调度不是“模型简单、求解难”,而是“模型本身就难、求解也难、不确定性让两者都更难”。
2. 传统数学优化方法:模型很漂亮,现场总差一口气
2.1 主流优化框架的建模代价
传统方法里,混合整数线性规划是工业界用得最多的框架。做法是把煤耗曲线、热效率曲线分段线性化,把机组启停离散成0/1变量,然后把整个问题丢给求解器。这个方法能解决问题,但代价是模型精度和求解时间的对赌。想要精度,就得增加分段数、增加整数变量,求解时间急剧上升。想控制求解时间,就得牺牲精度,优化结果与实际运行偏差变大。
模型预测控制是另一个常见思路,在每个调度时刻滚动优化未来若干时段,用实测数据反馈校正。理论上它能应对扰动,工程上表现得看环境。模型预测控制在仿真环境里表现尚可,一旦负荷预测出现明显偏差,优化给出的蓄热罐充放策略就会和实际情况脱节,运行人员必须频繁手动干预。我在一个模拟项目里测过:热负荷预测偏差超过8%时,模型预测控制输出的蓄热罐策略明显滞后,补偿执行下来,额外成本上升接近12%。
非线性模型更不用说了。混合整数非线性规划在理论上是更精确的建模方式,但实际求解难度极大,商用求解器处理中大规模问题往往慢到没法工程部署。所以很多学术研究用混合整数非线性规划建模,最后又用启发式算法或分段线性化去近似求解,矛盾一直没有真正解决。
2.2 不确定性才是真正的天花板
传统优化方法最根本的问题,不是算法不够强,而是整个“先建模、后求解”的框架容错率太低。模型参数一旦偏离真实工况,最优解立刻失真。煤质的波动、锅炉热效率的衰减、天气的变化,这些运营中天天发生的事情,在优化模型里往往是静态参数。你用一个月前的煤耗曲线去优化今天的运行,算出来再漂亮,执行下来也不省钱。
为了解决不确定性问题,学术界发展出随机规划和鲁棒优化。随机规划用大量场景去刻画不确定性,但场景数一多,问题规模指数膨胀;鲁棒优化则在最坏情况下寻找最优解,保守性太强,实际运行成本偏高。两种方法在实际现场都很难推广,因为它们对不确定性的刻画方式要么过于计算沉重、要么过于悲观。
真正的现场场景是混合型的:电价是大幅波动的随机过程,热负荷是强相关的时序过程,机组效率随着运行工况连续漂移。这些不确定性混在一起,传统方法要么做了一堆假设,把问题化简到可以求解,但这个“化简”已经偏离了物理现实,要么老老实实建全模型,然后陷入组合爆炸。
2.3 一个更隐蔽的问题:调度员不信任黑箱
传统方法还有一个容易被算法工程师忽略的痛点,就是现场运行人员。“为什么这个时刻要停这台机?”“为什么蓄热罐要在电价最低前两个小时就开始充?”主流优化器给出的答案往往是一大堆对偶变量和灵敏度系数,运行人员看不懂,也就不敢信。调度不是一个可以试错的场景——错了可能影响供热质量。一个不透明的优化方案,执行意愿大打折扣。
更深层的矛盾在这里:传统优化模型试图把调度员的经验总结成约束和目标函数,但现场经验常常是多目标、模糊、讲不清道理的。把模糊的经验硬编码进数学模型,本身就是一种信息损失。我见过实际运行手当模型预测控制的输出与经验直觉冲突时,直接切换到手动模式。这套系统再好,不被信任就是白搭。
3. 深度强化学习为什么能绕过“精确模型”这道坎
3.1 调度本质上就是一个序贯决策问题
跳出“一次求解”的思路,把调度过程看作一个连续的交互过程:调度员在每一个时刻观察当前状态,从电负荷、热负荷、电价到机组运行状态,做出一个操作决策,然后系统状态发生变化,一个周期的成本随之产生。下个时刻观察新的状态,再做新的决策。这不就是标准的时间差分控制吗。马尔可夫决策过程的三个核心元素——状态、动作、奖励——在热电厂里天然存在。
深度强化学习的本质,是用神经网络去拟合“当前状态下选择什么动作最合理”的函数。传统优化做的是给一个算例求一个解,得到的是这个算例下的最优动作;强化学习做的是让智能体在一个模拟环境里反复试错,学到一个状态到动作的映射。用个不太严谨但形象的说法:传统优化像规划一条从城市A到城市B的全程路线,深度强化学习像一个有经验的老司机,不用知道整张地图,只需不断根据前方路况微调方向盘。
3.2 不精确的模型也可以用来学习
深度强化学习的核心优势之一,是不需要解析精确的全局模型。它需要的只是一个能和策略交互的“环境”——这个环境可以是高精度物理仿真器,也可以是一个带有明显近似误差的简化模型。策略会在大量交互中,不断利用“做错了会被扣分”“做对了会积累奖励”的信号去调整自身。
这种学习机制让智能体天然适应模型失配。你在模拟器中把煤耗系数、热负荷误差全都加了扰动,训练出来的策略会把“不确定性”本身纳入决策——它不会依赖某个精确数字做计划,而是学会在不同偏差下选择较安全的操作。模拟环境引入随机扰动后,策略在测试集上的表现往往比固定模型训练的更稳定,这其实就是域随机化的思路。
当然,不精确模型也不是万能橡皮泥。环境模拟器的趋势必须合理,你用了错误的物理假设,模型学到的就是错误的策略。强化学习绕过的是“解析求解精确模型”这道坎,不是“把世界搞懂”这道坎。
3.3 热电联产场景和深度强化学习的高度契合
给一个系统引入深度强化学习前,我会问三个问题:状态空间是否高维且连续?动作效果是否有明显的非线性?是否存在跨时段的权衡?热电联产调度三个全占满。状态空间里负荷预测、电价、温度是连续高维的,机组热效率曲线是非线性且强耦合的,蓄热罐的充放则天然是跨时段的资源转移决策。这种问题让神经网络来拟合状态到动作的映射,非常合适。
热电联产还有一个其他场景求之不得的先天优势——热网的巨大热惯性。热平衡约束允许短期松弛,这意味着强化学习在训练初期动作稍微离谱也不会立刻“爆炸”,给了试错机制足够的容错空间。但要注意,这里说的是“允许短期松弛”,不是“可以无限乱来”,舍此奖励函数设计就全乱了。
4. 把调度问题翻译成MDP:状态、动作与奖励函数的设计细节
4.1 状态空间:该喂给智能体什么信息
MDP设计的第一关是状态空间。状态空间太大、信息冗余,神经网络训练困难;状态空间太小、信息缺失,策略永远学不好。以单台抽汽供热机组加蓄热罐的典型场景为例,我建议状态空间包含以下维度:
| 状态类型 | 具体内容 | 说明 |
|---|---|---|
| 负荷预测 | 未来N个时段的电负荷、热负荷预测序列 | 刻画未来趋势 |
| 环境变量 | 室外温度、供热回水温度、供水温度 | 影响热负荷与供热能力 |
| 市场价格 | 未来N个时段的现货电价曲线 | 决定经济调度空间 |
| 机组状态 | 当前电出力、热出力、锅炉温度、运行时长 | 反映物理约束 |
| 储能状态 | 蓄热罐当前储热量(SOC)、罐内温度梯度 | 反映跨时段调节能力 |
| 时间特征 | 当前时刻、星期、季节标志 | 隐式编码负荷的周期性模式 |
状态特征之间量纲差异很大,电价可能是几百元每兆瓦时,温度是几十摄氏度,SOC是百分比。直接拼起来喂给神经网络,训练初期梯度会被大尺度特征带偏。我在实践中给每个特征做running normalization,简单说就是边训练边统计均值方差,把每个特征标准化到零均值单位方差的范围。这一步看着不起眼,却能省掉大量调参时间。
4.2 动作空间:连续还是离散,如何贴合物理设备
动作空间必须对应现场可执行的操作指令,不能设计成纯数学的抽象变量。典型动作向量包括:各机组出力增量、汽轮机抽汽量调节或供热蝶阀开度、蓄热罐充电/放电功率,以及离散的机组启停信号。这里有个常见的误区:把所有动作离散化。我早期在蓄热罐功率上做过五档离散化,从-2到2兆瓦,每档1兆瓦,结果策略学到的是“总是走中间档”的保守行为,经济性损失明显。原因很简单,离散化丢掉了连续调节的灵活性,而蓄热电功率在边界之间的细微调整恰恰是经济性来源。
后来我把出力增量、抽汽量和蓄热罐功率改为连续动作,并做一个边界映射层,把网络输出限制在物理允许范围内。这样既保住了灵活性,又不会产生明显越界的动作。只有在处理机组启停时保留离散动作,这样动作空间就变成了“连续+离散”的混合形态。实现上可以用参数化动作的思路:策略网络输出一组参数,离散决策头负责启停,连续决策头负责功率分配。
4.3 奖励函数:经济目标与罚函数的平衡艺术
奖励函数是整个MDP设计里最考验细节的部分,也是最容易翻车的地方。典型做法是先将运行成本定义为负奖励,再把违反约束的量以罚函数形式并入。我实际使用的形式是:
reward = -(燃料成本 + 启停成本 + 购电成本 - 售电收益) - β1 * 电平衡违例率^2 - β2 * 热平衡违例率^2 - β3 * 爬坡约束违例率^2 - β4 * SOC越界量^2电平衡违例率定义为|实际电出力 - 电负荷|/ 电负荷,热平衡类似。对热平衡这里有个颇为重要的细节:真实热网允许短期偏差,所以我在加热惩罚之前加了一个软性窗口,热平衡误差在5%以内不扣分,超过线性递增。这样策略不会为了保住一个本来可以容忍的热偏差,去做出极端的经济决策。
惩罚系数也不能给成拍脑袋的数。我见过有人把β1设成1000,结果策略一开始学习发现任何可能把电平衡搞坏的试探都会得到巨大惩罚,于是所有动作收敛到“什么都不做”的保守区间,等于白训。我现在的做法是先跑一个零动作策略,统计基准成本和约束违例的量级,再据此设定惩罚系数,并且在训练前段用小β值让策略先探索、后段逐步加大β值让策略收敛到安全区。
还需要防一种“奖励黑客”行为:蓄热罐SOC快满时,智能体发现继续充电在当前时段不扣成本,于是它会把电出力顶到上限拼命给蓄热罐充电,把能量“囤”到将来再放。这种思维在纯经济目标下非常合理,但实际蓄热罐有容量边界,越界就会造成热力系统风险。所以要给SOC设置边界软惩罚,让智能体不敢轻易“占便宜”。
4.4 环境模拟器:搭一个能反映物理趋势的沙盘
奖励函数再精巧,没有环境模拟器也训练不出来。模拟器的核心目标是“反映物理趋势,而不是精确复现现实”。机组模型不一定要用成熟的仿真软件,关键是把握住几条主线:电出力和热出力的耦合关系、燃料消耗随负荷的变化、蓄热罐的能量守恒、热网的惯性时间常数。
我常用的一组简化模型逻辑是这样:
def step(self, action): # action: [电出力调节量, 供热抽汽调节量, 蓄热罐功率] p_set = self.state.p + action[0] h_set = self.state.h + action[1] # 电热耦合可行域校验 if not self.feasible_region(p_set, h_set): action = self.project_to_feasible(action) # 投影到可行域 # 电平衡与热平衡 elec_violation = abs(p_set - self.elec_demand) / self.elec_demand heat_violation = abs(h_set - self.heat_demand) / self.heat_demand # 蓄热罐SOC与热网惯性的近似 self.soc += (action[2] * self.dt - self.heat_loss) # 成本 fuel_cost = self.coal_curve(p_set, h_set) buy_cost = max(0, self.elec_demand - p_set) * self.price sell_rev = max(0, p_set - self.elec_demand) * self.price self.reward = -(fuel_cost + buy_cost - sell_rev) - penalties return self.next_state(), self.reward, False, {}模拟器里我最看重的是数据来源。训练用的负荷曲线和电价曲线不能只有一天的历史数据,要覆盖不同季节、不同天气类型的分布。我只用历史数据回放,那智能体学到的是“背题库”,换个年份的负荷就全面失效。更合理的做法是在历史数据基础上叠加高斯噪声,再从时间轴上随机截取起始点,防止策略记住固定模式。
搭好模拟器后第一个要做的,不是急着丢给强化学习,而是先跑几条规则策略当作baseline,比如“热负荷跟随,电价低谷蓄热”这种人工规则。深度强化学习训练后的策略如果连手工规则的规则都打不过,说明建模或训练配置有问题,先调参数而不是硬上算法。
5. 算法选型与训练工程:从DQN到SAC的实战对比
5.1 DQN为什么大概率“劝退”
深度强化学习圈子里很多人第一课都是从DQN开始,我也一样,但实事求是说,DQN套到热电联产调度上是个错误示范。DQN的核心限制是它只能处理离散动作空间。连续负荷来一个离散动作网格,精度和维度立刻爆炸。蓄热罐功率想精细控制,就得把动作空间压成几十个离散点,而多台机组联合调度的动作组合数是指数级上升,Q网络学起来非常吃力。
我在一个单台抽汽机加蓄热罐的小场景里测过DQN,动作用24点离散化,勉强能学到规则策略附近的行为,一旦把系统扩展成两台机组,训练过程就完全失去稳定性。DQN适合的是那些动作本身是离散决策的问题,比如象棋围棋、游戏按键。热电厂的经济调度需要连续调节,DQN这条路的可扩展性太差。
5.2 DDPG与TD3:连续控制的及格线
真正能处理连续动作的第一梯队是DDPG系。DDPG在连续控制上能跑通,但学过的朋友都会有同感:它对超参数极其敏感,对奖励尺度也极其敏感,训练过程经常从“看起来收敛”突然变成“梯度爆炸”,然后策略彻底瘫痪。
TD3是DDPG的改良版本,用双Q网络抑制过估计,延迟策略更新让目标更稳定,目标策略平滑去版了极端Q值。实测下来,TD3在连续动作的调度场景下稳定性明显好于DDPG,是能把训练跑完不半路崩溃的及格选择。但TD3的探索效率在动作维度较高时仍然不理想,我做到两台机组加蓄热罐、动作维度升到8个以上,TD3训练需要的步数大幅上升,经常陷入局部最优。
梯度裁剪这个冷门技巧值得单独提一句,DDPG和TD3训练初期动作探索半径大,容易产生超大Q值,加上梯度裁剪能把训练崩溃的概率降到约一半。这是我的实践心得,很多人调到崩溃都没想起来加这一行代码。
5.3 PPO和SAC:哪条路更适合调度场景
PPO和SAC是目前解决连续控制的主流两派,各有明显长处。PPO剪裁目标函数,采样效率可控,对超参数敏感度低,稳定性好,而且天然可以同时处理离散和连续的混合动作空间。SAC基于最大熵框架,在训练时鼓励探索,连续控制的上限通常比PPO更高,但引入了一个温度系数超参数,训练计算量也更大。
| 对比维度 | PPO | SAC |
|---|---|---|
| 动作空间 | 混合离散+连续友好 | 连续控制更优 |
| 探索机制 | 随机策略分布 | 熵正则主动探索 |
| 训练稳定性 | 高,接近“傻瓜参数” | 较高,但依赖调参 |
| 收敛速度 | 中 | 第一阶段更快 |
| 调度场景适用度 | 多机组混合决策 | 连续调节为主 |
在我自己的热电联产任务里,SAC的最终累计奖励平均高约10%,约束违例率也更低。PPO的优势体现在动作维度高、决策类型混杂的场景,比如多台机组同时有启停和功率调节的复杂状态。如果你的场景以连续调节为主,从SAC起步;如果离散决策占比很高,选PPO。另一条经验是不迷信单一算法,在SAC跑通之后用PPO再验证一轮,两个独立实现的策略收敛在相近的水平,才说明MDP建模和环境是可靠的,不是某个算法的运气好。
5.4 网络结构、训练预算与收敛判断
网络结构在这个问题上没必要花哨。我用的是状态输入、共享一个两层256维的MLP编码器,然后分支出Actor和Critic的常规结构。SAC侧加一个熵温度网络的自动调节,其他保持默认。层数不是越多越好,我试过把编码器加深到三层512维,训练时间明显变长,命中经济收益却不加分。调度问题的有效信息量没那么大,过度建模反而增加过拟合风险。
训练预算网络上很多人太理想化。你看到论文里画出的训练曲线几千步就收敛,那往往是用单一场景或者已经收敛的结果去做演示。真实调度环境我把一次训练跑50万步当作中等规格,最低也要10万步起。判断收敛状态,我同时盯三个指标:累计奖励的滑动平均、约束违例率、热平衡误差的移动平均。只盯累计奖励会忽略一些细节,比如奖励上涨但违例率也在涨,说明策略在奖励黑客上身。当约束违例率降到1%以下且保持,同时累计奖励停止上升,就可以停训练进入模型测试阶段,再练下去基本是过拟合。
训练过程中还要记得定期存检查点。早期训练崩盘是常态化,我会每5万步保存一次检查点,崩盘时回滚到最近的稳定版本,而不是从头重训。
6. 从仿真到真机组:现场部署绕不开的几道坎
6.1 奖励函数训出来的软约束,必须加硬保护层
仿真里策略输出偶尔越界,只是扣一点积分,现场不行。一台机组爬坡超限可能触发保护跳机,蓄热罐越界可能影响外供热量。所以现场部署时,深度强化学习的输出要过一道“安全保护层”,而不是直接接到执行机构。
我用的做法是一个可行性映射层:首先是边界裁剪,把每个动作直接钳位到物理上下限和爬坡限制内;然后是优先级校验,电平衡优先级高于热平衡,一旦策略输出破坏了电平衡,先修正电力偏差,再检查热力是否在容差范围内;最后是蓄热罐SOC校验,SOC即将越界时,强制把充放功率限制在可执行区间。经过这个保护层的输出,才能下发给底层控制系统。
这个保护层本质上是把硬约束从“靠奖励函数软惩罚”变成“物理不可违反”,两者不在一个信任级别。你可以理解为自动驾驶的决策系统和刹车防抱死系统各司其职,深度强化学习负责策略脑,硬保护层负责最后的安全底线。
6.2 模拟与现实的差距,用域随机化去弥合
仿真模型和现场机组的差距,是深度强化学习落地最大的敌人。煤质波动、锅炉结垢后效率衰减、温度传感器的噪声,这些在模拟器里如果不处理,训练出来的策略到现场必然面目全非。域随机化是我推荐的第一个手段。
域随机化的思路很直白,训练时不把机组效率系数、负荷预测误差、SOC传感器噪声设成固定值,而是每次重置环境时从合理范围内随机采样。这样智能体学到的是在参数漂移条件下都能稳定操作的策略,而不是针对某个特定系数的“背诵型”策略。我自己的模拟项目里,将机组效率系数加了±5%的随机扰动后,训练出来的策略在未扰动测试集上累计奖励略有下降,但在强扰动测试集上优势巨大,这正是现场需要的东西。
第二道防线上线后的在线微调,但这条要格外谨慎,现场数据里混杂了很多噪声和非典型工况,直接上线继续学习容易引入风险。建议只在有可靠监控保护前提下,以极小学习率做目标网络软更新,一旦策略发生明显漂移立即回滚。
6.3 与电力现货市场业务规则的衔接方式
现场部署时还有一个很多人忽略的问题:调度过程不只是纯物理优化,还要面对电力现货市场的申报和结算规则。直接让深度强化学习输出一个绝对出力指令,等于要神经网络背下市场规则的全部逻辑,负担太大。
一个更现实的嵌入方式是,让深度强化学习做“日内偏差调节器”。人力或者原有优化系统先做出一个日前计划作为基线,深度强化学习只负责根据最新负荷预测和实时电价,输出一个相对基线的偏差方向和幅度。这样做的好处非常直接:系统改造范围很小,原有运行规程基本不动,运行人员只需审查“偏差量”是否符合直觉,信任成本大幅下降。
这种嵌入方式把深度强化学习放在了一个“辅助参谋”的位置,而不是直接取代整个调度系统。实际部署中,我更推荐“深度强化学习出建议、可行性校验层把关、调度员做最终确认”,等策略在运行中积累了足够多的信任数据后,再逐步扩大自动化范围。
7. 一点个人使用体会
走完一遍从热电联产机理建模、MDP设计、算法选型到现场部署的全流程,我最深的感受是:时间要花在环境和奖励函数上,而不是算法调参上。深度强化学习框架选来选去就那么几种,真正决定成败的是你能不能把一个调度问题翻译成准确的奖励信号和一个贴合物理的趋势模拟器。我做过几次实验,算法不变只优化奖励函数设计,最终成本下降幅度比换算法大得多。
另一个反直觉的经验是,奖励函数应该尽量简化。太多条目标项会让学习信号互相干扰,智能体容易学会钻空子。那时候我为了覆盖所有约束,把奖励函数拆成了十几个惩罚项,结果策略学到的是“尽量采集最安全动作,不做任何有风险的经济优化”。删掉冗余项、合并同质约束,奖励函数精简到五六个核心项之后,训练效率明显回升。
这个方向后续的空间还很大。多区域综合能源系统的分布式协同调度,深度强化学习与模型预测控制的混合嵌套,以及用离线强化学习把历史运行数据变成策略学习的基础,这些都是我下一步想继续尝试的切入点。调度这块硬骨头,当年用数学规划啃,现在用强化学习啃,味道不一样,但目标从未变过。