【机会约束、鲁棒优化】机会约束和鲁棒优化研究优化【ccDCOPF】研究(Matlab代码实现)

 👨‍🎓个人主页

💥💥💞💞欢迎来到本博客❤️❤️💥💥

🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。

⛳️座右铭:行百里者,半于九十。

📋📋📋本文目录如下:🎁🎁🎁

目录

💥1 概述

机会约束、鲁棒优化与ccDCOPF研究综述

1. 机会约束规划(Chance Constrained Programming, CCP)在电力系统中的应用

2. 鲁棒优化(Robust Optimization, RO)在电力系统中的应用

3. 机会约束与鲁棒优化的协同方法

4. ccDCOPF中的协同优化实现

5. 研究趋势与挑战

6. 结论

📚2 运行结果

🎉3 参考文献

🌈4 Matlab代码实现


💥1 概述

随机规划的三个分支分别为期望值模型、机会约束规划和相关机会规划。机会约束规划是继期望值模型之后,由A. Charnes和 W.W. Cooper于 1959年提出的第二类随机规划[33]。CCP是考虑到所做决策在不利情况发生时可能不满足约束条件而采用的一种原则:即允许所做决策在一定程度上不满足约束条件,但该决策使约束条件成立的概率不小于某一置信水平。一般形式的机会约束可表示为:

CCP 是处理随机规划问题的经典方法之一,其主要利用概率形式约束处理约束条件中含有随机变量的优化问题,CCP 方法具有以下特点:

(1)为了有效处理含随机变量的约束问题,CCP 将传统规划模型中的硬约束变为概率形式约束,以实现考虑随机变量的大概率事件,减小低概率极端事件对最优解的影响,一定程度上提高了最优解的合理性。

(2)对于问题中的随机变量,仅在约束中以机会约束的形式进行体现,未在目标函数中予以反映,而规划问题的最优解与概率约束的置信水平直接相关,且其置信水平可根据决策者的风险偏好或实际经验进行设定。

(3)当模型中含有多个机会约束时,在优化过程中将予以同等对待,无主次顺序之分。

(4)CCP 模型的求解过程中常需利用 MCS 过程和智能算法,其求解过程较为复杂,求解效率与结果质量都受到一定影响;若通过解析法求解则需较复杂的数学推导,以上因素在一定程度上了限制了 CCP 方法在复杂问题中的应用。

机会约束、鲁棒优化与ccDCOPF研究综述

1. 机会约束规划(Chance Constrained Programming, CCP)在电力系统中的应用

机会约束允许约束条件以一定概率成立,适用于处理电力系统中的随机性(如可再生能源出力、负荷波动)。其核心思想是将传统刚性约束转化为概率形式,例如:

  • 线路热极限约束:节点i到j的功率绝对值不超过线路热极限的概率≥ε_ij。
  • 发电机出力约束:发电机i的出力满足技术限制的概率≥ε_i。

典型应用场景

  • 多能源系统优化:如风-光-水-气-火-储联合调度,通过机会约束处理可再生能源出力不确定性,提升消纳能力。
  • 电力电量平衡:考虑水库调度和检修计划对发电能力的影响,建立机会约束模型以最小化调整成本。
  • 微电网优化:将购电购气功率约束转化为概率形式,提高系统运行灵活性。

求解方法

  • 确定性转化:假设随机变量服从特定分布(如正态分布),利用分位数或CVaR(条件风险价值)将机会约束转化为确定性约束。
  • 智能算法:当分布未知时,采用蒙特卡洛抽样结合遗传算法或粒子群算法求解。
2. 鲁棒优化(Robust Optimization, RO)在电力系统中的应用

鲁棒优化以最坏场景下的可行性为目标,适用于高不确定性环境。其核心是构建不确定性集合(如多面体、Wasserstein球)并求解max-min双层优化问题:

  • 经济调度:考虑风电出力不确定性,构建两阶段鲁棒模型优化备用容量。
  • 配电网优化:针对分布式电源和负荷不确定性,采用列约束生成(CCG)算法求解动态无功优化。
  • 微电网协同:通过鲁棒模型协调储能、需求响应与可控电源,提升系统抗干扰能力。

