当前位置: 代码迷 >> 综合 >> 线性规划 | 用实例展示Matlab和lingo求解线性问题的差异
  详细解决方案

线性规划 | 用实例展示Matlab和lingo求解线性问题的差异

热度:35   发布时间:2024-02-08 00:58:59.0

一、线性规划

什么是线性规划问题?

线性规划是在一系列的线性条件的约束下,从而规定了可行解,在通过具体的目标函数,求得满足函数的最优解
例如平常的线性规划函数的例子:
例子
在matlab中使用matlab标准的格式:
在这里插入图片描述
若是目标函数是求解最大值的话,则取-C形式:
例如线性规划:
在这里插入图片描述

的MATLAB标准型为:
在这里插入图片描述

二、linprog函数

在matlab中,linprog函数可以求解线性规划问题,用于寻找目标函数的最小值。
matlab中,规划模型的标注写法如下:
在这里插入图片描述
(1)[x,fval]=linprog(f,A,b)
用于求解:在这里插入图片描述

(2)[x,fval]=linprog(f,A,b,Aeq,beq)
用于求解:在这里插入图片描述
如果没有等式存在,就用[]代替Aeq和beq。

(3)[x,fval]=linprog(f,A,b,Aeq,beq,lb,ub)
用于求解:
在这里插入图片描述
返回的x为所求的结果,fval为最值。
linprog中fval都是求最小值,这个要记住。
A和b是不等式约束条件的参数。
Aeq和beq是等式约束条件的参数。
lb和ub为x取值的取值范围。
例如:
a+b+c<30
c<15
b<10
函数:f = 10a+20b+30c
因为linprog求的是最小值,我们将原式改为:
f = -(10
a+20b+30c)
这样我们有了函数f=[-10;-20;-30];,然后:
根据约束条件不等式,有:
A = [1 1 1;
0 0 1;
0 1 0] ;
b = [30;15;10] ;
但这样算出来的结果大家会发现是小数,也可能是负数。
因此我们加入a、b、c取值的上下限:
lb = [0 0 0]
ub = [30 30 30]
如果在计算中需要得到小数的结果,只要写成0.00或者30.00就可以了,最后带入函数计算就可以了。

三、intlinprog函数

intlinprog()是matlab中用于求解混合整数线性规划(Mixed-integer linear programming)的一个函数,用法基本和linprog差不多。
语法:

x=intlinprog(f,intcon,A,b,Aeq,beq,lb,ub)

与linprog相比,多了参数intcon,代表了整数决策变量所在的位置。
例如:
在这里插入图片描述

四、Lingo软件

LINGO是用来求解线性和非线性优化问题的简易工具。
所有代码在 Lingo Model - Lingo 1中编写,写完后点击工具条上的红色的靶子运行。
在这里插入图片描述
例如:
在这里插入图片描述
代码:

max=x1+x2;
x1+9/14*x2<=51/14;
-2*x1+x2<=1/3;
@gin(x1);@gin(x2);
end

LINGO提供了大量的标准数学函数
@abs(x) 返回x 的绝对值
@sqrt() 开方
@sin(x) 返回x 的正弦值,x 采用弧度制
@cos(x) 返回x 的余弦值
@tan(x) 返回x 的正切值
@exp(x) 返回常数e 的x 次方
@log(x) 返回x 的自然对数
@lgm(x) 返回x 的gamma 函数的自然对数
@sign(x) 如果x<0 返回-1;否则,返回1
@floor(x) 返回x的整数部分。当x>=0 时,返回不超过x 的最大整数;当x<0
时,返回不低于x 的最大整数。
@smax(x1,x2,…,xn) 返回x1,x2,…,xn 中的最大值
@smin(x1,x2,…,xn) 返回x1,x2,…,xn 中的最小值

