十线性规划模型与理论简介
某公司面临一个是外包协作还是自行生产的问题。该公司生产甲、乙、丙三种产品,都要经过铸造、机加工和装配三个车间。甲、乙两种产品的铸件可以外包协作,亦可以自行生产,但产品丙必须本厂铸造才能保证质量。数据如下表。问:公司为了获得最大利润,甲、乙、丙三种产品各生产多少件?甲、乙两种产品的铸造中,由本公司铸造和由外包协作各应多少件?
| 甲 | 乙 | 丙 | 资源限制 |
铸造工时(小时/件) | 5 | 10 | 7 | 8000 |
机加工工时(小时/件) | 6 | 4 | 8 | 12000 |
装配工时(小时/件) | 3 | 2 | 2 | 10000 |
自产铸件成本(元/件) | 3 | 5 | 4 |
|
外协铸件成本(元/件) | 5 | 6 | -- |
|
机加工成本(元/件) | 2 | 1 | 3 |
|
装配成本(元/件) | 3 | 2 | 2 |
|
产品售价(元/件) | 23 | 18 | 16 |
|
设x1,x2,x3分别为三道工序都由本公司加工的甲、乙、丙三种产品的件数,x4,x5分别为由外协铸造再由本公司加工和装配的甲、乙两种产品的件数
求 xi 的利润: 利润 = 售价 – 各成本之和
产品甲全部自制的利润 = 23-(3+2+3)=15
产品甲铸造外协,其余自制的利润 = 23-(5+2+3)=13
产品乙全部自制的利润 = 18-(5+1+2)=10
产品乙铸造外协,其余自制的利润 = 18-(6+1+2)= 9
产品丙的利润 = 16-(4+3+2)= 7
可得到 xi (i = 1,2,3,4,5 ) 的利润分别为 15,10, 7, 13, 9元
通过以上分析,可建立如下数学模型:
十一线性规划的单纯形法
将第十章所得到的标准形式的线性规划为题用单纯形法计算得到结果
基变量 | CB | XB | X1 | X2 | X3 | X4 | X5 | X6 | X7 | X8 | θ |
15 | 10 | 7 | 13 | 9 | 0 | 0 | 0 | ||||
X6 | 0 | 8000 | 5 | 10 | 7 | 0 | 0 | 1 | 0 | 0 | 1600 |
X7 | 0 | 12000 | 6 | 4 | 8 | 6 | 4 | 0 | 1 | 0 | 2000 |
X8 | 0 | 10000 | 3 | 2 | 2 | 3 | 2 | 0 | 0 | 1 | 3333.3 |
Zj(0) | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | X1进基 | ||
判别数σj | -15 | -10 | -7 | -13 | -9 | 0 | 0 | 0 | X6出基 | ||
X1 | 15 | 1600 | 1 | 2 | 1.4 | 0 | 0 | 0.2 | 0 | 0 | 正无穷大 |
X7 | 0 | 2400 | 0 | -8 | -0.4 | 6 | 4 | -1.2 | 1 | 0 | 400 |
X8 | 0 | 5200 | 0 | -4 | -2.2 | 3 | 2 | -0.6 | 0 | 1 | 1733.3 |
Zj(24000) | 15 | 30 | 21 | 0 | 0 | 3 | 0 | 0 | X4进基 | ||
判别数σj | 0 | 20 | 14 | -13 | -9 | 3 | 0 | 0 | X7出基 | ||
X1 | 15 | 1600 | 1 | 2 | 1.4 | 0 | 0 | 0.2 | 0 | 0 | 正无穷大 |
X4 | 13 | 400 | 0 | -1.33 | -0.07 | 1 | 0.667 | -0.2 | 0.167 | 0 | 600 |
X8 | 0 | 4000 | 0 | 0 | -2 | 0 | 0 | 0 | -0.5 | 1 | 正无穷大 |
Zj(29200) | 15 | 12.67 | 20.13 | 13 | 8.667 | 0.4 | 2.167 | 0 | X5进基 | ||
判别数σj | 0 | 2.667 | 13.13 | 0 | -0.3 | 0.4 | 2.167 | 0 | X4出基 | ||
X1 | 15 | 1600 | 1 | 2 | 1.4 | 0 | 0 | 0.2 | 0 | 0 |
|
X5 | 9 | 600 | 0 | -2 | -0.1 | 1.5 | 1 | -0.3 | 0.25 | 0 |
|
X8 | 0 | 4000 | 0 | 0 | -2 | 0 | 0 | 0 | -0.5 | 1 |
|
Zj(29400) | 15 | 12 | 20.1 | 13.5 | 9 | 0.3 | 2.25 | 0 |
| ||
判别数σj | 0 | 2 | 13.1 | 0.5 | 0 | 0.3 | 2.25 | 0 |
|
故由表格单纯形法我们可以得到这个问题的最优解是X1取1600,X5取600可以得到最大利润29400元
即三道工序都由本公司加工的甲生产1600件,由外协铸造再由本公司加工和装配的乙生产600件时可获得最大利润。
将单纯形法算法步骤用MATLAB编程如下:
function [x maxf] = simpleMethod(A,c,b,baseVector)
% 输入:
% 目标函数系数向量: c
% 约束矩阵: A
% 约束右端向量: b
% 初始基向量: baseVector
% 输出:
% 目标函数取最大值时的自变量值 x
% 目标函数的最大值 maxf
% 例:
% A = [-1 2 1 0 0;
% 2 3 0 1 0;
% 1 -1 0 0 1];
% b = [4;
% 12;
% 3];
% c = [4 1 0 0 0];
% baseVector = [3 4 5];
% 得到
% x = 4.2000 1.2000
% maxf = 18.0000
c = -c;
sz = size(A);
nVia = sz(2);
n = sz(1);
xx = 1:nVia;
nobase = zeros(1,1);
m = 1;
for i=1:nVia % 获取非基变量下标
if(isempty(find(baseVector == xx(i),1)))
nobase(m) = i;
m = m + 1;
else
;
end
end
bCon = 1;
M = 0;
while bCon
nB = A(:,nobase); % 非基变量矩阵
ncb = c(nobase); % 非基变量系数
B = A(:,baseVector); % 基变量矩阵
cb = c(baseVector); % 基变量系数
xb = inv(B)*b;
f = cb*xb;
w = cb*inv(B);
for i=1:length(nobase) % 判别
sigma(i) = w*nB(:,i)-ncb(i);
end
[maxs,ind] = max(sigma); % ind为进基变量下标
if maxs <= 0 % 最大值小于0,输出最优解
maxf = cb*xb;
vr = find(c~=0 ,1,'last');
for l=1:vr
ele = find(baseVector == l,1);
if(isempty(ele))
x(l) = 0;
else
x(l)=xb(ele);
end
end
bCon = 0;
else
y = inv(B)*A(:,nobase(ind));
if y <= 0
disp('不存在最优解!');
x = NaN;
maxf = NaN;
return;
else % 寻找出基变量
minb = inf;
chagB = 0;
for j=1:length(y)
if y(j)>0
bz = xb(j)/y(j);
if bz<minb
minb = bz;
chagB = j; % chagB为出基变量下标
end
end
end
tmp = baseVector(chagB); % 更新基矩阵和非基矩阵
baseVector(chagB) = nobase(ind);
nobase(ind) = tmp;
end
end
M = M + 1;
if (M == 1000000)
disp('找不到最优解!');
x = NaN;
maxf = NaN;
return;
end
end
maxf = -maxf;
end
调用该函数计算本例如下:
clear all;clc;
A = [5 10 7 0 0 1 0 0;
6 4 8 6 4 0 1 0;
3 2 2 3 2 0 0 1]
b = [8000;
12000;
10000]
c = [15 10 7 13 9 0 0 0]
baseVector = [6 7 8]
[x maxf] = simpleMethod(A,c,b,baseVector)
得到结果如下:
x =
1.0e+03 *
1.6000 0 0 0 0.6000
maxf =
2.9400e+04
同表格单纯形法的手算结果一致。说明了程序的正确性。