典型模型

  • 两阶段鲁棒优化:第一阶段确定机组组合,第二阶段调整出力应对不确定性。
  • 分布鲁棒优化(DRO) :结合数据驱动方法,利用历史数据构建模糊集,平衡保守性与经济性。
3. 机会约束与鲁棒优化的协同方法

协同优化的核心在于结合CCP的概率灵活性和RO的保守性保障,常见策略包括:

3.1 数据驱动的不确定性建模

  • 高斯混合模型:构造风电预测误差和负荷偏差的联合分布,提升鲁棒性描述的准确性。
  • Wasserstein距离:基于历史数据构建分布鲁棒集合,将机会约束转化为混合整数线性规划问题。

3.2 多目标协同优化

  • 鲁棒性作为优化目标:将鲁棒性与经济性、环保性共同纳入目标函数,通过帕累托前沿分析最优权衡。
  • 分类概率机会约束:区分不同不确定性来源的分布特性,构建分类约束以细化鲁棒性控制。

3.3 模型转化与求解

  • 二阶锥松弛(SOCP) :将非凸的潮流约束转化为二阶锥形式,结合拉格朗日对偶简化模型。
  • 分布鲁棒机会约束:利用Wasserstein球定义模糊集,将双层优化问题转化为单层凸优化。
4. ccDCOPF中的协同优化实现

4.1 模型构建
以机会约束直流最优潮流(ccDCOPF)为例,其协同优化框架包括:

  1. 不确定性建模:采用数据驱动方法(如经验分布或核密度估计)描述风电、负荷的随机性。
  2. 机会约束设计:定义关键约束(如线路功率、电压幅值)的置信水平(如95%)。
  3. 鲁棒性增强:引入鲁棒不确定性集合(如多面体或椭球集),限制最坏场景下的越限风险。

4.2 求解算法

  • Matlab实现:利用YALMIP工具箱和CPLEX/Gurobi求解器处理混合整数规划。
  • 分布式优化:针对大规模系统,采用ADMM或RADMM算法实现电-气网络的分布式协同。

4.3 案例研究

  • 光热电站微网:结合高斯混合模型和机会约束,构建鲁棒经济调度模型,实现风光出力与负荷波动的协同优化。
  • 移动氢能系统:采用分布鲁棒机会约束处理加氢需求不确定性,优化制-储-运氢路径。
5. 研究趋势与挑战
  • 数据-模型融合:深度学习与鲁棒优化的结合,如用GAN生成不确定性场景。
  • 多时间尺度优化:日前-实时两阶段模型,结合随机-鲁棒混合方法提升调度灵活性。
  • 高维不确定性:针对高比例可再生能源系统,发展高效降维与稀疏化技术。
6. 结论

机会约束与鲁棒优化在ccDCOPF中的协同应用,能够兼顾经济性、安全性与鲁棒性。未来研究需进一步探索数据驱动建模、多目标权衡算法及大规模系统的高效求解方法,以应对新型电力系统的复杂不确定性挑战。

📚2 运行结果

 

 

部分代码:

clear; clc; close all;

fig_size = [10,10,800,400];
beta = 10^(-2);

% casename = 'ex_case3sc'; N = 100;
casename = 'ex_case24_ieee_rts'; N = 2048;

eps_scale = 0.01:0.01:0.1;

result_sa = load([casename,'-scenario approach-results.mat']);
result_ca = load([casename,'-convex approximation-type-results-N=',num2str(N),'.mat']);
result_saa = load([casename,'-sample average approximation-sampling and discarding-results-N=',num2str(N),'.mat']);
result_rc = load([casename,'-robust counterpart-results-N=',num2str(N),'.mat']);
% result_lb = load([casename,'-obj-lower-bound.mat']);

