- 一、生产决策问题
- 1.问题分析
- 2.模型建立
- (1)符号设定
- (2)目标函数建立
- (3)约束建立
- 3.代码求解
- (1)输入系数向量
- (2)输入不等式约束
- (3)输入等式约束与上下界
- (4)进行求解
- 二、投料问题
- 1.问题分析
- 2.模型建立
- (1)符号设定
- (2)目标函数建立
- (3)约束建立
- 3.代码求解
- (1)输入系数向量
- (2)输入不等式约束
- (3)输入等式约束与上下界
- (4)进行求解
一、生产决策问题
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:2for i = 1:6c = [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:6Aeq(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)