Bootstrap

规划问题的MATLAB求解——MATLAB在数学建模中的应用(第2版)

规划问题的MATLAB求解

离散系统的优化问题一般可以通过规划模型来求解。利用MATLAB提供的强大的规划模型求解命令,可以简单快速地得到想要的结果。

规划模型可以简单的分为三个部分:线性规划、整数规划和非线性规划。

线性规划

例题2-1 电视台播映问题

题目略
设一周播出甲片 a a a次,乙片 b b b次,容易得到如下关系:

a + b < 7 a+b<7 a+b<7

0.5 a + b ≥ 3.5 0.5a+b\ge3.5 0.5a+b3.5

3.5 a + b ≤ 16 3.5a+b\le16 3.5a+b16

a , b ∈ N a,b\in N a,bN

目标函数为: F = 60 a + 20 b F=60a+20b F=60a+20b

线性规划问题的MATLAB标准形式

m i n min min c T x c^{T}x cTx s . t s.t s.t A x ≤ b Ax\le b Axb

c c c, x x x n n n维列向量; b b b m m m维列向量; A A A m × n m\times n m×n矩阵

求解线性规划问题的MATLAB解法

MATLAB中线性规划的标准型为

[x,fval]=linprog(c,A,b,Aeq,beq,LB,UB,X0,OPTIONS)

fval返回目标函数的值;Aeq,beq对应等式约束 A x = b Ax=b Ax=b;LB和UB分别是变量x的下界和上界;X0是x的初始值;OPTIONS为控制参数。

更详细可看官方文档关于linprog的介绍

例题2-2 求解线性规划问题

m i n min min z = 2 x 1 + 3 x 2 + x 3 z=2x_1+3x_2+x_3 z=2x1+3x2+x3

x 1 + 4 x 2 + 2 x 3 ≥ 8 x_1+4x_2+2x_3\ge8 x1+4x2+2x38

3 x 1 + 2 x 2 ≥ 6 3x_1+2x_2\ge6 3x1+2x26

x 1 , x 2 , x 3 ≥ 0 x_1,x_2,x_3\ge0 x1,x2,x30

代码如下:

c=[2;3;1];
A=-1.*[1 4 2;3 2 0];
b=-1.*[8;6];
LB=[0;0;0];
[x,fval]=linprog(c,A,b,[],[],LB);

非线性规划

目标函数中包含非线性函数,则称这种规划问题为非线性规划问题。

非线性问题的MATLAB解法

在MATLAB中非线性规划问题的数学模型可以写成以下形式:

m i n min min f ( x ) f(x) f(x)

A x ≤ b Ax\le b Axb

A e q ⋅ x = B e q Aeq\cdot x=Beq Aeqx=Beq

C ( x ) ≤ 0 C(x)\le 0 C(x)0

C e q ( x ) = 0 Ceq(x) = 0 Ceq(x)=0
其中 f ( x ) f(x) f(x)是标量函数; A , B , A e q , B e q A,B,Aeq,Beq A,B,Aeq,Beq是相应维数的矩阵和向量, C ( x ) , C e q ( x ) C(x),Ceq(x) C(x),Ceq(x)是非线性函数。

在MATLAB中的命令是

X = FMINCON(FUN,X0,A,B,Aeq,Beq,LB,UB,NONLCON,OPTIONS)

返回值是向量 x x x。FUN为定义的函数 f ( x ) f(x) f(x),X0是 x x x的初始值。A,B,Aeq,Beq定义了线性约束条件 A x ≤ b Ax\le b Axb A e q ⋅ x = b Aeq\cdot x=b Aeqx=b,如果没有线性约束,则A=[],B=[],Aeq=[],Beq=[]。LB和UB是x的下界和上界,如果上界和下界没有约束则也用[]表示。NONLCON是用M文件定义的非线性向量函数 C ( x ) C(x) C(x), C e q ( x ) Ceq(x) Ceq(x)。OPTIONS定义了优化参数,可以使用MATLAB默认的参数设置。

更详细可以看官方文档关于函数FMINCON的介绍

例题2-7 求解非线性规划

题目略

fun1.m

function f=fun1(x)
f = x(1)^2+x(2)^2+8;

fun2.m

function [g,h]=fun2(x)
g=-x(1)^2+x(2);
h=-x(1)-x(2)^2+2;

Fminconex.m

options=optimset;
[x,y]=fmincon('fun1',rand(2,1),[],[],[],[],zeros(2,1),[],'fun2',options);

得到最终结果,当 x 1 = x 2 = 1 x_1=x_2=1 x1=x2=1时, f ( x ) f(x) f(x)最小为10.

二次规划问题

如果某个非线性规划问题中,目标函数是二次函数,而约束条件均为线性时,则称这个问题为二次规划问题。

在MATLAB中二次规划的数学模型可表述如下:

m i n min min 1 2 x T H x + f T x \frac{1}{2}x^THx+f^Tx 21xTHx+fTx , s . t . s.t. s.t. A x ≤ b Ax\le b Axb

其中 f , b f,b f,b是列向量, A A A是相应维数的矩阵, H H H是实对称矩阵。

[X,FVAL]=quadprog(H,f,A,b,Aeq,beq,LB,UB,X0,OPTIONS)

X的返回值是向量 x x x,FVAL的返回值是目标函数在 x x x处的值。

更多内容请见官方文档关于quadprog的介绍

例题2-9 求解二次规划

题目略

h=[4 -4;-4 8];
f=[-6;-3];
A=[1 1;4 1];
b=[3;9];
[x,value]=quadprog(h,f,A,b,[],[],zeros(2,1),[]);
disp(['x1=',num2str(x(1))]);
disp(['x2=',num2str(x(2))]);
disp(['value=',num2str(value)]);

整数规划

当规划中的变量(部分或全部)被限制为整数时,称为整数规划。
目前所流行的求解整数规划的方法,往往只适用于整数线性规划。目前还没有一种能有效求解一切整数规划的方法。

常见的整数规划方法:(一般通过多次迭代,增加限制条件达到求解的目的)

  • 分枝定界法
  • 割平面法
  • 隐枚举法
  • 匈牙利法
  • 蒙特卡罗法

随机取样计算法

随机取样计算法,针对非线性整数规划问题的求解,依据概率理论,在一定计算量的限制下,得到问题的解。

例2-12 非线性整数规划问题的求解

题目略
mengte.m代码如下:

function [f,g]=mengte(x)
f=x(1)^2+x(2)^2+3*x(3)^2+4*x(4)^2+2*x(5)^2-8*x(1)-2*x(2)-3*x(3)-x(4)-2*x(5);
g(1)=sum(x)-400;
g(2)=x(1)+2*x(2)+2*x(3)+x(4)+6*x(5)-800;
g(3)=2*x(1)+x(2)+6*x(3)-200;
g(4)=x(3)+x(4)+5*x(5)-200;

randprog.m代码如下

rng(sum(clock),'v5uniform');
p0=0;
for i=1:10^5
    x=99*rand(5,1);
    x1=floor(x);
    x2=ceil(x);
    [f,g]=mengte(x1);
    if sum(g<=0)==4
        if p0<=f
            x0=x1;p0=f;
        end
    end
    [f,g]=mengte(x2);
    if sum(g<=0)==4
        if p0<=f
            x0=x1;p0=f;
        end
    end
end
for i=1:5
    disp(['ans=',num2str(x0(i))]);
end
disp(['val=',num2str(p0)]);

由于随机取样,每次运行结果不一定一致,但误差较小。需要多次运行,减少误差,增加答案的可信度。

;