数学建模——规划问题

离散系统的优化问题一般都可以通过规划模型来求解。主要整理常见的规划模型的MATLAB求解,包括线性规划、整数规划和非线性规划三个部分。

一、线性规划

       建模是解决线性规划问题的极为重要的环节与技术。一个正确数学模型的建立要求建模者熟悉规划问题的生产和管理内容,明确目标要求和错综复杂的约束条件。

        在解决实际问题时,把问题归结成一个线性规划数学模型是很重要的一步,但往往也是困难的一步,模型建立的是否恰当直接影响到求解。而选取适当的决策变量,是建立有效模型的关键之一。

基本函数形式为linprog(c,A,b),它的返回值是向量x的值。函数调用形式,如

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

其中,fval返回目标函数的值;Aeq和beq对应等式约束Ax=b;LB和UB分别是变量x的下届和上界;X0是x的初始值;OPTIONS是控制参数。exitflag收敛;output iterations迭代次数algorithm所使用规则;

示例:

%线性规划
c = [2;3;1];
a = [1 4 2;3 2 0];
b = [8;6];
[x,y] = linprog(c,-a,-b,[],[],zeros(3,1));

f = [-5;-4;-6];
A = [1 -1 1;3 2 4;3 2 0];
b = [20;42;30];
lb = zeros(3,1);
[x,fval,exitflag,output,lambda] = linprog(f,A,b,[],[],lb)

c = [2;3;-5];
a = [2 -5 1];
b = 10;
aeq = [1 1,1];
beq = 7;
[x fval] = linprog(-c,-a,-b,aeq,beq,zeros(3,1))

c = [170.8582;-17.725;41.2582;2.2182;131.8182;-500000];
a = [1 -0.17037 -0.5324 0 1 0;0 0.17037 0.5324 0 0 0;1 0.32 1 0 0 0;0 1 0 0 0 0;0 0 1 1 0 0;0 0 0 -1 -1 0];
b = [0;888115;166805;521265.625;683400;-660000];
aeq = [0 0 0 0 0 1];
beq = 1;
lb = zeros(6,1);
x = linprog(-c,a,b,aeq,beq,lb)

二、非线性规划

       如果目标函数或约束条件中包含非线性函数,就称这种规划问题为非线性规划问题(NP)。非线性规划目前还没有适于各种问题的一般算法,各种方法都有自己特定的适用范围。

       它的Matlab命令是x = fmincon(FUN,X0,A,B,Aeq,Beq,LB,UB,NONLCON,OPTIONS)

它的返回值是向量x,其中,FUN是用M文件定义的函数f(x)。X0是x的初始值。A,B,Aeq,Beq定义了线性约束,如果没有线性约束,则A=[],B=[],Aeq = [],Beq = []。LB和UB是变量x的下界和上界,如果上界和下界没有约束,则LB=[],UB = [];如果x无下界,LB=-inf,如果x无上界,UB= inf。NONLCON使用M文件定义的非线性向量函数C(x),Ceq(x)。OPTIONS定义了优化参数,可以使用MATLAB默认的参数设置。

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

a = [1 0 0 0;1.1 1 0 0;1.21 1.1 1 0;1.331 1.21 1.1 1];
b = [400;440;484;532.4];
lb = zeros(4,1);
x = fmincon('fun3',rand(4,1),a,b,[],[],lb,[])

lb = zeros(4,1);
x = fmincon('fun3',[1;1;1;1],[],[],[],[],lb,[],'myconl')

二次规划

        若某非线性规划的目标函数为自变量x的二次函数,约束条件又全是线性的,则称这种规划为二次规划。

         Matlab中求解二次规划的命令是

[x,fval] = quadprog(h,f,a,b,Aeq,Beq,lb,ub,x0,options)

x的返回值是向量x;fval的返回值是目标函数在x处的值。

示例:

h = [4,-4;-4,8];
f = [-6;-3];
a = [1 1;4 1];
b = [3;9];
lb = zeros(2,1);
[x value] = quadprog(h,f,a,b,[],[],lb)

        利用罚函数法,可将非线性规划问题的求解转化为求解一系列无约束极值问题,因而也称这种方法为序列无约束最小化技术,简记为SUMT。

        罚函数法求解非线性规划问题的思想是,利用问题中的约束函数作出适当的罚函数,由此构造出带参数的增广目标函数,把问题转化为无约束非线性规划问题。罚函数主要有两种形式,一种称外罚函数法;另一种称内罚函数法。下面主要介绍外罚函数法。

示例:

[x,y] = fminunc('test',rand(2,1))

三、整数规划

规划中的变量(部分或全部)限制为整数时,称为整数规划。若在线性规划模型中,变量限制为整数,则称为整数线性规划。目前还没有一种方法能有效地求解一切整数规划。常见的整数规划问题的求解算法有以下几种:

(1)分支定界法:可求纯或混合整数规划。

(2)隔平面法:可求纯或混合整数规划。

(3)隐枚举法:用于求解0-1整数规划,有过滤隐枚举法和分枝隐枚举法。

(4)匈牙利法:解决指派问题(0-1规划特殊情形)。

(5)蒙特卡罗法:求解各种类型规划。

0-1整数规划

隐枚举法——增加过滤条件

随机取样计算法

       前面介绍的整数规划求解方法,主要针对线性整数规划而言,而对于非线性整数规划目前尚未有一种成熟而有效的求解方法,因为非线性规划本身的通用有效解法尚未找到,更何况是非线性整数规划。

        然而,尽管整数规划由于限制变量为整数而增加了难度,然后又由于整数解是有限个,于是为枚举法提供了方便。当然,在自变量维数很大和取值范围很宽的情况下,企图用显枚举法(即穷举法)计算出最优值是不现实的,但是应用概率理论可以证明,在有一定计算量的情况下,完全可以得出一个满意解。

示例:

问题:

首先编写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) = x(1)+x(2)+x(3)+x(4)+x(5)-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)+x(5)-200;

编写如下程序求问题的解:

rand('state',sum(clock));
p0 = 0;
tic
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 =x2;p0=f;
        end
    end
end
x0,p0
toc

note:rand函数产生由在(0, 1)之间均匀分布的随机数组成的数组

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值