高等工程数学 线性规划部分 作业

线性规划模型与理论简介

某公司面临一个是外包协作还是自行生产的问题。该公司生产甲、乙、丙三种产品,都要经过铸造、机加工和装配三个车间。甲、乙两种产品的铸件可以外包协作,亦可以自行生产,但产品丙必须本厂铸造才能保证质量。数据如下表。问:公司为了获得最大利润,甲、乙、丙三种产品各生产多少件?甲、乙两种产品的铸造中,由本公司铸造和由外包协作各应多少件?

 

资源限制

铸造工时(小时/件)

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

 

同表格单纯形法的手算结果一致。说明了程序的正确性。

 

原文地址:https://www.cnblogs.com/shepherd2015/p/4925704.html