前言
SDP(SemiDefinite Programing,半定规划)是凸优化(Convex Optimization)的一种,最近我看的论文中经常出现。论文里总是把一个问题转化为 SDP,然后说一句"这个SDP问题可以被现成的SDP求解程序高效解决"。?????,这对于要复现文章代码的我来说怎么办呢?于是我只能靠自己去一探究竟了。
SDP 问题一般形式为:线性目标函数+一个等式约束+一个不等式约束+一个是LMI(Linear Matrix Inequality,线性矩阵不等式)约束。要解决此类问题,如今经过查阅各种资料发现是在Yalmip中应用SDPT3求解算法最好解决(欢迎批评指正)。那么YALMIP是什么?怎么在MatlabR2019a中加YALMIP?怎么将SDPT3配置到在MatlabR2019a中?下面我们一一解答。
YALMIP简介
yalmip是一位“集大成者”,它不仅自己包含基本的线性规划求解算法,比如linprog(线性规划)、bintprog(二值线性规划)、bnb(分支界定算法)等,他还提供了对cplex、GLPK、lpsolve等求解工具包更高层次的包装。更为可贵的是,yalmip真正实现了建模和算法二者的分离,它提供了一种统一的、简单的建模语言,针对所有的规划问题,都可以用这种统一的方式建模;至于用哪种求解算法,你只需要通过一次简单的参数配置指定就可以了,甚至不用你指定,yalmip会自动为你选择最适合的
总而言之,你只需要知道在matlab下如何用yalmip的方式建模,而不需要单独针对每一种工具包学习新的建模语法;而且yalmip 的建模语法非常简单,简单到你只需要记住四个命令就可以了:
1. 创建决策变量:
>> x = sdpvar(m, n,[option]):创建m*n的连续型决策变量矩阵,option是对矩阵的一些参数指定。如:x = sdpvar(m, n,‘full’)表示定义了一个全参数矩阵。
相应的,如果要创建整型或二值型决策变量,matlab语句分别为:
>> x = intvar(m, n, [option])
>> x = binvar(m, n, [option])
2. 添加约束:
>>constraint = [a,b,c]:用constraint表示所有约束,a、b、c分别表示一个约束。重要的是约束的表达也非常简单,例如如果有 x1 + x2 + x3 <= 3 的不等式约束,直接写:
>> x = sdpvar(3, 1); %创建了一个3*1的连续型决策变量矩阵
>> a = [sum(x)<=3]; ; %sum(x)表示 x1 + x2 + x3
3. 参数配置
这个比较简单,语句如下:
>> ops = sdpsettings(option1, value1, option2, value2, ……)
例如语句
>> ops = sdpsettings(‘solver’, ‘lpsolve’, ‘verbose’, 2);
‘solver’ 参数指定程序用lpsolve求解器(如果已经安装,否则会报错),如果不指定 ‘solver’ 参数,他会根据决策变量类型自动挑选已安装的、最适合的求解器;‘verbose’ 指定显示冗余度(冗余度越大,你就可以看到越详细的求解过程信息)。
4. 求解
就一句话:
>> solvesdp(F, f, ops) 求解一个数学规划(最小化)问题,该问题的目标函数由 f 指定,约束由 F 指定,ops指定求解参数,最后的结果存储在result结构体中。
以一个具体的例子说明用yalmip求解数学规划问题的方法。
假设我们要用matlab解决如下线性规划问题:
如果用yalmip的话,只需要如下简单几句Matlab语句:
t = sdpvar(1); % sdpvar声明变量
y = sdpvar(3,1,‘full’); %创建了一个31的连续型决策变量矩阵
F0 = [2 -0.5 -0.6; -0.5 2 0.4; -0.6 0.4 3];
F1 = [0 1 0; 1 0 0; 0 0 0];
F2 = [0 0 1; 0 0 0; 1 0 0];
F3 = [0 0 0; 0 0 1; 0 1 0];
a = [sum(y)==1]; % 等式约束
b = [0.7<=y(1)<=1, 0<=y(2)<=0.3, y(3)>=0]; %不等式约束
c = [teye(3)-(F0 + y(1)*F1 + y(2)*F2 + y(3)*F3)>=0]; % LMI约束
obj = t; %该问题的目标函数
constraint = [a,b,c];
ops = sdpsettings(‘solver’, ‘lpsolve’, ‘verbose’, 2); %配置参数,指定程序用 lpsolve求解器,指定显示冗余度为2
solvesdp(constraint,obj ,ops); %若求目标函数的最大值,只需将‘obj ’改为‘-obj’
double(y)
(如果你想用‘sdpt3’求解器求解,只需要将以上的‘solver’参数的‘lpsolve’改成‘sdpt3’,其他任何地方都不需要做改动)
除此以外,yalmip还支持几乎所有其他的求解算法,在matlab下输入yalmiptest命令可以得到所有支持的算法以及它们的安装状态(其中cplex和lpsolve是我安装的,其他status为found的表示默认支持,not found表示支持但matlab中还未安装):
yalmiptest
+++++++++++++++++++++++++++++++++++++++++++++++
| Searching for installed solvers |
+++++++++++++++++++++++++++++++++++++++++++++++
| Solver| Version/module| Status|
+++++++++++++++++++++++++++++++++++++++++++++++
| LPSOLVE| MXLPSOLVE| found|
| CPLEX| IBM| found|
| CPLEX| IBM| found|
| CPLEX| IBM| found|
| LINPROG| | found|
| QUADPROG| | found|
| LMILAB| | found|
| FMINCON| geometric| found|
| FMINCON| standard| found|
| FMINSEARCH| | found|
| BNB| | found|
| BINTPROG| | found|
| CUTSDP| | found|
| BMIBNB| | found|
| KKTQP| | found|
| NONE| | found|
| GUROBI| MEX| not found|
| CPLEX| CPLEXINT| not found|
| GLPK| GLPKMEX-CC| not found|
| GLPK| GLPKMEX| not found|
| CDD| CDDMEX| not found|
| NAG| e04mbf| not found|
| NAG| e04naf| not found|
| CLP| CLPMEX-LP| not found|
| XPRESS| MEXPRESS 1.1| not found|
| XPRESS| MEXPRESS 1.0| not found|
| XPRESS| FICO| not found|
| XPRESS| FICO| not found|
| QSOPT| MEXQSOPT| not found|
| OSL| OSLPROG| not found|
| MOSEK| LP/QP| not found|
| MOSEK| SOCP| not found|
| MOSEK| GEOMETRIC| not found|
| CPLEX| CPLEXMEX| not found|
| BPMPD| | not found|
| CLP| CLPMEX-QP| not found|
| OOQP| | not found|
| QPIP| | not found|
| QPAS| | not found|
| LINDO| MIQP| not found|
| SEDUMI| 1.1| not found|
| SEDUMI| 1.3| not found|
| SEDUMI| 1.05| not found|
| SEDUMI| 1.03| not found|
| SDPT3| 4| not found|
| SDPNAL| 0.1| not found|
| LOGDETPPA| 0.1| not found|
| SPARSECOLO| 0| not found|
| SDPT3| 3.1| not found| %SDPT3得自己安装
| SDPT3| 3.02| not found|
| SDPT3| 3.0| not found|
| SDPA| M| not found|
| DSDP| 5| not found|
| DSDP| 4| not found|
| SDPLR| | not found|
| CSDP| | not found|
| MAXDET| | not found|
| PENSDP| PENOPT| not found|
| PENSDP| TOMLAB| not found|
| PENBMI| PENOPT| not found|
| PENBMI| TOMLAB| not found|
| SDPNAL| | not found|
| LMIRANK| | not found|
| VSDP| 0.1| not found|
| MPT| | not found|
| MPLCP| | not found|
| KYPD| | not found|
| STRUL| 1| not found|
| PENNON| standard| not found|
| SNOPT| geometric| not found|
| SNOPT| standard| not found|
| LINDO| NLP| not found|
| IPOPT| standard| not found|
| IPOPT| geometric| not found|
| GPPOSY| | not found|
| SPARSEPOP| | not found|
| POWERSOLVER| | not found|
+++++++++++++++++++++++++++++++++++++++++++++++
有了yalmip,你不再需要针对每一种工具包去学习特定的建模语言(比如用cplex要专门学习cplex的建模语言,用lingo要专门学习lingo的建模语言,还有GLPK、lpsolve、Matlab自带的求解器等等,如果每一种求解器都要学习新的建模语言的话,这个工作量是可想而知的)。相反,如果你选择使用yalmip,那么你只需要学习yalmip一种建模语法,因为yalmip真正实现了建模和算法的分离,所有的问题都可以用统一的方法建模,如果需要使用不同的求解器,只需要一句简单的配置即可。因此,yalmip不仅仅是一个线性规划求解器,更强大的地方在于,它提供了一个统一的建模平台,支持现有的几乎所有的求解算法。有了yalmip,一切都变得简单起来。
怎么在MatlabR2019a中加YALMIP?
1.下载工具包
yalmip的官网地址:[link](http://users.isy.liu.se/johanl/yalmip/pmwiki.php?n=Main.HomePage).
下载地址:[link](https://yalmip.github.io/download/).
下载最新的一个YALMIP就行。
2.放置工具包
将yalmip工具包解压以后,放置到matlab安装目录的toolbox文件夹内。
3.添加路径
打开matlab,点击设置路径,英文版点击File->set path;
弹出对话框后,在左边选择“添加并包含子文件夹…”,(Add with subfolders…),选择toolbox目录下的yalmip文件夹,保存并关闭。(注意!!!路径中最好没有中文)
4.测试安装结果
重启matlab。在命令行中输入which sdpvar,which solvesdp,which intvar等命令,显示路径则表明添加成功。
怎么将SDPT3配置到在MatlabR2019a中?
1.下载SDPT3安装包
途径一:SDPT3官网:link.支持下载SDPT3-3.02和SDPT3-3.0两个版本。
途径二: link.可下载最新版本SDPT3-4.0。
在这里我选择了SDPT3-4.0版本:点击进入途径二链接,找到下图红框框部分点击即可下载SDPT3-4.0的安装包。
2.安装步骤
下载完成后,解压,将整个文件夹放入Matlab的bin文件夹中(将下载的SDPT3-4.0文件夹当作项目放入平时你们自己项目的文件夹即可),然后在Matlab软件中找到 Installmex.m运行,发现运行后发现如果matlab中未配置过支持的mex文件的编译器或者SDK是运行不了的。
3.下载安装支持MEX文件的编译器。
在主页附加功能——>获取附加功能弹出附加功能资源管理器
在搜索框输入MinGW即可找到需要的MinGW编译器,如果是R2017b及以后版本直接点安装就好。
安装过程中无任何操作步骤,你也不知安装在哪儿,这是最痛苦的地方,但经过各种资料查找我发现它的安装后的文件名一定为mexopts,所以只要在‘此电脑’中对‘mexopts’进行搜索,找到mexopts所在路径即找到了我们自己的安装路径。
安装完成之后还要配置环境变量,找到控制面板->系统和安全->系统->高级系统设置,再点击环境变量进入环境变量配置。
在用户变量一栏点击新建
变量名:MW_MINGW64_LOC
变量值:D:\Matlab\Matlab-app\bin\win64\mexopts(你自己的安装路径)
最后将其设置为matlab的临时环境变量:
1、在matlab命令窗口输入 setenv(‘MW_MINGW64_LOC’,‘D:\Matlab\Matlab-app\bin\win64\mexopts’) 并运行。
2、重启Matlab(记住一定要重启,我就是因为没重启一直装不上)
3、输入mex -setup测试是否成功。成功显示:
4.继续配置SDPT3
将Installmex.m加入路径,继续运行Installmex.m,又发现出现如下错误:
根据错误提示将SDPT3-4.0中的Solver文件夹复制一份在bin目录下,为了计算机能找到Mexfun文件。
(红框中的文件就是复制后的Solver文件,注意它的存在路径)
再运行Installmex.m文件,发现错误消失了~
运行Installmex.m文件成功后,在Matlab窗口输入’Installmex(1)‘命令,出现如下界面表示安装成功:
5.测试SDPT3安装结果
首先在Matlab命令行中输入‘startup’命令,不报任何错误;
其次在Matlab命令行中输入‘sqlpdemo’命令,出现如下界面:
再按enter,开始展示各种其内包含的算法,如下:
一直按enter到最后,且未出现任何报错,则表示你真的安装成功啦~
恭喜你坚持到最后哦~
奖励一颗糖~
本人第一次写博客,如有表述不当或者引用不当的地方,欢迎批评指正!
本文引用博客:
【1】link.
【2】link.
【3】link.
【4】link.
【5】link.
今天的文章matlab lyap_yalmip求解非线性优化问题分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/68781.html