光伏发电的间歇性和不可预测性已经成为微电网运营中最头疼的问题。我经历过太多次这样的情况:上午光伏阵列还在满功率输出,下午一片乌云飘过,发电量直接腰斩。这种波动幅度可能高达80%的功率跳变,对传统基于确定性模型的优化算法简直是降维打击。
传统方法通常采用两阶段优化:先用历史数据预测光伏出力,再求解最优调度方案。但问题在于,当实际出力偏离预测值时,整个方案可能瞬间失效。这就好比用昨天的天气预报来决定今天的穿衣搭配——如果突然降温,你只能瑟瑟发抖。
我们团队在2022年首次尝试将深度强化学习应用于微电网调度时,发现普通DQN算法存在严重的高估偏差问题。具体表现为:算法会过度依赖某些看似高回报但实际风险很大的操作,比如在电价低谷时把电池电量全部放空。
双深度期望Q网络的核心创新在于引入了概率分布的概念。我们不再假设光伏出力是某个确定值,而是将其建模为一个概率分布函数。这就像从"明天大概率是晴天"变成了"明天有60%概率晴天,30%多云,10%下雨"的思维方式。
python复制class MicrogridDQN(nn.Module):
def __init__(self, input_dim, hidden_dim=128):
super().__init__()
self.fc1 = nn.Linear(input_dim, hidden_dim)
self.fc2 = nn.Linear(hidden_dim, hidden_dim)
self.value_head = nn.Linear(hidden_dim, 1)
self.advantage_head = nn.Linear(hidden_dim, action_dim)
def forward(self, x):
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
value = self.value_head(x)
advantage = self.advantage_head(x)
return value + (advantage - advantage.mean(dim=1, keepdim=True))
这个架构有三个关键设计点:
在实际测试中,这种设计使得算法在光伏出力突变时,能更快识别出真正有价值的调度策略。例如当预测误差超过20%时,传统DQN需要约50次迭代才能调整策略,而我们的方法只需15-20次。
我们采用混合高斯模型来拟合光伏预测误差:
python复制def get_pv_error_dist(predicted_pv):
"""
根据预测值返回可能误差的概率分布
predicted_pv: 当前时段的光伏预测出力(kW)
返回: (error_values, probabilities)元组
"""
if predicted_pv < 50: # 低光照条件
return ([-0.2, -0.1, 0, 0.1], [0.3, 0.4, 0.2, 0.1])
else: # 高光照条件
return ([-0.3, -0.15, 0, 0.2], [0.2, 0.3, 0.3, 0.2])
这个简单的模型在实际应用中表现出人意料的好。关键在于,它抓住了光伏预测的两个基本特征:
python复制def calculate_expected_q(next_states, target_net, pv_error_dist):
# 获取基础Q值
base_q = target_net(next_states)
# 生成所有可能的下一状态
perturbed_states = []
for error in pv_error_dist[0]:
perturbed = next_states.clone()
perturbed[:, pv_idx] *= (1 + error) # pv_idx是光伏状态的位置索引
perturbed_states.append(perturbed)
# 计算期望Q值
expected_q = torch.zeros_like(base_q)
for i, error_prob in enumerate(pv_error_dist[1]):
expected_q += error_prob * target_net(perturbed_states[i])
return expected_q
这个实现有几个优化点:
我们的算法展现出一些反直觉的调度行为。例如在电价低谷时段,传统方法会尽可能充电,而我们的算法有时会选择只充到80%。深入分析发现,这是算法考虑到光伏预测的不确定性——保留部分容量应对可能的发电骤降。
当预测误差超过阈值时,算法会优先调整以下负荷:
这种策略使得系统在应对突发情况时,电池的循环寿命损耗降低了约35%。
一个好的状态表示应该包含:
我们使用归一化的连续值表示这些状态,维度控制在15-20之间。过高的维度会导致训练困难,而过低则会丢失关键信息。
多目标奖励函数包括:
python复制def calculate_reward(state, action, next_state):
# 经济性奖励(负号表示成本)
economic = - (grid_cost + battery_degradation)
# 可靠性惩罚
reliability = -10 if voltage_violation else 0
# 可再生能源利用率
renewable_util = pv_utilization * 0.5
return economic + reliability + renewable_util
权重的设置需要多次调试。我们发现先优化经济性,再逐步加入其他目标的效果最好。
这些技巧组合使用后,训练时间从原来的72小时缩短到18小时左右。
关键超参数的经验值范围:
我们开发了一个自动调参脚本,使用贝叶斯优化来搜索最优组合。
必须硬编码以下约束:
这些约束应该在动作选择阶段就直接过滤掉非法动作,而不是依赖奖励函数惩罚。
在树莓派4B上的实测性能:
关键是把PyTorch模型转换为ONNX格式,并使用C++实现轻量级推理引擎。