1. 程式人生 > >用非線性規劃解決問題

用非線性規劃解決問題

在經營管理中,為取得更高的利潤,不僅需要提高經營收入,也要考慮如何在現有的人力、物力和財力條件下合理安排,在滿足要求的前提下,達到最低的成本。對於靜態的最優化問題(即所有資料不會瞬息萬變,可以允許在小範圍內有波動),通過設計各類可呼叫的指標,使目標達到最優。非線性規劃具有堅實的數學基礎和計算方法,在實際應用中有很高的價值。

下面我們用一個例子來講解非線性規劃方法,可能有點像一道數學題,但是忽略這些形式的東西吧,學到知識才是最重要的。

課題名稱:制定轟炸方案

    設一個戰略轟炸機群奉命攜帶A,B種型號的炸彈轟炸敵軍的四個重要目標。為完成好此項任務要求飛機的耗油量不超過2700L,炸彈A和B都不超過4枚。已知飛機攜帶A型炸彈時每升油料可飛行2km,攜帶B型炸彈時每升油料可飛行3km,空載時每升油料可飛行4km,每次起降各耗油100L.又知每架飛機每次只能攜帶一枚炸彈。有關引數如表1所示。現在的問題是:如何制定轟炸方案,使摧毀目標的可能性最大?

                                    表1   轟炸方案問題的有關資料

目標

距離/km

摧毀目標的可能性

A

B

640

0.65

0.76

850

0.50

0.70

530

0.56

0.72

72

0.68

0.66

下面開始制定我們的方案,當然,實際應用中的資料並不會這麼完美的量化,具體量化的方法有很多,可能黃小技術包以後會整理一下,但是現在,我們先來看看這個方案怎麼制定吧。

制定方案無非就是分別向4個目標投擲 A or B 炸彈多少枚,可以使摧毀目標的可能性最大。這裡是有限制的,比如炸彈數量,比如總油量,下面我們先看看飛機攜帶一枚炸彈炸燬一個目標的耗油問題吧。

第一步:計算飛機攜帶 A or B 炸彈分別摧毀4個目標所需要的油量

炸燬目標Ⅰ:A型(640/2+640/4+200)=680.0         B型(640/3+640/4+200)=573.3

炸燬目標Ⅱ:A型(850/2+850/4+200)=837.5         B型(850/3+850/4+200)=695.8

炸燬目標Ⅲ:A型(530/2+530/4+200)=597.5         B型(530/3+530/4+200)=509.2

炸燬目標Ⅳ:A型(72/2+72/4+200)=254.0             B型(72/3+72/4+200)=242.0

第二步:構造該問題的數學模型

設:向目標Ⅰ,Ⅱ,Ⅲ,Ⅳ分別投擲A型炸彈 x11, x12, x13, x14 枚,B型 x21, x22, x23, x24 枚;

每一個目標不被摧毀的可能性為Z;則該問題的數學模型為:

第三步:程式執行求解

當然這裡我們可以按照考試一樣手動計算,但是現在都什麼年代了,各種程式語言也該利用起來了。下面是用lingo編寫的,當然你也可以用matlab、R、python等等。

lingo程式:

model:
sets:
num_i/1..4/:a,b,s;
num_j/1,2/;
link_ij(num_j,num_i):x;
endsets	
data:
s=640,850,530,72;a=0.65,0.50,0.56,0.68;b=0.76,0.70,0.72,0.66;
enddata
[OBJ]min=@sum(num_i(i):(1-a(i))^(x(1,i))*(1-b(i))^(x(2,i)));
(3/4)*@sum(num_i(i):s(i)*x(1,i))+(7/12)*@sum(num_i(i):s(i)*x(2,i))+100*@sum(link_ij(j,i):x(j,i))<=2700;
x(1,1)+x(1,2)+x(1,3)+x(1,4)<=4;
x(2,1)+x(2,2)+x(2,3)+x(2,4)<=4;
@for(num_i(i):x(1,i)+x(2,i)>=1;x(1,i)+x(2,i)<=2;);
@for(link_ij(j,i):x(j,i)>=0;@GIN(x(j,i)););
end

執行結果:

Local optimal solution found.
  Objective value:                             0.7124000
  Objective bound:                             0.7124000
  Infeasibilities:                              0.000000
  Extended solver steps:                              21
  Total solver iterations:                          2063
  Elapsed runtime seconds:                          1.27

  Model Class:                                     PINLP

  Total variables:                      8
  Nonlinear variables:                  8
  Integer variables:                    8

  Total constraints:                   20
  Nonlinear constraints:                1

  Total nonzeros:                      48
  Nonlinear nonzeros:                   8

                                Variable           Value        Reduced Cost
                                   A( 1)       0.6500000            0.000000
                                   A( 2)       0.5000000            0.000000
                                   A( 3)       0.5600000            0.000000
                                   A( 4)       0.6800000            0.000000
                                   B( 1)       0.7600000            0.000000
                                   B( 2)       0.7000000            0.000000
                                   B( 3)       0.7200000            0.000000
                                   B( 4)       0.6600000            0.000000
                                   S( 1)        640.0000            0.000000
                                   S( 2)        850.0000            0.000000
                                   S( 3)        530.0000            0.000000
                                   S( 4)        72.00000            0.000000
                                X( 1, 1)        0.000000          -0.2519570
                                X( 1, 2)        0.000000            0.000000
                                X( 1, 3)        0.000000          -0.2298741
                                X( 1, 4)        2.000000            0.000000
                                X( 2, 1)        1.000000            0.000000
                                X( 2, 2)        2.000000           0.2965332
                                X( 2, 3)        1.000000        -0.1392208E-01
                                X( 2, 4)        0.000000            0.000000

執行結果解讀:

第一行的Objective value直接翻譯是目標的值,也就是數學模型中目標函式的最小值,即目標不被摧毀的最小概率是0.7124,因此目標被摧毀的最大概率就是0.7124。

此最大摧毀率對應的方案,檢視執行結果中的倒數8行,X(1,4)、X(2,1)、X(2,2)、X(2,3)是投擲炸彈數大於1的X,X(1,4)代表用第一種炸彈(A炸彈)投擲第Ⅳ個目標,投擲數量為2。明白了這個之後,我們就可以得到我們最大摧毀率對應的方案了。

最佳方案:

向目標Ⅰ,Ⅱ,Ⅲ分別投擲 B 型炸彈1,2, 1枚;向目標Ⅳ投擲 A 型炸彈2枚。摧毀率為0.7124。