我是靠谱客的博主 昏睡八宝粥,最近开发中收集的这篇文章主要介绍YALMIP介绍及怎么在Matlab中加YALMIP、SDPT3前言YALMIP简介怎么在MatlabR2019a中加YALMIP?怎么将SDPT3配置到在MatlabR2019a中?,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

前言

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 = [t
eye(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:MatlabMatlab-appbinwin64mexopts(你自己的安装路径)
在这里插入图片描述
最后将其设置为matlab的临时环境变量:
1、在matlab命令窗口输入 setenv(‘MW_MINGW64_LOC’,‘D:MatlabMatlab-appbinwin64mexopts’) 并运行。
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.

最后

以上就是昏睡八宝粥为你收集整理的YALMIP介绍及怎么在Matlab中加YALMIP、SDPT3前言YALMIP简介怎么在MatlabR2019a中加YALMIP?怎么将SDPT3配置到在MatlabR2019a中?的全部内容,希望文章能够帮你解决YALMIP介绍及怎么在Matlab中加YALMIP、SDPT3前言YALMIP简介怎么在MatlabR2019a中加YALMIP?怎么将SDPT3配置到在MatlabR2019a中?所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(50)

评论列表共有 0 条评论

立即
投稿
返回
顶部