变量界定函数
变量界定函数实现对变量取值范围的附加限制,共4种
@bin(x) 限制x 为0 或1 — 用于0-1规划
@bnd(L,x,U) 限制L≤x≤U
@free(x) 取消对变量x 的默认下界为0 的限制,即x 可以取任意实数
@gin(x) 限制x 为整数
在默认情况下,LINGO 规定变量是非负的,也就是说下界为0,上界为+∞。@free 取消
了默认的下界为0的限制,使变量也可以取负值。@bnd用于设定一个变量的上下界,它也可 以取消默认下界为0的约束。
注意:
LINGO总是根据“MAX=”或“MIN=”寻找目标函数;
程序语句的顺序一般不重要,既可以随意调换;
程序运用函数时都是以@开头;
程序中的变量默认为非负数,想要改变变量类型必须有相应函数调整
程序中变量不区分大小写;
语句必须以分号结尾;
注释以!开始,且注释语句后面必须也有分号,注释默认注释到第一个分号处,意思是分号前面会全部被注释掉。

五、实例

根据外场改装合同要求,改装备件需于每季度末分别提供10、15、25、30。已知该专业厂各季度末的生产能力及每套产品的成本构成,如果专业厂生产出的备件当季不能交付,每套积压一季度需存储、维护等的费用0.15万元,建立一个数学模型,要求在完成合同的情况下,使该全年生产(包括存储、维护)费用最小。
在这里插入图片描述
**解:**设x_ij为第i季度生产的用于第j季度交货产品的数量,则由题意得:
x_11=10
x_12+x_22=15
x_13+x_23+x_33=25
x_14+x_24+x_34+x_44=30

又由生产能力的要求,有
x_44<=10
x_33+x_34<=30
x_22+x_23+x_24<=35
x_11+x_12+x_13+x_14<=25

再设c_ij表示第i季度生产的用于第j季度交货的每台产品的实际成本,其值如下表:
在这里插入图片描述
目标函数为:
f = 10.8 * x11 + 10.95 * x12 + 11.10 * x13 + 11.25*x14 + 11.10 * x22 + 11.25 * x23 + 11.40 * x24 + 11 * x33 + 11.15 * x34 + 11.30 * x44;

MATLAB求解:
在这里插入图片描述
上式中,Aeq为左边的矩阵,beq为等号右边的向量;
在这里插入图片描述
上式中,A为左边的矩阵,b为等号右边的向量;

% 线性规划问题
% 目标函数:
% minF = 10.8 * x11 + 10.95 * x12 + 11.10 * x13 + 11.25 + x14 + ...
%    11.10 * x22 + 11.25 * x23 + 11.40 * x24 + ...
%    11 * x33 + 11.15 * x34 + ...
%    11.30 * x44;minfun = [10.8 ,10.95 , 11.10 , 11.25 ,11.10 ,11.25,11.40 ,11,11.15,11.30]';
Aeq = zeros(10);
Aeq(1,1) = 1;
Aeq(2,2) = 1;  Aeq(2,5) = 1;
Aeq(3,3) = 1;  Aeq(3,6) = 1;  Aeq(3,8) = 1;
Aeq(4,4) = 1;  Aeq(4,7) = 1;  Aeq(4,9) = 1;  Aeq(4,10) = 1;
beq = [10,15,25,30,0,0,0,0,0,0]';
A = zeros(10);
A(1,1) = 1; A(1,2) = 1; A(1,3) = 1; A(1,4) = 1;
A(2,5) = 1; A(2,6) = 1; A(2,7) = 1;
A(3,8) = 1; A(3,9) = 1;
A(4,10) = 1;
b = [25,35,30,10,0,0,0,0,0,0]';
[x,y]=intlinprog(minfun,1:10,A,b,Aeq,beq,zeros(10,1)',[]); 
disp('x的值为:');  x
disp('最小值为:');  y

运行结果:
x的值为:

100
150
1500
10
20
10

最小值为:

887

Lingo求解:

min=10.8 * x11 + 10.95 * x12 + 11.10 * x13 + 11.25*x14 + 11.10 * x22 + 11.25 * x23 + 11.40 * x24 + 11 * x33 + 11.15 * x34 + 11.30 * x44;
x11=10;
x12+x22=15;
x13+x23+x33=25;
x14+x24+x34+x44=30;
x11+x12+x13+x14<=25;
x22+x23+x24<=35;
x33+x34<=30;
x44<=10;
end

运行结果:
在这里插入图片描述
最小值为:887

由此可见,MATLAB和lingo所求的最优解一致,但是每个变量值x并不一样,说明规划有多组解。

  相关解决方案