zoukankan      html  css  js  c++  java
  • 高等工程数学 线性规划部分 作业

    线性规划模型与理论简介

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

     

    资源限制

    铸造工时(小时/件)

    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

     

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

     

  • 相关阅读:
    (4)使用 JDK8 日期時間 API
    (3)使用 Joda-Time
    (2)時間的 ABC
    (1)Date 與 Calendar 怎麼了?
    Android 开发绕不过的坑:你的 Bitmap 究竟占多大内存?
    AsyncTask 源码阅读笔记
    LinkedHashMap 阅读笔记
    HashMap 阅读笔记
    DiskLruCache 阅读笔记
    Android面试复习
  • 原文地址:https://www.cnblogs.com/shepherd2015/p/4925704.html
Copyright © 2011-2022 走看看