1. 项目背景与核心问题
配电网作为电力系统的末端环节,其可靠性直接影响着终端用户的用电体验。近年来,随着极端天气事件频发,传统配电网在面对台风、冰灾等自然灾害时暴露出了明显的脆弱性。2021年德州大停电事件就是一个典型案例,当时极端寒潮导致电网大面积瘫痪,造成了严重的经济损失和社会影响。
在这样的背景下,如何提升配电网的韧性(Resilience)成为了电力系统研究的热点问题。所谓韧性,指的是电力系统在遭受扰动后能够快速恢复供电的能力。而应急移动电源(Mobile Power Sources, MPS)因其灵活部署的特性,成为了提升配电网韧性的重要技术手段。
MPS主要包括三类设备:
- 电动汽车车队(EV Fleets)
- 车载移动储能系统(Mobile Energy Storage Systems, MESS)
- 移动应急发电机(Mobile Emergency Generators, MEG)
这些设备可以在灾害发生前预先配置在关键节点,或在灾害发生后快速调度到故障区域,为重要负荷提供应急供电。然而,MPS的优化配置和调度面临三大核心挑战:
关键挑战1:极端天气下的不确定性难以准确预测。故障位置、设备损坏程度、道路通行状况等都存在高度不确定性,这使得传统的确定性优化方法难以适用。
关键挑战2:多目标优化问题复杂。需要同时考虑预配置成本、负荷恢复优先级、系统恢复速度等多个目标,这些目标之间往往存在冲突。
关键挑战3:时空耦合问题突出。MPS的运输时间与电力调度需要协同优化,简单的"先到先服务"策略可能导致电力恢复效率低下。
2. 两阶段鲁棒优化框架设计
2.1 整体架构
针对上述挑战,本文采用了两阶段鲁棒优化(Two-Stage Robust Optimization)框架:
code复制第一阶段(预配置阶段):
灾害发生前 -> 确定MPS预置位置和配电网拓扑 -> 最大化系统生存能力
第二阶段(动态调度阶段):
灾害发生后 -> 实时调度MPS和重构网络 -> 最小化负荷损失和恢复时间
这种架构的优势在于:
- 第一阶段决策(here-and-now)需要在不完全信息下做出
- 第二阶段决策(wait-and-see)可以根据实际灾害情况进行调整
- 通过鲁棒优化处理不确定性,确保在最坏情况下仍能保持较好性能
2.2 第一阶段模型:MPS预配置
2.2.1 目标函数
第一阶段的目标是最大化系统的生存能力(Survivability),定义为预恢复阶段系统韧性水平的加权和:
$$
\max \sum_{t=t_{pe}}^{t_{pp}} \sum_{i \in N} w_i R_{pp,i,t}
$$
其中:
- $w_i$:节点i的权重(反映负荷重要性)
- $R_{pp,i,t}$:节点i在时刻t的韧性水平
- $t_{pe}$到$t_{pp}$:预恢复时间窗口
2.2.2 关键约束
-
MPS容量约束:
每个节点预置的MPS数量不超过其物理容量限制:
$$
\sum_{k \in K} x_{i,k} \leq C_i^{MPS}, \quad \forall i \in N
$$
$x_{i,k}$表示类型k的MPS在节点i的预置数量,$C_i^{MPS}$是节点i的MPS容量上限。 -
配电网拓扑约束:
通过虚拟流模型确保网络保持辐射状结构:
$$
\sum_{j:(i,j)\in E} f_{ij} - \sum_{j:(j,i)\in E} f_{ji} = b_i, \quad \forall i \in N
$$
$f_{ij}$是支路(i,j)上的虚拟流,$b_i$是节点i的虚拟流需求(源节点为1,负荷节点为-1)。 -
道路-电网耦合约束:
MPS预置节点必须位于可通行的道路节点附近:
$$
x_{i,k} \leq \sum_{j \in N_r} a_{ij} y_j, \quad \forall i \in N, k \in K
$$
$a_{ij}$是电网节点i到道路节点j的可达性系数,$y_j$表示道路节点j是否可用。
2.3 第二阶段模型:动态调度
2.3.1 目标函数
第二阶段的目标是最小化负荷损失和恢复成本:
$$
\min \sum_{t \in T} \sum_{i \in N} P_{loss,i,t} + \alpha C_{transport} + \beta C_{degradation}
$$
其中:
- $P_{loss,i,t}$:节点i在时刻t的负荷削减量
- $C_{transport}$:MPS运输成本
- $C_{degradation}$:电池寿命衰减成本
- $\alpha, \beta$:权重系数
2.3.2 关键约束
-
功率平衡约束:
每个节点的有功/无功功率必须平衡:
$$
P_{i,t}^{inj} + \sum_{k \in K} P_{i,k,t}^{MPS} = P_{i,t}^{load} - P_{loss,i,t}, \quad \forall i \in N, t \in T
$$
$P_{i,t}^{inj}$是节点i的注入功率,$P_{i,k,t}^{MPS}$是类型k的MPS在节点i提供的功率。 -
MPS状态约束:
包括充放电功率限制和电量状态(SoC)约束:
$$
0 \leq P_{i,k,t}^{ch} \leq u_{i,k,t}^{ch} P_{k,max}^{ch}
$$
$$
0 \leq P_{i,k,t}^{dis} \leq u_{i,k,t}^{dis} P_{k,max}^{dis}
$$
$$
SoC_{i,k,t} = SoC_{i,k,t-1} + \eta_k^{ch} P_{i,k,t}^{ch} - \frac{P_{i,k,t}^{dis}}{\eta_k^{dis}}
$$
$u_{i,k,t}^{ch/dis}$是二进制变量,表示充放电状态。 -
时空耦合约束:
MPS从节点i移动到节点j需要时间$\tau_{ij}$:
$$
x_{j,k,t+\tau_{ij}} \geq x_{i,k,t} - M(1-z_{ij,k,t}), \quad \forall (i,j) \in E_r, k \in K
$$
$z_{ij,k,t}$表示类型k的MPS是否在时刻t从i前往j,M是大常数。
3. 求解算法实现
3.1 列约束生成算法(C&CG)
两阶段鲁棒优化问题采用列约束生成算法求解,该算法通过主问题和子问题的迭代求解来逼近最优解。
3.1.1 主问题(Master Problem)
主问题求解第一阶段决策变量(MPS预置和拓扑重构):
$$
\min_{x,y} c^T x + \eta
$$
s.t.
$$
\eta \geq Q(x,y,\xi^l), \quad l=1,...,k
$$
$$
Ax \leq b, \quad x \in X
$$
其中$\xi^l$是前k次迭代中得到的最恶劣场景。
3.1.2 子问题(Subproblem)
子问题寻找使系统性能最差的故障场景:
$$
Q(x^,y^,\xi) = \max_{\xi \in \Xi} \min_{z} d^T z
$$
s.t.
$$
Wz \geq h - T\xi - Sx^*
$$
子问题本身是一个双层优化问题,可通过强对偶理论转化为单层MILP。
3.2 MATLAB实现要点
3.2.1 数据结构设计
使用MATLAB结构体组织电网和MPS数据:
matlab复制network = struct(...
'bus', [], % 节点数据
'branch', [], % 支路数据
'load', [], % 负荷数据
'gen', []); % 电源数据
mps = struct(...
'type', {'MESS','MEG'},... % MPS类型
'capacity', [200; 100],... % 容量(kWh/kW)
'power', [50; 100],... % 功率(kW)
'cost', [0.2; 0.15]); % 单位成本($/kWh)
3.2.2 模型构建
使用YALMIP工具箱构建优化模型:
matlab复制% 定义决策变量
x = binvar(nBuses, nMPS, 'full'); % MPS预置变量
f = sdpvar(nBranches, 1); % 虚拟流变量
% 构建目标函数
objective = sum(w'*R); % 生存能力最大化
% 添加约束
constraints = [sum(x,2) <= C_max,... % MPS容量约束
A*f == b,... % 虚拟流平衡
f <= M*y]; % 支路开关状态约束
% 求解优化问题
ops = sdpsettings('solver','gurobi');
optimize(constraints, -objective, ops);
3.2.3 不确定性建模
采用多场景方法处理不确定性:
matlab复制% 生成故障场景
nScenarios = 100;
scenarios = struct();
for s = 1:nScenarios
% 随机生成线路故障状态
scenarios(s).line_status = rand(nBranches,1) < p_failure;
% 随机生成道路通行状态
scenarios(s).road_status = rand(nRoads,1) < p_block;
end
% 筛选代表性场景
[selectedScenarios, entropy] = scenarioReduction(scenarios, 5);
4. 案例分析
4.1 IEEE 33节点系统
4.1.1 系统参数
- 33个节点,32条支路
- 基准电压:12.66 kV
- 总负荷:3.72 MW + 2.30 MVar
- MPS配置:3台MESS(200kWh),2台MEG(100kW)
4.1.2 优化结果
| 指标 | 确定性优化 | 鲁棒优化 | 提升 |
|---|---|---|---|
| 关键负荷生存能力 | 68% | 82% | +20.6% |
| 完全恢复时间 | 10.5h | 8.2h | -21.9% |
| 预配置成本 | $12,400 | $14,200 | +14.5% |
关键发现:鲁棒优化虽然增加了约14.5%的预配置成本,但显著提升了系统在最坏情况下的性能表现,验证了鲁棒优化框架的有效性。
4.2 IEEE 123节点系统
4.2.1 系统参数
- 123个节点,122条支路
- 基准电压:4.16 kV
- 总负荷:8.56 MW + 5.32 MVar
- MPS配置:8台MESS,5台MEG
4.2.2 优化结果
| 指标 | 传统方法 | 本文方法 | 提升 |
|---|---|---|---|
| 24h负荷恢复率 | 75% | 95% | +26.7% |
| 最大负荷损失 | 2.1 MW | 0.8 MW | -61.9% |
| 系统分区数量 | 1 | 3 | - |
系统分区策略:通过将大型配电网划分为多个由MPS支撑的微电网孤岛,显著提升了局部区域的供电可靠性。
5. 关键代码解析
5.1 主问题求解(main33_RO.m)
matlab复制function [x_opt, eta_opt, iter] = solveMasterProblem(scenarios)
% 初始化
nBuses = 33; nMPS = 2;
x = binvar(nBuses, nMPS, 'full');
eta = sdpvar(1);
% 构建初始主问题
constraints = [];
for s = 1:length(scenarios)
% 添加场景相关约束
[A_s, b_s] = getScenarioConstraints(scenarios(s));
constraints = [constraints, A_s*[x(:); eta] <= b_s];
end
% 添加通用约束
constraints = [constraints, sum(x,1) <= mps_available];
% 求解
options = sdpsettings('verbose',0,'solver','gurobi');
optimize(constraints, eta, options);
x_opt = value(x);
eta_opt = value(eta);
end
5.2 子问题求解(subproblem33.m)
matlab复制function [worstScenario, obj] = solveSubproblem(x_fixed)
% 使用对偶变换处理双层问题
yalmip('clear');
% 定义不确定性变量
xi = binvar(nLines,1); % 线路故障状态
% 定义第二阶段变量
z = sdpvar(nBuses, nMPS, T, 'full');
% 构建子问题目标
obj = -sum(sum(sum(P_loss))); % 最大化负荷损失
% 添加约束
constraints = [uncertaintySet(xi),...
operationConstraints(z, xi, x_fixed)];
% 求解
optimize(constraints, obj, options);
worstScenario.xi = value(xi);
worstScenario.obj = -value(obj); % 转换为最小化问题
end
6. 实践建议与注意事项
6.1 参数调优经验
-
鲁棒性参数选择:
- 不确定性预算Γ控制保守程度,建议通过敏感性分析确定:
matlab复制Gamma_range = 0:0.1:1; % 测试不同Γ值 results = arrayfun(@(g) evaluateRobustness(g), Gamma_range); plot(Gamma_range, [results.cost], Gamma_range, [results.performance]);- 实际工程中Γ=0.6~0.8通常能平衡性能与成本
-
权重系数设置:
- 关键负荷权重应比普通负荷高1-2个数量级
- 运输成本系数α建议取单位运输成本($/km)的倒数
6.2 常见问题排查
-
模型不可行:
- 检查虚拟流约束是否形成闭环
- 验证MPS容量是否足够支撑关键负荷
matlab复制if any(sum(load_critical) > mps_capacity) error('MPS容量不足支撑关键负荷'); end -
算法不收敛:
- 增加最大迭代次数(默认100次可能不够)
- 添加收敛容差(如相对差距<1%时提前终止)
matlab复制options = sdpsettings('cg.tol', 0.01, 'cg.maxiter', 200); -
求解时间过长:
- 采用场景削减技术减少场景数量
- 使用warm-start加速迭代过程
matlab复制% 使用确定性优化结果作为初始解 x_init = solveDeterministicCase(); assign(x, x_init);
6.3 扩展应用建议
-
与分布式电源协同:
matlab复制% 在功率平衡约束中加入光伏出力 P_inj = P_grid + P_pv - P_load - P_charge + P_discharge; -
考虑交通拥堵:
matlab复制% 动态调整MPS移动时间 tau_ij = base_time * (1 + congestion_level); -
多时间尺度优化:
- 预配置阶段:小时级决策
- 动态调度阶段:分钟级调整
matlab复制% 定义不同时间尺度 time_steps.coarse = 0:1:24; % 小时 time_steps.fine = 0:0.1:24; % 10分钟
在实际部署中发现,将MPS预配置在电网拓扑的中心位置(如度中心性最高的节点)通常能获得较好的覆盖效果,但在负荷分布不均匀时需要结合电气距离进行调整。一个实用的技巧是使用电压灵敏度分析确定关键节点:
matlab复制[V, Q] = calcVoltageSensitivity(network);
critical_nodes = find(Q > quantile(Q, 0.9)); % 选择灵敏度最高的10%节点
对于大规模系统(节点数>500),建议采用分层优化方法,先对网络进行分区聚类,再在各分区内独立优化,最后协调全局资源分配。这种方法虽然损失了一定全局最优性,但能大幅降低计算复杂度。