f_eps = figure('Position', fig_size);
lgd_str = {};
plot(eps_scale,eps_scale,'g-.','LineWidth',2), hold on, lgd_str = [lgd_str,'ideal case'];
plot(nanmean(result_sa.eps_pri,2), nanmean(result_sa.eps_empirical,2),'-x','LineWidth',2), hold on, lgd_str = [lgd_str,'SA:priori'];
plot(nanmean(result_sa.eps_post,2), nanmean(result_sa.eps_empirical,2),'-*','LineWidth',2), hold on, lgd_str = [lgd_str,'SA:posteriori'];
plot(result_saa.epsilons, nanmean(result_saa.eps_empirical,2),'-o','LineWidth',2), hold on, lgd_str = [lgd_str,'SAA:s&d'];
plot(result_rc.eps, nanmean(result_rc.eps_empirical_box,2)*ones(size(result_rc.eps)),'--v','LineWidth',2), hold on, lgd_str = [lgd_str,'RC:box'];
% plot(result_rc.eps, nanmean(result_rc.eps_empirical_ball,2),':v','LineWidth',2), hold on, lgd_str = [lgd_str,'RC:ball'];
% plot(result_rc.eps, nanmean(result_rc.eps_empirical_ballbox,2),'-v','LineWidth',2), hold on, lgd_str = [lgd_str,'RC:ballbox'];
% plot(result_rc.eps, nanmean(result_rc.eps_empirical_budget,2),'-.v','LineWidth',2), hold on, lgd_str = [lgd_str,'RC:budget'];
plot(result_ca.eps, nanmean(result_ca.eps_empirical,2),'-d','LineWidth',2), hold on, lgd_str = [lgd_str,'CA:markov'];
legend(lgd_str,'Location','NorthWest')
set(gca,'yscale','log')
% xlim([0,0.9]), ylim([1e-4 10])
xlim([0,0.12]), ylim([1e-3 0.2])
xlabel('violation probability (setting)'),ylabel('violation probability (out-of-sample)')
set(gca,'FontSize',12,'fontname','times')
print(f_eps,'-depsc','-painters',[casename,'-all-methods-epsilon.eps'])
 
f_eps_err = figure('Position', fig_size);
lgd_str = {};
% plot(eps_scale,eps_scale,'g-.','LineWidth',2), hold on, lgd_str = [lgd_str,'ideal case'];
errorbar(nanmean(result_sa.eps_pri,2), nanmean(result_sa.eps_empirical,2),nanstd(result_sa.eps_empirical,[],2),'-x','LineWidth',2), hold on, lgd_str = [lgd_str,'SA:priori'];
errorbar(nanmean(result_sa.eps_post,2), nanmean(result_sa.eps_empirical,2),nanstd(result_sa.eps_empirical,[],2),'-*','LineWidth',2), hold on, lgd_str = [lgd_str,'SA:posteriori'];
errorbar(result_saa.epsilons, nanmean(result_saa.eps_empirical,2),nanstd(result_saa.eps_empirical,[],2),'-o','LineWidth',2), hold on, lgd_str = [lgd_str,'SAA:s&d'];
plot(result_rc.eps, nanmean(result_rc.eps_empirical_box,2)*ones(size(result_rc.eps)),'--v','LineWidth',2), hold on, lgd_str = [lgd_str,'RC:box'];
errorbar(result_rc.eps, nanmean(result_rc.eps_empirical_ball,2),nanstd(result_rc.eps_empirical_ball,[],2),':v','LineWidth',2), hold on, lgd_str = [lgd_str,'RC:ball'];
errorbar(result_rc.eps, nanmean(result_rc.eps_empirical_ballbox,2),nanstd(result_rc.eps_empirical_ballbox,[],2),'-v','LineWidth',2), hold on, lgd_str = [lgd_str,'RC:ballbox'];
% errorbar(result_rc.eps, nanmean(result_rc.eps_empirical_budget,2),nanstd(result_rc.eps_empirical_budget,[],2),'-.v','LineWidth',2), hold on,
errorbar(result_ca.eps, nanmean(result_ca.eps_empirical,2), nanstd(result_ca.eps_empirical,[],2),'-d','LineWidth',2), hold on, lgd_str = [lgd_str,'CA:markov'];
legend(lgd_str,'Location','NorthWest')
% xlim([0,0.12])
xlim([0,0.09])
% ylim([0,0.09])
xlabel('violation probability (setting)'),ylabel('violation probability (out-of-sample)')
set(gca,'FontSize',12,'fontname','times')
print(f_eps_err,'-depsc','-painters',[casename,'-all-methods-epsilon-errorbar.eps'])

