1. 程式人生 > >MATLAB 線性規劃實例應用

MATLAB 線性規劃實例應用

返回 inf 獲得 list 百分比 工程 位數 線性 拉格朗日

  • 線性規劃
  1. 線性規劃函數
  2. 功能:求解線性規劃問題
  3. 語法
    • x = linprog(f,A,b):求解問題 min fx,約束條件為 Ax <= b
    • x = linprog(f,A,b,Aeq,beq):求解上面的問題,但增加等式約束,即 Aeqx = beq,若沒有不等式存在,則令 A= []、b = []
    • x = linprog(f,A,b,Aeq,beq,lb,ub):定義設計變量 x 的下屆 lb 和 上屆 ub,使得 x 始終在該範圍內,若沒有等式約束,令 Aeq = []、beq = []
    • x = linprog(f,A,b,Aeq,beq,lb,ub,x0):設置初值為 x0。該選項只適用於中型問題,默認大型算法將忽略初值
    • x = linprog(f,A,b,Aeq,beq,lb,ub,x0,options):用 options 指定的優化參數進行最小化
    • [x,fval] = linprog(...):返回解 x 處的目標函數值 fval
    • [x,lambda,exitflag] = linprog(...):返回 exitflag 值,描述函數計算的退出條件
    • [x,lambda,exitflag,output] = linprog(...):返回包含優化信息的輸出變量 output
    • [x,fval,lambda,exitflag,output] = linprog(...):將解 x 處的拉格朗日乘子返回到 lambda 參數中
  4. 變量及算法:lambda 參數介紹
    • lambda 是解 x 處的拉格朗日乘子,它的屬性如下
    • lambda.lower:lambda 的下屆
    • lambda.upper:lambda 的上屆
    • lambda.ineqlin:lambda 的線性不等式
    • lambda.eqlin:lambda 的線性等式
    • 大型優化算法:采用 LIPSOL 法,該法在進行叠代計算之前首先要進行一系列的預處理
    • 中型優化算法:linprog 函數使用的是投影法,就像 quadprog 函數的算法一樣,linprog 函數使用的是一種活動集方法,是線性規劃中單純形法的變種,他通過求解另一個線性規劃問題來找到初始可行解
  • 線性規劃問題的應用
  1. 生產決策問題
    • 某廠生產甲、乙兩種產品,已知制成一噸產品甲需用資源A 3 噸,資源B 4 $m^3$,制成每噸產品乙需用資源A 2 噸,資源B 6 $m^3$,資源C 7 個單位。若每噸產品和乙的經濟價值分別為 7 萬元和 5 萬元,3 種資源的限制量分別為 80 噸、220 $m^3$ 和 230 個單位,試分析應生產這兩種產品各多少噸才能使創造的總經濟價值最高?
    • 這裏可以令生產產品甲的數量為 $x_1$,生產產品乙的數量為 $x_2$。根據題意,代碼設置如下:
      clc
      clear
      f = [-7;-5];
      A = [3 2
           4 6
          0 7];
      b = [80;220;230];
      lb = zeros(2,1);

      然後調用 linprog 函數:

      [x,fval,exitflag,output,lambda] = linprog(f,A,b,[],[],lb)

      最優化結果如下:

技術分享圖片

    • 由上可知,生產甲種產品 4.7619 噸、乙種產品 32.8571 噸可使創造的總經濟價值最高,最高經濟價值為 197.6190 萬元。exitflag = 1 表示過程正常收斂於解 x 處。

2.工作人員計劃安排問題

    • 某晝夜服務的公共交通系統每天各時間段(每 4 小時為一個時間段)所需的值班人數如表所示,這些值班人員在某一時段開始上班後要連續工作 8 小時(包括輪流用餐時間),請問該公共交通系統至少需要多少名工作人員才能滿足值班的需要?

技術分享圖片

    • 這裏可設 $x_i$ 為第 i 個時段開始上班的人員數
      clc
      clear
      f = [1;1;1;1;1;1];
      A = [-1 0 0 0 0 -1
           -1 -1 0 0 0 0
           0 -1 -1 0 0 0
           0 0 -1 -1 0 0
           0 0 0 -1 -1 0
           0 0 0 0 -1 -1];
      b = [-50;-30;-70;-60;-40;-20];
      lb = zeros(6,1);    
    • 然後調用 linprog 函數
      [x,fval,exitflag,output,lambda] = linprog(f,A,b,[],[],lb)
    • 最優化結果如下:

技術分享圖片

      可見只要 6 個時段分別安排 26 人、25 人、45 人、26 人、14 人和 24 人就可以滿足值班的需要,共計 160 人,並且計算結果 exitflag = 1 是收斂的

3. 投資問題

    • 某單位有一批資金用於 4 個工程項目的投資,用於各工程項目時所得的凈收益(投入資金的百分比)如表所示

技術分享圖片

    • 由於某種原因,決定用於項目 A 的投資不大於其他各投資之和,而用於項目 B 和 C 的投資要大於項目 D 的投資,試確定使該單位收益最大的投資分配方案。
    • 這裏可以用 $x_1、x_2、x_3 和 x_4$ 分別代表用於項目 A、B、C 和 D 的投資百分數,由於各項目的投資百分數之和必須等於 100%,所以 $x_1+x_2+x_3+x_4 = 1$,代碼設置如下:
      f = [-0.18;-0.1;-0.09;-0.12];
      A = [1 -1 -1 -1
           0 -1 -1 1];
      b = [0;0];
      Aeq = [1 1 1 1];
      beq = [1];
      lb = zeros(4,1); 
    • 調用函數:
      [x,fval,exitflag,output,lambda] = linprog(f,A,b,Aeq,beq,lb)
    • 結果如下:

