基于逐次凸近似(Successive Convex Approximation)的非凸二次规划问题求解---MATLAB程序

本文主要是介绍基于逐次凸近似(Successive Convex Approximation)的非凸二次规划问题求解---MATLAB程序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文引用了上海财经大学崔雪婷老师最优化理论与方法课程,课程链接如下:

【最优化理论与方法-第十二讲-二次规划】 https://www.bilibili.com/video/BV1vQ4y1P77A/?p=4&share_source=copy_web&vd_source=ec4b99096a4967b6330aae8eaef5e99b

崔老师讲最优化讲的特别好!满分推荐!

逐次凸近似(Successive Convex Approximation, SCA)是一种优化算法,主要应用于求解非凸优化问题。它的基本思想是将一个非凸问题转化为包含多个凸子问题的序列,通过不断的求解凸子问题逼近原问题的最优解。

 图1 非凸函数

现考虑如下非凸二次规划问题,其函数图像如图1所示。

问题1

其中,

原问题的目标函数可以通过特征值分解转化为凸函数减去凸函数的形式,凸函数减去凸函数未必是凸函数

[V,D] = eig(Q);%计算A的特征值对角阵D和特征向量V,使AV=VD成立

其中,矩阵PN都是半正定矩阵,矩阵D的表达式如下所示:

其中,\lambda _{1},\lambda _{2},...,\lambda _{k}\geq 0,\lambda _{k+1},\lambda _{k+2},...< 0

原问题的目标函数可以转化为:

对目标函数的第二项-\left [ x,y \right ]N\left [ x,y \right ]^{T}在点\left ( x^{*},y^{*} \right )处进行凸近似,即在点\left ( x^{*},y^{*} \right )处进行一阶泰勒展开:

至此,原问题可转化为:

 问题2

这样一来,就可以将原来的非凸二次规划问题转化为凸二次规划问题进行求解。

定理:若\left ( x^{*},y^{*} \right )是问题2的最优解,则\left ( x^{*},y^{*} \right )必然是问题1的KKT点(在崔老师的视频中有证明)。

因此,只要找到一个点\left ( x^{*},y^{*} \right )使得\left ( x^{*},y^{*} \right )是问题二的最优解,即可求得原问题的近似最优解。(注意:SCA不能保证得到全局最优解,但解的质量较高)

读到这里,想必各位心中都会有一个疑问:\left ( x^{*},y^{*} \right )点要这么确定呢?SCA算法就是为了找到这样一个点\left ( x^{*},y^{*} \right ),算法步骤如下所示:

1)令k=0,\varepsilon=1\times 10^{-6},取\left ( x_{k},y_{k} \right )\epsilon feasible\: \: region(初值对结果的影响较大,建议取可行域中点);

2)求解近似优化问题(即问题2),得到子问题最优解\left ( x_{k+1},y_{k+1} \right );

3)若\left \| \left ( x_{k+1},y_{k+1} \right )\\ -\, \left ( x_{k},y_{k} \right )\ \right \|\leqslant \varepsilon,输出\left ( x_{k+1},y_{k+1} \right );否则,令k=k+1,转至2)。

MATLAB程序:

