本文已参与「新人创作礼」活动,一起开启掘金创作之路。
Matlab规划问题求解
Part1 0-1规划问题
- 约束函数如下,求给定目标函数Z的最大值,x_i为0-1变量。
0-1规划问题在Matlab中是混合整数线性规划的一特例,即x_i都为整数且0<=x_i<=1。
求解这类问题使用的函数是
x = intlinprog(f,intcon,A,b,Aeq,beq,lb,ub,x0)
- f 为系数向量,描述目标函数
- intcon指定目标函数变量中哪些向量为整数,例如[1,3]代表变量x_1,x_3为整数
- 约束条件为Ax<=b 和A_{eq}x=b_{eq}
- 返回目标函数取最小的情形
- lb和ub指定变量的最小值和最大值
- x0为优化的初始点(可选)
故需要对原目标函数进行改造,变成以下形式
% 目标函数
f = [-1;-2;3;1];
% 整数变量
intcon = [1,2,3,4];
% 约束函数<=
A = [-2 -3 0 -1;
-1 2 -3 2;
-4 1 -6 1;];
b = [-5;3;-5];
% 变量最大值与最小值 0-1
lb = zeros(4,1);
ub = ones(4,1);
% 约束函数== 没有的话填充0
Aeq = zeros(1,4);
beq = 0;
intlinprog(f,intcon,A,b,Aeq,beq,lb,ub)
结果如下,求解成功,答案为x_1-x_3=1 , x_4=0。
Intlinprog stopped at the root node because the objective value is within a gap tolerance of the optimal value, options.AbsoluteGapTolerance = 0 (the default value). The intcon variables are integer within tolerance,
options.IntegerTolerance = 1e-05 (the default value).
ans =
1
1
1
0
Part2 单纯形算法
刚开始听到这个词,以为是什么了不得的算法。查阅百科,定义是根据问题的标准型,从可行域中一个基本可行解开始,转换到另一个基本可行解,并且使目标函数值增大,当目标函数值达到最大时问题就得到了最优解的算法。
根据定义,其实刚才的0-1规划就是一种单纯形算法。不过既然之前已经介绍了线性(整数/0-1)规划,这里介绍一下如何求解非线性规划问题。
目标函数定义为 max Z=-({(x_2-{x_1}^2)}^2+{(1-x_1)^2})
约束条件
- x_1+2x_2<=1
- 2x_1+x_2=1
对于这个问题,我们使用fmincon函数求解。
fmincon(fun,x0,A,b,Aeq,beq)
- fun为目标函数,使用符号函数定义
- x_0为一个基本可行解
- 约束条件为Ax<=b 和A_{eq}x=b_{eq}
对应程序如下
fun = @(x)(x(2)-x(1)^2)^2 + (1-x(1))^2;
x0 = [0.5,0];
A = [1,2];
b = 1;
Aeq = [2,1];
beq = 1;
x = fmincon(fun,x0,A,b,Aeq,beq)
结果如下,答案为x_1=0.4757,x_2=0.0486。
Optimization completed because the objective function is non-decreasing in
feasible directions, to within the value of the optimality tolerance,
and constraints are satisfied to within the value of the constraint tolerance.
<stopping criteria details>
x =
0.4757 0.0486