技術分享圖片

說明 A、B、C、D 投入資金的百分比分別為 50%、25%、0%、25% 時,該單位收益最大

4. 工件加工任務分配問題

    • 某車間有兩臺機床甲和乙,可用於加工 3 種工件。假定這兩臺機床的可用臺時數分別為 600 和 900,3 種工件的數量分別為 400、600 和 500,且已知用兩臺不同機床加工單位數量的不同工件所需的臺時數和加工費用(如表所示),問怎樣分配機床的加工任務,才能既滿足加工工件的需求,又使總加工費用最低?

技術分享圖片

    • 這裏可設在甲機床上加工工件1、2 和 3 的數量分別為 $x_1、x_2、x_3$,在乙機床上加工工件1、2 和 3 的數量分別為 $x_4、x_5、x_6$,根據 3 種工種的數量限制,則有:$x_1+x_4 = 400(對工件 1) ,x_2+x_5 = 600(對工件 2),x_3+x_6=500(對工件 3)$,根據題意:
      clc
      clear
      f = [13;9;10;11;12;8];
      A = [0.6 1.2 1.1 0 0 0
           0 0 0 0.4 1.2 1.0];
      b = [600;900];
      Aeq = [1 0 0 1 0 0
             0 1 0 0 1 0
             0 0 1 0 0 1];
      beq = [400 600 500];
      lb = zeros(6,1);

      然後調用 linprog 函數:

      [x,fval,exitflag,output,lambda] = linprog(f,A,b,Aeq,beq,lb)

      結果如下:

技術分享圖片

在甲機床上加工 500 個工件 2,在乙機床上加工 400 個工件 1、加工 100 個工件 2、加工 500 個工件 3,可在滿足條件的情況下使總加工費用最小,最小費用為 14100 元。

5. 廠址選擇問題

    • A、B、C 三地,每地都出產一定數量的產品,也消耗一定數量的原料(如表所示),已知制成每噸產品需 3 噸原料,各地之間的距離為:A-B,150km;A-C,100km,B-C,200km。假定每萬噸原料運輸 1lm 的運價是 5000 元,每萬噸產品運輸 1lm 的運價是 6000 元。由於地區條件的差異,在不同地點設廠的生產費用也不同。問究竟在哪些地方設廠,規模多大,才能使總費用最小?另外,由於其他條件限制,在 B 處建廠的規模(生產的產品數量)不能超過 6 萬噸

技術分享圖片

    • 這裏可令 $x_{ij}$ 為由 i 地運到 j 地的原料數量(萬噸),$y_{ij}$ 為由 i 地運往 j 地的產品數量(萬噸),i,j = 1,2,3(分別對應A、B、C三地),根據題意:
      clc
      clear
      f = [75;75;50;50;100;100;150;240;210;120;160;220];
      A = [1 -1 1 -1 0 0 3 3 0 0 0 0
           -1 1 0 0 1 -1 0 0 3 3 0 0
           0 0 -1 1 -1 1 0 0 0 0 3 3
           0 0 0 0 0 0 0 0 1 1 0 0];
      b = [21;17;22;6];
      Aeq = [0 0 0 0 0 0 1 0 1 0 1 0
                  0 0 0 0 0 0 0 1 0 1 0 1];
      beq = [6;12];
      lb = zeros(12,1);
      [x,fval,exitflag,output,lambda] = linprog(f,A,b,Aeq,beq,lb);

      技術分享圖片

      可見要使總費用最小,A、B、C 三地的建廠規模分別為 6 萬噸、5.667 萬噸和 6.333 萬噸,最小總費用為 2.9733e+03 萬元

6. 確定職工編制問題

    • 某工廠每日 8小時的產量不低於 1800 件。為了進行質量控制,計劃聘請兩個不同水平的檢驗員。一級檢驗員的速度為 25件/小時,正確率 98%,計時工資 4元/小時,二級檢驗員的速度為 15件/小時,正確率 95%,計時工資 3元/小時,檢驗員每錯一次,工廠要損失 2 元。現有可供廠方聘請的檢驗員人數為一級 7人和二級 8人。為使總檢驗費用最省,該工廠應聘請一級、二級檢驗員各多少名?
    • 可設需要一級和二級檢驗員的人數分別為 $x_1$ 和 $x_2$ 名,根據題意:
      clc
      clear
      f = [40;36];
      A = [1 0
           0 1
           -5 -3];
      b = [7;8;-45];
      lb = zeros(2,1);
      [x,fval,exitflag,output,lambda] = linprog(f,A,b,[],[],lb);

技術分享圖片

可見,招聘一級檢驗員 7名,二級檢驗員 3名可使總檢驗費用最少,約為400.00元

7. 生產計劃的最優化問題

    • 某工廠生產 A 和 B 兩種產品,它們需要經過 3 種設備的加工,其加工如表所示,設備一、二和三每天可使用的時間分別不超過 11、9 和 12小時。產品 A 和 B 的利潤隨市場的需求有所波動,如果預測未來某個時期內 A 和 B 的利潤分別為 5000元/噸和 3000元/噸,問在那個時期內,每天應生產A、B各多少噸,才能使工廠獲利最大?

技術分享圖片

    • 這裏可設每天應安排生產 A 和 B 分別為 $x_1$ 和 $x_2$ 噸,根據題意:
      clc
      clear
      f = [-5;-3];
      A = [4 3
           5 4
           6 3];
      b = [11;9;12];
      lb = zeros(2,1);
      [x,fval,exitflag,output,lambda] = linprog(f,A,b,[],[],lb)

      技術分享圖片

      每天生產 A 產品 1.80噸、B產品 0 噸可使工廠獲得最大利益 9000元/噸。

    

MATLAB 線性規劃實例應用