type
status
date
slug
summary
tags
category
icon
password
Yalmip入门教程(1)-入门学习
1.Yalmip 工具箱的下载与安装
1.1 下载
Yalmip 的作者是 Johan Löfberg,是由 Matlab 平台编程实现的一个免费开源数学优化工具箱,在官网上就可以下载。官方下载链接如下:
下载时可以选择最新版本或者旧版本 (如果使用的 Matlab 版本比较旧,有可能与最新版 Yalmip 工具箱不兼容,这时候就可以选择下载旧版本的 Yalmip)

图 1 Yalmip 工具箱下载
1.2 安装
Yamlip 工具箱所有功能都是基于 m 文件实现的,因此安装过程实际上就是把 Yalmip 工具箱的路径添加到 Matlab 平台中,具体安装方式有以下几种:
1)手动添加路径
第一步,将下载的压缩包解压,然后把解压后的文件夹放在 Matlab 路径中的 toolbox 中(也可以随便放在其他的文件夹中,只要保证该文件夹不会被删除,被移动即可)。

第二步,将 Yalmip 工具箱添加到 Matlab 的路径中。



图 2 Matlab 手动添加路径示意
2)使用 addpath(genpath(pwd)) 命令
pwd 表示当前路径,这个命令表示将当前文件夹下的所有子文件夹都添加到 Matlab 的路径中。首先使用时首先将下载的压缩包解压,然后把解压后的文件夹放在 Matlab 路径中的 toolbox 中(也可以随便放在其他的文件夹中,只要保证该文件夹不会被删除,被移动即可)。然后使用 addpath(genpath(pwd)) 命令,并将其中的 pwd 修改为对应的路径即可,例如:
1.3 测试
安装成功后,可以使用 yalmiptest 函数测试是否安装成功。使用时在命令行输入 yalmiptest 并回车,Yalmip 会自动求解一组优化问题来测试工具箱是否安装成功 (中间有一段需要输入任意内容并回车,才能继续测试):

图 3 Yalmip 测试结果
如果和图 3 的求解结果一样,除了三个无解的问题,都显示”successfully solved”,表示工具箱可以正常使用了。但是,在求解优化问题时,Yalmip 其实相当于 “中间商” 的地位,只是将各类求解器不同的数学建模方式修改为统一的形式,真正求解优化问题的还是那些求解器。工具箱中已经内置了一些免费的求解器,可以求解简单的优化问题,但针对复杂问题这些求解器的性能可能不是很好,这时候就需要功能更强大的商业求解器了。具有学术免费版的商业求解器主要有 Gurobi、Cplex、Mosek,它们的下载地址和优缺点如表 1 所示:
表 1 常用的学术免费版商业求解器
求解器 | 官网地址 | 优点 | 缺点 |
Gurobi | 1. 集成了启发式算法
2.MILP 求解性能排名前列
1. 有官方中文网站,学术许可证申请容易
1. 学术版没有规模限制
| 1. 学术许可证只有一年有效,到期需要重新申请
1. 使用人数较少,遇到问题时通过检索不容易找到答案
| |
Cplex | 1. 拥有自己的建模环境 Ilog,也支持 Java、C++、C 等语言
1. 目前使用人数最多,通过检索较容易找到相关问题的解答
| 免费版和学术版都有规模限制,无法求解大规模问题 | |
Mosek | 内点法性能比较好,解 SOCP、SDP 等锥优化性能最优。 | 学术许可申请比较麻烦,需要学校邮箱支持 |
2.Yalmip使用方法介绍
使用 Yalmip 工具箱包括定义变量、定义约束条件、定义目标函数、定义求解器选项、求解优化问题以及检查优化结果并获取优化问题的解。下面的代码是 Yalmip 官方给出的示例,包括了上述所有步骤 (PS:下文代码选择的求解器为 cplex,如果没有安装 cplex,只需在定义 options 时删除该求解器的设置,Yalmip 将自动选择其他已安装的求解器):
下面将对以上步骤分别进行介绍。
2.1 定义决策变量
sdpvar 用于定义连续型的决策变量,其基本语法如下:
例如定义一个 n 行 m 列决策变量 P 的方法如下:
需要注意的是,使用 sdpvar 定义决策变量时,若决策变量为方阵,则默认其为对称阵 (如果使用 sdpvar 定义了方阵 x,则 x(i,j) = x(j,i))。
例如,定义一个 3 行 3 列决策变量 P 的语法如下:
这时候变量 P 默认为一个对称矩阵,也就是 P(1,2) = P(2,1),P(1,3) = P(3,1),P(2,3) = P(3,2)。如果需要定义一个不对称的变量 P,则需要添加’full’,语法如下:
- ***定义矩阵时没有添加参数’********full********’********,导致变量默认为方阵,这是初学 Yalmip 工具箱最容易犯一个错误,需要留意!!!!我们很多时候定义变量时,维度都是不确定的,为了避免出错,就可以在不需要定义对称矩阵时,都添加参数********’********full********’********。****
另外一点需要说明的是,Matlab 中对于标量和矩阵的绝大部分函数都可以用于 sdpvar 类型变量,记住这一点可以简化很多代码量。
例如:

