线性规划在数学建模中的两道例题

一、生产决策问题

1.问题分析

本题最终是要求一个利润最大化,由此得知是一个规划问题,因此我们需要设定一些符号,将目标函数写出来,再进一步写出约束

2.模型建立

(1)符号设定

由于三种产品需要经过两道工序,两道工序中又分别有不同的机器,不妨把一种产品经过一道工序设为一个变量,这样才能不重不漏。
因此对产品I来说,设以A1、A2,完成A工序的产品分别为x1、x2件,转入B工序时,以 B1、B2、B3完成B工序的产品分别为x3、x4、x5件;对产品Ⅱ来说,设以A1、A2完成A工序的产品分别为x6、x7件,转入B工序时,以B1完成B工序的产品为x8件;对产品Ⅲ来说,设以A2完成A工序的产品为x9件,则以B,完成B工序的产品也为x9件。
此外,每一种产品经过A工序和B工序的产品数量是一样的,因此我们需要加上约束:x1+x2=x3+x4+x5;x6+x7=x8

(2)目标函数建立

先计算出某种设备平均每台时需要的费用,再用产品单件工时乘以这个值,就可以得到某工件再设备上所花费用

(3)约束建立

3.代码求解

(1)输入系数向量

因为我们的变量有9个,因此先初始化一个9行的列向量,再往里面添数

format long g   %可以将Matlab的计算结果显示为一般的长数字格式(默认会保留四位小数,或使用科学计数法)
c = zeros(9,1); % 初始化目标函数的系数向量全为0
c(1) = 1.25 -0.25 -300/6000*5;  % x1前面的系数是c1
c(2) = 1.25 -0.25 -321/10000*7;
c(3) = -250 / 4000 * 6;
c(4)  = -783/7000*4;
c(5) = -200/4000 * 7;
c(6) = -300/6000*10;
c(7) = -321 / 10000 * 9;
c(8) = 2-0.35-250/4000*8;
c(9) = 2.8-0.5-321/10000*12-783/7000*11;
c = -c;  % 我们求的是最大值,所以这里需要改变符号

(2)输入不等式约束

我们有9个变量,因此矩阵的列数为9,又由于我们有5个约束,因此行数为5。初始化的好处就是,直接往里面添数即可,不需要的地方直接为0。

A = zeros(5,9);
A(1,1) = 5;  A(1,6) = 10;
A(2,2) = 7;  A(2,7) = 9; A(2,9) = 12;
A(3,3) = 6;  A(3,8) = 8;
A(4,4) = 4;  A(4,9) = 11;
A(5,5) = 7;  
b = [6000 10000 4000 7000 4000]';

(3)输入等式约束与上下界

Aeq = [1 1 -1 -1 -1 0 0 0 0;
            0 0 0 0 0 1 1 -1 0];
beq = [0 0]';
lb = zeros(9,1);

(4)进行求解

[x fval] = linprog(c, A, b, Aeq, beq, lb)
fval = -fval
% fval =
% 1146.56650246305
% 注意,本题应该是一个整数规划的例子,我们在后面的整数规划部分再来重新求解。
intcon = 1:9;
[x,fval]=intlinprog(c,intcon,A,b,Aeq,beq,lb)
fval = -fval

二、投料问题

1.问题分析

本题也是一个规划问题,规划问题的第一要素就是要定义变量,然后写出目标函数与约束。所定义的变量一定是要便于在编程中好体现写出目标函数与约束的。首先在约束中,我们肯定是想写出距离矩阵,然后再定义一个矩阵,代表i料场向j工地运输aij吨,这样求点积分使其最小就可以了。但遗憾的是matlab对线性规划的标准型不允许矩阵的存在,因此我们的变量只能是一个列向量,在处理的时候,将这个向量拼凑成一个矩阵即可

2.模型建立

(1)符号设定


(2)目标函数建立

(3)约束建立

3.代码求解

(1)输入系数向量

这里计算距离非常巧妙,让把j的循环写在前面,让后再循环i,分别得到料场到工地的距离

a=[1.25  8.75  0.5  5.75  3  7.25];  % 工地的横坐标
b=[1.25  0.75  4.75	5  6.5  7.25];   % 工地的纵坐标
x = [5  2];  % 料场的横坐标
y = [1  7];  % 料场的纵坐标
c = [];  % 初始化用来保存工地和料场距离的向量 (这个向量就是我们的系数向量)
for  j =1:2
    for i = 1:6
        c = [c;  sqrt( (a(i)-x(j))^2 + (b(i)-y(j))^2)];  % 每循环一次就在c的末尾插入新的元素
    end
end

(2)输入不等式约束

我们有12个变量,因此矩阵的列数为12,又由于我们有2个约束,因此行数为2。

A =zeros(2,12);
A(1,1:6) = 1;
A(2,7:12) = 1;
b = [20,20]';

(3)输入等式约束与上下界

Aeq = zeros(6,12);  
for i = 1:6
    Aeq(i,i) = 1;  Aeq(i,i+6) = 1;
end
% Aeq = [eye(6),eye(6)]  % 两个单位矩阵横着拼起来
beq = [3 5 4 7 6 11]';  % 每个工地的日需求量
lb = zeros(12,1);

(4)进行求解

[x fval] = linprog(c, A, b, Aeq, beq, lb)
x = reshape(x,6,2)  % 将x变为6行2列便于观察(reshape函数是按照列的顺序进行转换的,也就是第一列读完,读第二列,即x1对应x_1,1,x2对应x_2,1)
posted @ 2024-08-10 21:14  卢宇博  阅读(62)  评论(0编辑  收藏  举报