clear all
close all
clcQ=[1,0.5;0.5,-1];x=sdpvar(2,1);
xmin=-1;
xmax=1;
Constraints=[];
Constraints=[Constraints,xmin<=x<=xmax];
ops = sdpsettings('solver', 'gurobi', 'verbose', 0);[V,D] = eig(Q);%计算A的特征值对角阵D和特征向量V,使AV=VD成立
lambda_P=D;
lambda_N=-D;
lambda_P(find(D<0))=0;
lambda_N(find(D>0))=0;
P=V*lambda_P*V';
N=V*lambda_N*V';
x0=[0.5;0.5];
x_temp=x0;
while(1)f_k=(x'*P*x-2*x_temp'*N*x+x_temp'*N*x_temp);sol=solvesdp(Constraints,f_k,ops);display([sol.info,' 目标函数值:',num2str(value(x_temp'*Q*x_temp))])x_temp_before=x_temp;x_temp=value(x);if sqrt(sum((x_temp-x_temp_before).^2)/length(x_temp))<1e-10breakend
end
x_result=x_tempX = gridsamp([-1 -1;1 1], 40);
[m,~]=size(X);
YX=zeros(m,1);
for i=1:size(X,1)x=X(i,:);y=x*Q*x';YX(i)=y;
end
X1 = reshape(X(:,1),40,40); X2 = reshape(X(:,2),40,40);
YX = reshape(YX, size(X1));
figure(1), mesh(X1, X2, YX)%绘制预测表面
hold on
scatter3(x_temp(1),x_temp(2),x_temp'*Q*x_temp,200,'r','pentagram','filled')

结果展示:

原问题:

clear all
close all
clcx=sdpvar(2,1);
xmin=-1;
xmax=1;
Constraints=[];
Constraints=[Constraints,xmin<=x<=xmax];
Q=[1,0.5;0.5,-1];
[V,D] = eig(Q);%计算A的特征值对角阵D和特征向量V,使AV=VD成立
lambda_P=D;
lambda_N=-D;
lambda_P(find(D<0))=0;
lambda_N(find(D>0))=0;
P=V*lambda_P*V';
N=V*lambda_N*V';
% P-N
f=x'*Q*x;%x(1)^2-x(2)^2+x(1)*x(2)
% x'*P*x-x'*N*x
ops = sdpsettings('solver', 'gurobi', 'verbose', 0);
sol=solvesdp(Constraints,f,ops);
x=value(x);
display([sol.info,' 目标函数值:',num2str(value(x'*Q*x))])

问题属性:对于非凸二次规划问题,gurobi会将原问题转化为MIP问题进行求解,如图2所示。本文举的例子比较简单,gurobi可以在短时间内求解成功,但对于大规模的非凸二次规划问题,使用gurobi进行求解会面临NP-Hard问题,计算负担较大,用SCA算法可以大大缩短计算时间。

图2

其他子函数:

function  S = gridsamp(range, q)
%GRIDSAMP  n-dimensional grid over given range
%
% Call:    S = gridsamp(range, q)
%
% range :  2*n matrix with lower and upper limits
% q     :  n-vector, q(j) is the number of points
%          in the j'th direction.
%          If q is a scalar, then all q(j) = q
% S     :  m*n array with points, m = prod(q)% hbn@imm.dtu.dk  
% Last update June 25, 2002[mr n] = size(range);    dr = diff(range);
if  mr ~= 2 | any(dr < 0)error('range must be an array with two rows and range(1,:) <= range(2,:)')
end 
sq = size(q);
if  min(sq) > 1 | any(q <= 0)error('q must be a vector with non-negative elements')
end
p = length(q);   
if  p == 1,  q = repmat(q,1,n); 
elseif  p ~= nerror(sprintf('length of q must be either 1 or %d',n))
end % Check for degenerate intervals
i = find(dr == 0);
if  ~isempty(i),  q(i) = 0*q(i); end% Recursive computation
if  n > 1A = gridsamp(range(:,2:end), q(2:end));  % Recursive call[m p] = size(A);   q = q(1);S = [zeros(m*q,1) repmat(A,q,1)];y = linspace(range(1,1),range(2,1), q);k = 1:m;for  i = 1 : qS(k,1) = repmat(y(i),m,1);  k = k + m;end
else    S = linspace(range(1,1),range(2,1), q).';
end

这篇关于基于逐次凸近似(Successive Convex Approximation)的非凸二次规划问题求解---MATLAB程序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/222788

相关文章

IDEA和GIT关于文件中LF和CRLF问题及解决

《IDEA和GIT关于文件中LF和CRLF问题及解决》文章总结:因IDEA默认使用CRLF换行符导致Shell脚本在Linux运行报错,需在编辑器和Git中统一为LF,通过调整Git的core.aut... 目录问题描述问题思考解决过程总结问题描述项目软件安装shell脚本上git仓库管理,但拉取后,上l

idea npm install很慢问题及解决(nodejs)

《ideanpminstall很慢问题及解决(nodejs)》npm安装速度慢可通过配置国内镜像源(如淘宝)、清理缓存及切换工具解决,建议设置全局镜像(npmconfigsetregistryht... 目录idea npm install很慢(nodejs)配置国内镜像源清理缓存总结idea npm in

pycharm跑python项目易出错的问题总结

《pycharm跑python项目易出错的问题总结》:本文主要介绍pycharm跑python项目易出错问题的相关资料,当你在PyCharm中运行Python程序时遇到报错,可以按照以下步骤进行排... 1. 一定不要在pycharm终端里面创建环境安装别人的项目子模块等,有可能出现的问题就是你不报错都安装

idea突然报错Malformed \uxxxx encoding问题及解决

《idea突然报错Malformeduxxxxencoding问题及解决》Maven项目在切换Git分支时报错,提示project元素为描述符根元素,解决方法:删除Maven仓库中的resolv... 目www.chinasem.cn录问题解决方式总结问题idea 上的 maven China编程项目突然报错,是

Python爬虫HTTPS使用requests,httpx,aiohttp实战中的证书异步等问题

《Python爬虫HTTPS使用requests,httpx,aiohttp实战中的证书异步等问题》在爬虫工程里,“HTTPS”是绕不开的话题,HTTPS为传输加密提供保护,同时也给爬虫带来证书校验、... 目录一、核心问题与优先级检查(先问三件事)二、基础示例:requests 与证书处理三、高并发选型:

java程序远程debug原理与配置全过程

《java程序远程debug原理与配置全过程》文章介绍了Java远程调试的JPDA体系,包含JVMTI监控JVM、JDWP传输调试命令、JDI提供调试接口,通过-Xdebug、-Xrunjdwp参数配... 目录背景组成模块间联系IBM对三个模块的详细介绍编程使用总结背景日常工作中,每个程序员都会遇到bu

前端导出Excel文件出现乱码或文件损坏问题的解决办法

《前端导出Excel文件出现乱码或文件损坏问题的解决办法》在现代网页应用程序中,前端有时需要与后端进行数据交互,包括下载文件,:本文主要介绍前端导出Excel文件出现乱码或文件损坏问题的解决办法,... 目录1. 检查后端返回的数据格式2. 前端正确处理二进制数据方案 1:直接下载(推荐)方案 2:手动构造

uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)

《uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)》在uni-app开发中,文件上传和图片处理是很常见的需求,但也经常会遇到各种问题,下面:本文主要介绍uni-app小程序项目中实... 目录方式一:使用<canvas>实现图片压缩(推荐,兼容性好)示例代码(小程序平台):方式二:使用uni

Python绘制TSP、VRP问题求解结果图全过程

《Python绘制TSP、VRP问题求解结果图全过程》本文介绍用Python绘制TSP和VRP问题的静态与动态结果图,静态图展示路径,动态图通过matplotlib.animation模块实现动画效果... 目录一、静态图二、动态图总结【代码】python绘制TSP、VRP问题求解结果图(包含静态图与动态图

MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决

《MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决》MyBatis默认开启一级缓存,同一事务中循环调用查询方法时会重复使用缓存数据,导致获取的序列主键值均为1,... 目录问题原因解决办法如果是存储过程总结问题myBATis有如下代码获取序列作为主键IdMappe