对于 sdpvar 类型变量,建模时其他常用的命令还有 diag、eye、end 等等,这就需要在使用过程中慢慢地尝试。定义决策变量的更多内容将在后文进行介绍。
2.2 定义约束条件
Yalmip 工具箱中可以非常方便的定义约束条件,针对决策变量使用约束条件定义函数或约束条件定义运算符即可表示一个约束条件。最常用的约束条件定义运算符包括’>=’、’<=’、’==’,分别表示大于等于、小于等于和等于。
例如,假设二维决策变量 x 的约束条件包括:

上面的式子实际上包含三个约束条件,可以分别写成:
将每个约束条件通过矩阵拼接或者使用’+’相加的方式连接在一起,便可以组合多个约束条件。
或者
两种表达方式是完全等价的。上面的例子中,变量 x1 的约束是一个连续不等式,也可以同时进行定义,方式如下:
需要注意的是,Yalmip 中不支持严格的不等式约束 (也就是不含等号的不等式),如果使用了严格的不等号,将会收到非常经典的 Yalmip“猫猫警告”,例如,运行下面这份代码,将会弹出如图 4 的警告:

图 4 严格不等号收到的错误提示
除了最常用的约束条件定义运算符包括’>=’、’<=’、’==’之外,Yalmip 中还支持使用其他命令定义约束,如 alldifferent, binary, complements, cone, cut, expcone, iff, implies, integer, ismember 等等,将在后文进行详细介绍。
2.3 定义目标函数
Yalmip 优化时默认的目标函数是取最小值。如果目标函数是取最大值,在目标函数前加上一个负号就可以了。
例如,有两个不同的目标函数分别为:


定义这两个目标函数的代码如下:
2.4 设置求解参数
使用 sdpsettings 函数可以对求解的相关参数进行设置。最常用的设置选项包括求解器的选择 (solver)、命令行结果展示的详细程度(verbose) 与步骤展示(showprogress)。例如,下面的代码就是将求解器选择为 cplex,结果展示的详细程度为 0(最少的命令行展示,最大值为 3),不显示步骤(showprogress 为 0):
也可以先对选项结构体进行赋值,然后通过结构体操作修改具体选项的内容,例如:
Yalmip 求解的参数非常多,如果想要查看完整的参数,可以先定义一个默认的参数选项 ops,然后在工作区或者命令行查看该结构体的内容:
求解参数设置的更多内容将在后文进行介绍,此处不再赘述。
2.5 求解优化问题
Yalmip 中求解优化问题用到的函数为 optimize,使用的语法为:
其中,Constraints 表示约束条件,Objective 表示目标函数,options 表示求解的参数。
如果只需要在约束条件中找到决策变量的一组解,就可以省略目标函数,例如:
或者将最后一行代码改为:
就可以在省略目标函数的同时,使用自己定义的求解参数。想要求解完整的优化问题,在加上目标函数即可:
上面 2.3 节提到,因为 Yalmip 默认是求目标函数最小值,所以求最大值时可以在目标函数前加一个负号。当然,也可以在定义目标函数时保持原有的形式,使用 optimize 求解时给目标函数添加负号,可实现一样的效果。
2.6 检查并获取优化问题的解
optimize 函数的返回值 sol 是一个包含六个字段的结构体:
其中,yalmipversion 表示 Yalmip 工具箱的版本,matlabversion 表示 Matlab 的版本,yalmiptime 表示 Yalmip 的建模时间,solvertime 表示求解器的求解时间,info 表示返回的信息,problem 为求解成功的标志,0 表示求解成功,1 表示求解失败。
其中最重要的参数就是 problem 和 info,可以显示求解是否成功,以及可能遇到的问题。因此通常可以在 optimize 函数求解之后再加一部分代码来展示是否求解成功和求解失败的原因:
以下的代码是一个能求解成功的例子:

下面的例子是一个求解失败的代码:

因为约束条件中 x1≤1 且 x1≥2,所以导致优化问题无解。
在确保优化问题求解成功的情况下,可以采用 value 命令或者目标函数或者决策变量的取值,例如:
结果为:

表示这个优化问题的最优解为 x1=2,x2=1,目标函数最小值为 5。
3.测试题
3.1 测试 1
求如下优化问题的解
max z=3x1+x2
s.t. x1-x2≥-2
x1-2x2≤3
3x1+2x2≤14
x1≥0, x2≥0
3.2 测试 2
找出下列代码中的错误并修改,使优化问题可以正常求解:
3.3 测试 3
某厂生产甲乙两种口味的饮料,每吨甲饮料需用原料 6 千克,工人 10 名,可获利 10 万元。每吨乙饮料需用原料 5 千克,工人 20 名,可获利 9 万元。今工厂共有原料 60 千克,工人 150 名,又由于其他条件所限甲饮料产量不超过 8 吨。问如何安排生产计划,即两种饮料各生产多少使获利最大?使用 Matlab+Yalmip 工具箱求解上述问题。
3.4 测试题参考答案
第一章测试题的参考答案可以从下面的链接中获取:
- Author:推半
- URL:www.woax.top/article/Yalmip1
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!