整数规划问题的解决实践。本文将简单介绍整数规划问题是什么,如何配置环境以及如何在MATLAB上通过工具箱yalmip调用外部解析器cplex解决整数规划问题。
1. 整数规划问题
1.1 定义
整数规划问题是什么呢?首先我们举个例子:
有两台机器,5个工件,不同机器加工不同工价花的时间和钱不同。问如何分配花的钱最少,时间也最少。
注意到,在这个问题中一个机器必须加工一整个工件。我们需要决定的量(决策变量),即哪个机器加工哪几个变量是整数时,可以认为这就是一个整数规划问题。
严格来说,整数规划问题实际上是数学规划问题的一个分支。一般来说在数学规划问题中一部分变量或者全部变量为整数变量的话,该数学规划问题就属于整数规划问题。
对于一个数学规划问题,首先确定决策变量,再给定约束和目标函数。其中,约束给出决策变量之间的关系或取值范围。优化函数由决策变量组合而成,我们往往希望它达到极大或极小。例如之前的例子,它就是一个广义指派问题。
1.2 分类
整数问题可以分为几类,主要有以下关键词:
- 0-1:决策变量只含有0-1变量
- 混合:决策变量既含有整数变量也含有连续变量
- 线性/非线性:目标函数和约束都是线性的,或其中至少有一个是非线性
任意组合有,线性整数规划,0-1线性规划,混合整数线性规划,非线性整数规划,0-1非线性规划,和0-1非线性混合整数规划。
还有一个特例,0-1多项式规划,目标函数和约束中都是多项式函数,决策变量只含有0-1变量的整数规划问题
2. 环境配置
- 下载cplex,解压,一直next安装并记住安装的位置
- 下载yalmip-master,解压到matlab\toolbox
yalmip的github下载 - 将cplex安装位置、yalmip-master文件夹添加到matlab路径下
- 重启matlab
- 运行 yalmiptest,安装完成后部分代码如下:
+++++++++++++++++++++++++++++++++++++++++++++++
| Searching for installed solvers |
+++++++++++++++++++++++++++++++++++++++++++++++
| Solver| Version/module| Status|
+++++++++++++++++++++++++++++++++++++++++++++++
| CPLEX| IBM 12.8.0| found|
| CPLEX| IBM 12.8.0| found|
| CPLEX| IBM 12.10.0| not found|
+++++++++++++++++++++++++++++++++++++++++++++++
3. cplex功能
IBM ILOG CPLEX Optimizer 是一种用于对以下形式的线性优化问题(通常称为线性规划 (LP) 问题)求解的工具。可以参考cplex官网求解问题类型。
最大化或最小化 | c 1 x 1 + c 2 x 2 + … + c n x n c_{1} x_{1}+c_{2} x_{2}+\ldots+c_{n} x_{n} c1x1+c2x2+…+cnxn |
---|---|
约束 | a 11 x 1 + a 12 x 2 + … + a 1 n x n ∼ b 1 a 21 x 1 + a 22 x 2 + … + a 2 n x n ∼ b 2 … a m 1 x 1 + a m 2 x 2 + … + a m n x n ∼ b m \begin{aligned}&a_{11} x_{1}+a_{12} x_{2}+\ldots+a_{1 n} x_{n} \sim b_{1} \\&a_{21} x_{1}+a_{22} x_{2}+\ldots+a_{2 n} x_{n} \sim b_{2} \\&\ldots \\&a_{m 1} x_{1}+a_{m 2} x_{2}+\ldots+a_{m n} x_{n} \sim b_{m}\end{aligned} a11x1+a12x2+…+a1nxn∼b1a21x1+a22x2+…+a2nxn∼b2…am1x1+am2x2+…+amnxn∼bm |
4. yalmip功能
介绍等可以参考yalmip官方教程。yalmip是MATLAB的一个工具箱,用于在matlab中调用各种规划问题的求解器,比如上文提到的cplex。
yalmip识别MATLAB语言定义的决策变量、约束和优化函数。并转化成外部求解器可用的语言进行求解,最后返回结果。
-
它提供变量类型:
sdpvar:实数变量,intvar:整数变量,binvar:0-1变量。 -
通过sdpsettings函数设置求解方法为调用外部解析器。
-
通过 optimize函数调用外部解析器进行计算。
5. 算例及结果
可以参考yalmip官网教程。其给定算例如下:
% 定义决策变量,10*1
x = sdpvar(10,1);
% 定义约束
Constraints = [sum(x) <= 10, x(1) == 0, 0.5 <= x(2) <= 1.5];
for i = 1 : 7
Constraints = [Constraints, x(i) + x(i+1) <= x(i+2) + x(i+3)];
end
% 定义优化目标
Objective = x'*x+norm(x,1);
% 设置选项(方法等)
options = sdpsettings('verbose',1,'solver','quadprog','quadprog.maxiter',100);
% 给定约束,优化函数和方法设置计算问题
sol = optimize(Constraints,Objective,options);
% 分析输出
if sol.problem == 0
% Extract and display value
solution = value(x)
else
display('Hmm, something went wrong!');
sol.info
yalmiperror(sol.problem)
end
结果如下:
solution =
0
0.5000
0.0833
0.4167
0.1667
0.3333
0.2500
0.2500
0.3333
0.1667