f_obj = figure('Position', fig_size);
lgd_str = {};
% plot(result_lb.epsilons, result_lb.obj_low, ':^'), hold on,
% plot(nanmean(result_sa.eps_pri,2), nanmean(result_sa.obj,2),'-x','LineWidth',2), hold on, lgd_str = [lgd_str,'SA:priori'];
% plot(nanmean(result_sa.eps_post,2), nanmean(result_sa.obj,2),'-*','LineWidth',2), hold on, lgd_str = [lgd_str,'SA:posteriori'];
% plot(result_saa.epsilons, nanmean(result_saa.obj,2),'-o','LineWidth',2), hold on, lgd_str = [lgd_str,'SAA:s&d'];
plot(result_rc.eps, nanmean(result_rc.obj_box,2)*ones(size(result_rc.eps)),'--v','LineWidth',2), hold on, lgd_str = [lgd_str,'RC:box'];
plot(result_rc.eps, nanmean(result_rc.obj_ball,2),':v','LineWidth',2), hold on, lgd_str = [lgd_str,'RC:ball'];
plot(result_rc.eps, nanmean(result_rc.obj_ballbox,2),'-v','LineWidth',2), hold on, lgd_str = [lgd_str,'RC:ballbox'];
% plot(result_rc.eps, nanmean(result_rc.obj_budget,2),'-.v','LineWidth',2), hold on,
% plot(result_ca.eps, nanmean(result_ca.obj, 2),'-d','LineWidth',2), hold on, lgd_str = [lgd_str,'CA:markov'];
legend(lgd_str)
xlabel('violation probability \epsilon (setting)'),ylabel('objective value')
xlim([0 0.1])
set(gca,'FontSize',12,'fontname','times')
print(f_obj,'-depsc','-painters',[casename,'-all-methods-objective.eps'])
 

% f_obj_emp = figure('Position', fig_size);
% % plot(result_lb.epsilons, result_lb.obj_low,'-^'), hold on,
% [result_sa_eps_empirical,indices] = sort( nanmean(result_sa.eps_empirical,2),'ascend' );
% plot(result_sa_eps_empirical, nanmean(result_sa.obj(indices,:),2),'-v'), hold on,
% [result_saa_eps_empirical,indices] = sort( nanmean(result_saa.eps_empirical,2),'ascend' );
% plot(result_saa_eps_empirical, nanmean(result_saa.obj(indices,:),2),'-d'), hold on,
% [result_rc_eps_empirical_box,indices] = sort( nanmean(result_rc.eps_empirical_box,2),'ascend' );
% plot(result_rc_eps_empirical_box, nanmean(result_rc.obj_box(indices,:),2),'-*'), hold on,
% [result_rc_eps_empirical_ball,indices] = sort( nanmean(result_rc.eps_empirical_ball,2),'ascend' );
% plot(result_rc_eps_empirical_ball, nanmean(result_rc.obj_ball(indices,:),2),'-*'), hold on,
% [result_rc_eps_empirical_ballbox,indices] = sort( nanmean(result_rc.eps_empirical_ballbox,2),'ascend' );
% plot(result_rc_eps_empirical_ballbox, nanmean(result_rc.obj_ballbox(indices,:),2),'-x'), hold on,
% [result_rc_eps_empirical_budget,indices] = sort( nanmean(result_rc.eps_empirical_budget,2),'ascend' );
% plot(result_rc_eps_empirical_budget, nanmean(result_rc.obj_budget(indices,:),2),'-x'), hold on,
% [result_ca_eps_empirical,indices] = sort( nanmean(result_ca.eps_empirical,2),'ascend' );
% plot(result_ca_eps_empirical, nanmean(result_ca.obj,2),'-d','LineWidth',2), hold on,
% % legend('lower bound','SA','SAA:s&d','RC:box','RC:ball','RC:ballbox','RC:budget')
% legend('SA','SAA:s&d','RC:box','RC:ball','RC:ballbox','RC:budget','CA:markov')
% set(gca,'xscale','log')
% xlim([0 0.06])

🎉3 参考文献

部分理论来源于网络,如有侵权请联系删除。

[1]付波,邓竞成,康毅恒.基于机会约束的园区综合能源系统优化调度[J].湖北工业大学学报,2023,38(01):11-14+32.

[2]耿晓路. 分布鲁棒机会约束优化问题的研究[D].湘潭大学,2018.

[3]王扬. 基于机会约束目标规划的含风电电力系统优化调度研究[D].华北电力大学(北京),2017.

🌈4 Matlab代码实现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值