【新手向】Matlab规划问题求解

152 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

Matlab规划问题求解

Part1 0-1规划问题

  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