前言

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:\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.

YALMIP介绍及怎么在Matlab中加YALMIP、SDPT3相关推荐

  1. matlab 中的 yalmip安装方法

    matlab 中的 yalmip安装方法 在 https://yalmip.github.io/download/ 网站上下载 yalmip ,根据自己的需求下载想要的版本 . 将下载好的文件解压后, ...

  2. 路径调度问题(CVRP)后续之如何在MATLAB中安装YALMIP及CPLEX包

    订阅博主专栏的用户可私信博主获取安装包,不用额外再付费下载安装包. 安装包下载地址:https://download.csdn.net/download/wenyusuran/14954633 一.M ...

  3. MATLAB中安装YALMIP及CPLEX详细步骤

    一.MATLAB中安装YALMIP (YALMIP压缩包下载链接:链接:百度网盘 请输入提取码 密码:ujfp) 1.下载YALMIP-master工具压缩包,YALMIP-master工具压缩包解压 ...

  4. 介绍一种在MATLAB中获取股市数据的方法

    介绍一种在MATLAB中获取股市数据的方法: >>clear >>c=yahoo 系统会返回 c = url: 'http://finance.yahoo.com'       ...

  5. matlab 整数规划工具箱,Matlab中的YALMIP工具箱 混合整数规划

    YALMIP工具箱 混合整数规划 定义变量: sqdvar()实型 intvar()整型 binvar()0-1型 设定目标函数 : f=目标函数 设定限定条件: F=set(限定条件) 多个限定条件 ...

  6. MATLAB中安装Yalmip及Cplex

    注意点!! Yalmip及Cplex安装对版本匹配要求很高 推荐使用与自己安装的MATLAB相匹配的安装版本 Yalmip安装 各版本Yalmip下载地址 1. 下载所需版本后,将解压后的文件夹保存至 ...

  7. WinDBG插件编写介绍及在Nano Code中加载扩展

    穷理者,因其所已知而及其所未知,因其所已达而及其所未达.人之良知,本所固有.然不能穷理者,只是足于已知已达,而不能穷其未知未达,故见得一截,又不曾见得一截,此其所以于理未精也.然仍须功夫日日增加.今日 ...

  8. matlab中加多个点,为什么MATLAB中有多个连续加号允许的语法?

    plus和 uplus之间存在差异.我怀疑MATLAB将第一个作为加号,其他所有作为uplus.因为uplus默认只是"返回后面的内容",所以你加1和2,并在其间使用大量的&quo ...

  9. 在matlab中通过yalmip平台调用cplex求解器,可用于求解MILP问题,适合于综合能源系统优化求解(完整程序分享)

    综合能源系统优化求解 完整程序: %% 请先确保YALMIP工具箱和CPLEX正确安装,MATLAB导入对应文件,否则无法运行程序!! %CPLEX免费试用版对求解规模有限制,如出现规模过大无法求解, ...

  10. 在MATLAB中添加语音处理工具箱(voicebox)

    1. voicebox介绍   voicebox是一个MATLAB中的语音处理工具箱,支持MATLAB6.5以上的版本.其中包含了对语音的分帧处理,滤波,加窗,参数提取等等函数,是语音识别几乎不可缺少 ...

最新文章

  1. 《HTTP权威指南》– 8.网关、机器人
  2. a byte of python-A Byte of Python PDF 下载
  3. 【⛔C语言最熟悉的陌生人の你所不知道的scanf⛔】
  4. ECCV 2018 | CornerNet:目标检测算法新思路
  5. 删零c语言,C语言(请不要删)
  6. Python基本数据类型(三)
  7. 实验14:访问CMOS RAM显示当前日期和时间
  8. pytest的fixture传参数
  9. c语言文件操作常用函数及读写文件代码举列
  10. 在linux中cd god,Linux基础/Linux基础和命令.md · kelekele/God-Of-BigData - Gitee.com
  11. web前端开发和java后端_web前端开发和后端开发的区别是什么
  12. 机器学习基石 作业四
  13. unc0ver 越狱工具来袭,支持iOS11.0~iOS14.8稳定越狱 更新至V8.0.2 支持 A7-A14
  14. [微信支付]如何获取公众号AppID、AppSecret、商户号和商户API密钥
  15. 计算机学报在线阅读,计算机研究与发展计算机学报软件学报电子学报西安交通大学学报.doc...
  16. java通过十字路口_如何正确通过十字路口 老司机教你怎么走
  17. IMFI DAO World of Balatroon:土地出售即将到来!
  18. 软件测试中的白盒测试分析
  19. html大文件传输思路
  20. 百度站长俱乐部SEO提问收集-2

热门文章

  1. java 中文转英文性能最快
  2. MSDTC报错怎么破
  3. Cartoon CG:卡通渲染(开篇)
  4. 1 什么是机器学习(Machine Learning)?
  5. EditPlus中文版 安装教程
  6. delphi socket 怎样把接收到的二进制数据转换成字符串显示_【连载电子书二】Python基础数据类型详解(上)...
  7. setup factory mysql_(一)setupFactory零基础制作零配置安装程序实例(打包JDK Tomcat Mysql mypm)...
  8. 从不同音效材质了解游戏界面音效
  9. 实用好用的在线二维码生成器有哪些?
  10. 9008刷机 小米max2_小米Max2解锁教程_小米Max2一键解锁BL的方法