yalmip学习·
1. yalmip简介·
1.1 什么是yalmip·
yalmip是由Lofberg开发的一种免费的优化求解工具,其最大特色在于集成许多外部的最优化求解器,形成一种统一的建模求解语言,提供了Matlab的调用API,减少学习者学习成本。
1.2 yalmip安装方式·
这里以MATLAB的安装方式为例,在官网上下载最新包,将其解压至matlab
的toolbox
文件夹下(当然也放置在其他文件夹),打开matlab
软件添加Path路径即可。最后键入which sdpvar
命令,显示sdpvar
路径则安装成功。
2.yalmip求解优化问题的四部曲·
2.1 创建决策变量·
yalmip
一共有三种方式创建决策变量,分别为:
sdpvar
-创建实数型决策变量intbar
-创建整数型决策变量binvar
-创建0/1
型决策变量
不过值得注意的是,在创建n*n
的决策变量时,yalmip
默认是对称方阵,所以要创建非对称方针时,需要这样写:
1 | xxxvar(n,n,'full') |
2.2 添加约束条件·
比起matlab
自带的各种优化函数所要写明的约束条件,yalmip
的约束条件写起来是非常舒适直观的。
比如要写入0<=x1+x2+x3<=1
。
那么可以这样写:
1 | % 创建决策变量 |
是不是非常爽呢。这才是人类语言(和我初见python的感觉差不多)
2.3 参数配置·
关于参数设置,我们大多数是用来设置求解器solver
的,当然还有其它的选项,可以通过doc sdpsettings
查看。
2.4 求解问题·
最后就是求解问题了。
首先要明确求解目标z
,yalmip
默认是求解最小值问题,所以遇到求解最大值的问题,只需要在原问题的基础上添加一个负号即可。
求解调用格式:
1 | optimize(target,constraints,opstions) |
2.5 几个常用的其它指令·
check
:可以检查约束条件是否被满足(检查约束条件的余值)value
:可以查看变量或表达式的值assign
: 可以给变量赋值,这个命令调试时很重要
3.举两个栗子·
3.1 简单例子·
如题
$$ \begin{equation} z = max(\frac{x_1+2x_2}{2x_1+x_2}) \\ \left\{ \begin{array}{c} x_1 + x_2 \ge 2 \\ x_2 - x_1 \le 1 \\ x_1 \le 1 \end{array} \right. \end{equation} $$
代码如下,附有详细解释,就不说明了:
1 | % 清除工作区 |
求解结果:
1 | ans = |
3.2 解决经典的TSP问题·
关于TSP的理论,这里我就不详细介绍了,百度有很多。在遇到yalmip之前,我学习的求解TSP的第一解法就是利用lingo来求解,后来学习了几种智能算法,如遗传算法,模拟退火,蚁群算法等等都可以解决这个问题。现在,学习了yalmip之后,我们可以完全抛弃lingo那种简陋的ide。废话不多说,先贴上约束条件:
$$
\min Z = \sum_{i=1}{n}\sum_{j=1}{n} d_{ij}x_{ij} \\
s.t. \left\{
\begin{array}{c}
\sum_{i=1,i\neq j}^{n}x_{ij} = 1,\qquad j = 1,\cdots,n \\
\sum_{j=1,j\neq i}^{n}x_{ij} = 1,\qquad i = 1,\cdots,n\\
u_i-u_j + nx_{ij} \le n-1,\qquad 1< i\neq j \le n \\
x_{ij} = 0 \text{或} 1,\qquad u,j=1,\cdots,n \\
u_i\text{为实数},\qquad i=1,\cdots,n
\end{array}
\right.
$$
再来看看代码:
1 | % 利用yamlip求解TSP问题 |
这里用到的tsp_dist_matrix.txt
如下:
1 | 0 7 4 5 8 6 12 13 11 18 |
最后来看看结果吧:
1 | >> value(x) |
最后,发现了yalmip
的一个bug
,在书写yalmip
的约束条件时,如下:x(1) + x(2)-2 >= 0
注意x(2)-2这个-2是紧贴x(2)的。这样求解释正确的,如果换成x(1) + x(2) -2 >= 0
x(2)-2
这个-2
不是紧贴x(2)
的。这样求解则会出现问题。
建议把所有常数写在等式的右边