1. 项目背景与核心挑战
电力市场改革背景下,售电商面临双重压力:上游需要从多级电力市场(包括中长期市场、现货市场、实时平衡市场等)进行购电决策,下游需要设计有竞争力的零售套餐吸引终端用户。这种双向决策过程本质上构成了典型的Stackelberg主从博弈模型——售电商作为领导者(Leader)制定零售套餐,用户作为跟随者(Follower)根据电价策略调整用电行为。
主从博弈(Stackelberg Game)是博弈论中描述层级决策结构的经典模型,其核心特征是决策存在先后顺序,后行动者(Follower)能够观察到先行动者(Leader)的策略并做出最优响应。在电力市场场景中,这种模型特别适合描述售电商与用户之间的策略互动关系。
2. 多元零售套餐设计方法论
2.1 套餐结构设计原则
多元零售套餐通常包含以下核心要素:
- 基础电价(固定费用+浮动费率)
- 分时电价(TOU)结构设计
- 用电量阶梯折扣机制
- 可再生能源积分奖励
在Matlab中,我们可以用结构体数组表示套餐组合:
matlab复制retail_plan = struct(...
'fixed_fee', [10, 5, 0],... % 月固定费(元)
'unit_price', [0.5, 0.6, 0.7],... % 基础电价(元/kWh)
'time_price', {... % 分时电价系数
[1.2, 1.0, 0.8],... % 套餐1的峰平谷系数
[1.3, 1.1, 0.7],... % 套餐2的峰平谷系数
[1.1, 0.9, 0.6]},... % 套餐3的峰平谷系数
'discount_threshold', [300, 500, 700],... % 折扣电量阈值(kWh)
'discount_rate', [0.05, 0.08, 0.1]...% 超额部分折扣率
);
2.2 用户响应建模
用户对电价套餐的响应通常采用价格弹性矩阵来描述。短期弹性矩阵可以表示为:
code复制E = [e_11, e_12, ..., e_1n
e_21, e_22, ..., e_2n
...
e_m1, e_m2, ..., e_mn]
其中e_ij表示第i时段电价变化对第j时段用电量的影响系数。在Matlab中可通过历史数据回归得到。
3. 多级市场购电策略优化
3.1 市场结构建模
典型的三级电力市场包括:
- 中长期合约市场(提前1年-1月)
- 日前现货市场(提前1天)
- 实时平衡市场(提前1小时)
每个市场的价格波动特征不同,需要分别建立概率模型:
matlab复制% 中长期价格服从对数正态分布
long_term_mu = log(350) - 0.5*0.2^2;
long_term_price = lognrnd(long_term_mu, 0.2, [1,10000]);
% 日前价格采用均值回归模型
day_ahead_price = zeros(24,1);
for t = 1:24
day_ahead_price(t) = 300 + 50*sin(2*pi*(t-6)/24) + 20*randn();
end
% 实时价格考虑尖峰特性
real_time_price = day_ahead_price + 10*randn(24,1);
real_time_price(18:20) = real_time_price(18:20) + 50*rand(3,1);
3.2 购电组合优化
购电决策可建模为随机规划问题:
code复制min E[总购电成本] + λ*风险度量
s.t.
∑购电量 ≥ 预测需求 + 备用容量
各市场购电量 ≤ 市场容量限制
对应的Matlab实现采用fmincon求解器:
matlab复制options = optimoptions('fmincon','Algorithm','sqp','Display','iter');
[x,fval] = fmincon(@(x) objective_func(x,price_scenarios),...
x0,[],[],[],[],lb,ub,...
@(x) constraints_func(x,demand_forecast),...
options);
4. 主从博弈均衡求解
4.1 双层优化问题构建
上层问题(售电商利润最大化):
code复制max π = 零售收入 - 购电成本
s.t. 零售套餐设计约束
下层问题(用户成本最小化):
code复制min 用户电费支出
s.t. 用电行为模型
4.2 KKT条件转化
将下层问题用KKT条件代替,转化为单层优化问题。Matlab实现关键步骤:
matlab复制% 定义符号变量
syms p1 p2 d1 d2 lambda
% 下层问题拉格朗日函数
L = p1*d1 + p2*d2 + lambda*(D - d1 - d2);
% KKT条件
kkt1 = diff(L,d1) == 0;
kkt2 = diff(L,d2) == 0;
kkt3 = lambda*(D - d1 - d2) == 0;
4.3 均衡求解算法
采用启发式迭代算法:
- 售电商初始化零售套餐
- 用户优化模块计算最优响应
- 售电商根据响应更新套餐
- 重复2-3直到策略收敛
Matlab主循环结构:
matlab复制while norm(new_plan - old_plan) > tolerance
% 用户响应模拟
[demand, cost] = user_optimization(retail_plan);
% 售电商策略更新
new_plan = retailer_optimization(demand, market_prices);
% 收敛判断
if norm(new_plan - old_plan) < tolerance
break;
end
old_plan = new_plan;
end
5. 仿真案例分析
5.1 参数设置
考虑包含3类用户(居民、商业、工业)的场景:
matlab复制user_params = {
% 类型 | 弹性系数 | 基础负荷(kWh) | 价格敏感度
'residential', -0.15, [2,2,1,1,1,2,3,4,4,3,3,3,3,3,4,5,6,7,8,7,6,5,4,3], 0.8;
'commercial', -0.25, [5,5,5,5,5,6,7,8,9,9,9,9,9,9,9,9,8,7,6,5,5,5,5,5], 1.2;
'industrial', -0.1, [10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10], 0.5
};
5.2 结果可视化
关键结果展示代码:
matlab复制figure('Position',[100,100,900,600])
subplot(2,2,1)
plot(1:iter, profit_history,'LineWidth',2)
title('售电商利润收敛过程')
subplot(2,2,2)
bar([wholesale_cost, retail_income, profit])
set(gca,'XTickLabel',{'购电成本','零售收入','净利润'})
title('收支结构分析')
subplot(2,2,3)
pie([sum(demand_res), sum(demand_com), sum(demand_ind)],...
{'居民','商业','工业'})
title('用户用电量占比')
subplot(2,2,4)
plot(1:24, day_ahead_price, 'b-',...
1:24, retail_price, 'r--', 'LineWidth',2)
legend('批发电价','零售电价')
xlabel('时段')
title('电价曲线对比')
6. 工程实现中的关键问题
6.1 计算效率优化
大规模问题求解技巧:
- 采用并行计算处理多场景:
matlab复制parfor i = 1:num_scenarios
[profit(i), decision(i)] = evaluate_scenario(scenario_data{i});
end
- 使用稀疏矩阵处理用户关联:
matlab复制elasticity_matrix = spdiags([-0.2*ones(24,1), 0.5*ones(24,1), -0.2*ones(24,1)],...
[-1,0,1],24,24);
6.2 不确定性处理
采用鲁棒优化方法应对价格波动:
matlab复制cvx_begin
variable x(n)
minimize( max( price_scenarios' * x ) )
subject to
A*x <= b
x >= 0
cvx_end
6.3 实际部署建议
- 数据预处理阶段:
- 用电数据异常值检测(3σ原则)
- 价格数据季节性分解
- 模型校准阶段:
- 弹性系数交叉验证
- 历史数据回测
- 在线运行阶段:
- 设置策略调整频率(如每月评估)
- 保留人工干预接口
