MATLAB數學建模:數學規劃模型

數學規劃模型

數學規劃是運籌學的一個重要分支,也是現代數學的一門重要學科。在實際問題的需要和計算機的飛速發展背景之下,數學規劃迅速發展併成爲了一門活躍的新興學科。
在本章中,我們將介紹數學規劃模型的概念和線性規劃、非線性規劃的概念、性質和應用。

1. 數學規劃模型

在許多實際問題中,我們常常需要確定一些可控制變量的值, 從而使得相關的量達到最佳. (使目標達到最大或最小). 這類問題統稱爲 優化問題 ,通常來說都需要建立規劃模型進行求解.

數學規劃模型是決定如何分配有限資源,從而達到人們期望的目標的 優化分配數學模型,在運籌學中處於中心地位.其一般表達式爲:
minf(x,α,β)minf(x,\alpha,\beta)
s.t.g(x,α,β)0s. t. g(x,\alpha,\beta)\leqslant 0
式中,ff 爲目標函數, gg 爲約束函數。xx 爲可控變量,α\alpha 爲已知參數,β\beta 爲隨機參數。minmin 表示“求最小值”,s.ts.t 表示“受約束於”(subject to)。


2. 線性規劃

線性規劃是運籌學中研究較早、發展較快,應用廣泛且方法成熟的一個分支,可以良好地輔助人們進行科學管理.

2.1 線性規劃的標準形式

線性規劃的標準形式爲:
{minz=c1x1+c2x2++cnxna11x1+a12x2++a1nxn=b1a21x1+a22x2++a2nxn=b2                                       am1x1+am2x2++amnxn=bmx1,x2,,xn0\begin{cases} minz = c_{1}x_{1} +c_{2}x_{2} +\cdots + c_{n}x_{n} \\a_{11}x_{1} + a_{12}x_{2} + \cdots + a_{1n}x_{n} = b_{1}\\a_{21}x_{1} + a_{22}x_{2} + \cdots + a_{2n}x_{n} = b_{2}\\ \ \ \ \vdots \ \ \ \ \ \ \ \ \ \ \ \ \ \vdots \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \vdots\\a_{m1}x_{1} + a_{m2}x_{2} + \cdots + a_{mn}x_{n} = b_{m}\\ x_{1},x_{2},\cdots,x_{n} \geqslant 0\end{cases}
我們記
{minz=j=1ncjxjσj=1naijxj=bii=1,2,,mxj0j=1,2,,n\begin{cases} minz = \sum_{j = 1}^{n}c_{j}x_{j} \\ \sigma_{j = 1}^{n}a_{ij}x_{j} = b_{i} & i = 1,2,\cdots,m \\ x_{j}\geqslant0 & j = 1,2,\cdots,n \end{cases}
記爲矩陣形式爲:
{minZ=CxAx=bx0j=1,2,,n\begin{cases} minZ = Cx \\ Ax = b \\ x \geqslant0 & j = 1,2,\cdots,n \end{cases}

線性規劃的標準形式要求:目標函數最小化,約束條件取等式,變量 bb 非負。不符合這三個條件的線性模型也可以轉化爲標準形式。

從實際問題中抽象和建立數學模型一般來說有以下三個步驟:

  1. 根據影響目標達成情況的因素尋找決策變量。
  2. 由決策變量和目標之間的函數關係建立目標函數。
  3. 由決策變量所受的限制確定決策變量的約束條件。

這樣,我們所建立的數學模型都具備以下特點:

  1. 每個模型中都含有若干個決策變量 (x1,x2,,xn)(x_{1},x_{2},\cdots,x_{n}),其中 nn 爲決策變量個數。決策變量的一組值就代表某一個優化方案,決策變量一般是非負的。
  2. 目標函數和約束條件都是決策變量的線性函數。
    當我們得到的數學模型的目標函數爲線性函數、約束條件爲線性不等式或線性等式時,我們稱這樣的數學模型爲 線性規劃模型

2.2 線性規劃的求解方法

求解線性規劃問題的基本方法是 單純形法 ,經過改進和發展又有改進單純形法、對偶單純形法、原始對偶方法、分解算法和各種多項式時間算法。對於只有兩個變量的,簡單的線性規劃問題,也可採用圖解法求解。

線性規劃包含 單純形線性規劃多目標線性規劃

2.2.1 單純形線性規劃

單純形法是從所有基本可行解的一個較小部分中,通過迭代過程選出最優解的方法.其迭代過程的一般描述爲:

  1. 將線性規劃化爲典範形式,從而可得一個初始基本可行解 x(0)x(0) (初始頂點).將它作爲迭代過程的出發點,其目標值爲 z(x(0))z(x(0)).
  2. 尋找一個基本可行解 x(1)x(1), 使 z(x(1))z(x(0))z(x(1)) \leqslant z(x(0)). 方法是通過消去法將產生 x(0)x(0) 的典範形式化爲產生 x(1)x(1) 的典範形式.
  3. 繼續尋找相對較好的基本可行解 x(2),x(3),x(2),x(3),\cdots,使目標函數值不斷改進:
    z(x(n))z(x(n1))z(x(2))z(x(1))z(x(0)).z(x(n)) \leqslant z(x(n-1)) \leqslant \cdots \leqslant z(x(2)) \leqslant z(x(1)) \leqslant z(x(0)).
    當某個基本可行解再也不能被其他基本可行解所改進的時候,它就是我們所求的最優解.

在 MATLAB 中,我們使用單純形法的變種:投影法 求解線性規劃問題.函數爲 linprog.

1. x = linprog(f,A,b)
2. x = linprog(f,A,b,Aeq,beq)
3. x = linprog(f,A,b,Aeq,beq,lb,ub)
4. x = linprog(f,A,b,Aeq,beq,lb,ub,x0)
5. x = linprog(f,A,b,Aeq,beq,lb,ub,options)
6. [x,fval] = linprog(......)
7. [x,fval,exitflag] = linprog(......)
8. [x,fval,exitflag,output] = linprog(......)
9. [x,fval,exitflag,output,lambda] = linprog(......)
  1. 求解問題 min(fx)min(f'*x), 約束條件爲 AxbA*x \leqslant b.
  2. 在求解(1)中問題的基礎上增加等式約束:Aeqx=beqAeq*x = beq.
  3. 定義變量 xx 的下界和上界 lb,ublb,ub, 使得 xx 始終在該範圍內.
  4. 設置初值爲x0.x0. (大型算法將忽略初值,默認只適用於中型算法)
  5. optionsoptions 指定的優化參數進行最小化.
  6. 返回解 xx 處的目標函數值 fvalfval.
  7. 返回 exitflagexitflag值,描述函數計算的退出條件.
  8. 返回包含優化信息的輸出變量 outputoutput.
  9. 將解 xx 處的 LagrangeLagrange 乘子返回到 lambdalambda 參數中.

[例]

求函數 f(x)=5x14x26x3f(x) = -5x_{1} - 4x_{2} - 6x_{3}, 其中 xx 滿足條件:
{x1x2+x3203x1+2x2+4x3423x1+2x230x1,x2,x30\begin{cases} x_{1} - x_{2} + x_{3} \leqslant 20 \\ 3x_{1} + 2x_{2} + 4x_{3} \leqslant 42 \\ 3x_{1} + 2x_{2} \leqslant 30 \\ x_{1},x_{2},x_{3} \geqslant 0 \end{cases}

[解]

% 將變量按照順序排好,用係數表示目標函數
f = [-5;-4;-6];
% 沒有等式條件,Aeq和beq均爲空矩陣。即
Aeq = [];
beq = [];

%不等式條件係數
A = [1 -1 1 
    3 2 4
    3 2 0];
b = [20;42;30];

%沒有上限要求
lb = [0;0;0];
ub = [inf;inf;inf];
[x,fval] = linprog(f,A,b,[],[],lb,[]);
x
fval

程序運行結果:


Optimal solution found.


x =

         0
   15.0000
    3.0000


fval =

   -78

>> 

2.2.2 多目標線性規劃

多目標線性規劃是多目標最優化理論的重要組成部分. 由於多個目標之間的矛盾性和不可公度性, 要求出使得所有目標均達到最優的全局最優解是不可能的, 求解多目標規劃問題往往只能求出其有效解.

目前,求解多目標線性規劃問題有效解的辦法包括 理想點法, 線性加權和法, 最大最小法, 目標規劃法.

多目標線性規劃有兩個或以上的目標函數, 且目標函數和約束條件均爲線性函數. 其數學模型表示爲:
max{z1=c11x1+c12x2++c1nxnz2=c21x1+c22x2++c2nxn                                               zr=cr1x1+cr2x2++crnxnmax \begin{cases} z_{1} = c_{11}x_{1} + c_{12}x_{2} + \cdots + c_{1n}x_{n} \\ z_{2} = c_{21}x_{1} + c_{22}x_{2} + \cdots + c_{2n}x_{n} \\ \ \ \ \ \ \ \ \ \ \ \ \ \vdots\ \ \ \ \ \ \ \ \ \ \ \ \vdots \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \vdots \\ z_{r} = c_{r1}x_{1} + c_{r2}x_{2} + \cdots + c_{rn}x_{n} \\ \end{cases}
約束條件爲:
{a11x1+a12x2++a1nxnb1a21x1+a22x2++a2nxnb2                                       am1x1+am2x2++amnxnbmx1,x2,,xn0\begin{cases} a_{11}x_{1} + a_{12}x_{2} + \cdots + a_{1n}x_{n} \leqslant b_{1}\\a_{21}x_{1} + a_{22}x_{2} + \cdots + a_{2n}x_{n} \leqslant b_{2} \\ \ \ \ \vdots \ \ \ \ \ \ \ \ \ \ \ \ \ \vdots \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \vdots\\a_{m1}x_{1} + a_{m2}x_{2} + \cdots + a_{mn}x_{n} \leqslant b_{m}\\ x_{1},x_{2},\cdots,x_{n} \geqslant 0\end{cases}
上述多目標線性規劃及約束條件可用矩陣表示:

線性規劃:
maxZ=CxmaxZ = Cx

約束條件:
{Axbx0.\begin{cases} Ax \leqslant b \\ x \geqslant 0 \end{cases}.

求解多目標線性規劃的常用方法是 理想點法線性加權和法.

2.2.2.1 理想點法

maxZ=Cxmax Z = Cx
在約束條件
{Axbx0.\begin{cases} Ax \leqslant b \\ x \geqslant 0 \end{cases}.
中, 先求解 rr 個單目標問題 minxDZj(x),   j=1,2,,rmin_{x\in D}Z_{j}(x), \ \ \ j = 1,2,\cdots,r.設其最優值爲 ZjZ_{j}^{*}, 稱 ZZ^{*} 爲值域中的一個 理想點,在期望的某種度量之下,尋求距離 ZZ^{*} 最近的 ZZ 作爲近似值.

一種最直接的方法是最短距離理想點法:

構造評價函數
ϕ(Z)=i=1n[ZiZi]2\phi(Z) = \sqrt{ \sum_{i = 1}^{n} [Z_{i}-Z_{i}^{*}]^{2} }
然後極小化 ϕ[Z(x)]\phi[Z(x)], 即求解
minxDϕ(Z)=i=1n[Zi(x)Zi]2min_{x \in D}\phi(Z) = \sqrt{ \sum_{i = 1}^{n} [Z_{i}(x)-Z_{i}^{*}]^{2} }
並將其最優解 xx^{*} 作爲約束條件在這種意義下的"最優解".

[例]
利用理想點法求解:
maxf1(x)=3x12x2maxf_{1}(x) = 3x_{1} - 2x_{2}
maxf2(x)=4x13x2 maxf_{2}(x) = -4x_{1} - 3x_{2}
s.t.{2x1+3x2182x1+x210x1,x20 s.t. \begin{cases} 2x_{1} + 3x_{2} \leqslant 18\\ 2x_{1} + x_{2} \leqslant 10 \\ x_{1}, x_{2} \geqslant 0\end{cases}

[解]

先分別求解 f1(x)f_{1}(x)f2(x)f_{2}(x)最優解:

% 求解f1(x)最優解
f1 = [3;-2];
A = [2,3;2,1];
b = [18;10];
lb = [0;0];
[x1,fval1] = linprog(f1,A,b,[],[],lb)

%求解f2(x)最優解
f2 = [-4;-3];
[x2,fval2] = linprog(f2,A,b,[],[],lb)

解得

Optimal solution found.


x1 =

     0
     6


fval1 =

   -12


Optimal solution found.


x2 =

     3
     4


fval2 =

   -24

>> 

故得到理想點爲: (12,24)(12,24).

隨後求下列模型的最優解:

minxD[f(x)]=[f1(x)12]2+[f2(x)24]2min_{x \in D}[f(x)] = \sqrt{ [f_{1}(x)-12]^{2} + [f_{2}(x) - 24]^{2} }
s.t.{2x1+3x2182x1+x210x1,x20 s.t. \begin{cases} 2x_{1} + 3x_{2} \leqslant 18\\ 2x_{1} + x_{2} \leqslant 10 \\ x_{1}, x_{2} \geqslant 0\end{cases}
求解程序如下:

A = [2,3;2,1];
b = [18;10];
lb = [0;0];
x0 = [1;1];
x = fmincon('((-3*x(1) + 2*x(2)-12)^2 + (4*x(1) + 3*x(2)-24)^2)^(1/2)',x0,A,b,[],[],lb,[])

運行結果:


Local minimum found that satisfies the constraints.

Optimization completed because the objective function is non-decreasing in 
feasible directions, to within the default value of the optimality tolerance,
and constraints are satisfied to within the default value of the constraint tolerance.

<stopping criteria details>


x =

    0.5268
    5.6488

>> 

2.2.2.2 線性加權和法

在具有多個指標的問題中,我們可以對那些相對重要的指標給予較大的權係數,從而將多目標向量問題轉爲所有目標的加權求和的標量問題. 這樣,我們可以使用線性加權和法解決多目標線性規劃問題.

基於以上思路,我們構造如下的評價函數:
minxDZ(x)=i=1rωiZi(x)min_{x \in D} Z(x) = \sum^{r}_{i = 1}\omega_{i}Z_{i}(x)
maxZ=Cxmax Z = Cx
將其最優解 xx^{*} 作爲約束條件在線性加權和意義下的"最優解" (ωi\omega_{i} 爲加權因子,有多種選取方法,包括 專家打分法, 容限法加權因子分解法等.)

[例]
取權係數分別爲 ωi=0.5,ω2=0.5\omega_{i} = 0.5, \omega_{2} = 0.5.對
maxf1(x)=3x12x2maxf_{1}(x) = 3x_{1} - 2x_{2}
maxf2(x)=4x13x2 maxf_{2}(x) = -4x_{1} - 3x_{2}
s.t.{2x1+3x2182x1+x210x1,x20 s.t. \begin{cases} 2x_{1} + 3x_{2} \leqslant 18\\ 2x_{1} + x_{2} \leqslant 10 \\ x_{1}, x_{2} \geqslant 0\end{cases}
進行線性加權和法求解.

[解]

f = [-0.5;-2.5];
A = [2,3;2,1];
b = [18;10];
lb = [0;0];
x = linprog(f,A,b,[],[],lb)

程序執行結果爲:

x = 

    0.0000
    6.0000

2.2.2.3 最大最小法

在進行決策時, 採取保守策略無疑是穩妥的. 這要求我們在最壞的情況下尋求最好的結果. 按照這一思路,我們可以構造如下評價函數:

ϕ(Z)=max1irZi\phi(Z) = max_{1\leqslant i \leqslant r}Z_{i}

minxDϕ[Z(x)]=minxDmax1irZi(x)min_{x \in D} \phi[Z(x)] = min_{x \in D}max_{1 \leqslant i \leqslant r} Z_{i} (x)

並求解
maxZ=Cx.maxZ = Cx.
並將其最優解 xx^{*} 作爲約束條件在最大最小意義下的最優解.

[例]
對問題
maxf1(x)=3x12x2maxf_{1}(x) = 3x_{1} - 2x_{2}
maxf2(x)=4x13x2 maxf_{2}(x) = -4x_{1} - 3x_{2}
s.t.{2x1+3x2182x1+x210x1,x20 s.t. \begin{cases} 2x_{1} + 3x_{2} \leqslant 18\\ 2x_{1} + x_{2} \leqslant 10 \\ x_{1}, x_{2} \geqslant 0\end{cases}
進行最大最小法求解.

[解]

%定義函數:fun(x)
function f = fun(x)
f(1) = 3*x(1) - 2*x(2);
f(2) = -4*x(1) - 3*x(2);

隨後在單獨的MATLAB程序中調用上面定義的函數fun(x):

x0 = [1;1];
A = [2,3;2,1];
b = [18;10];
lb = zeros(2,1);
[x,fval] = fminimax('fun',x0,A,b,[],[],lb,[])

程序執行結果爲:

Local minimum possible. Constraints satisfied.

fminimax stopped because the size of the current search direction is less than
twice the default value of the step size tolerance and constraints are 
satisfied to within the default value of the constraint tolerance.

<stopping criteria details>


x =

   -0.0000
    6.0000


fval =

  -12.0000  -18.0000

>> end

3. 非線性規劃

在前文中, 我們簡要介紹了線性規劃, 即目標函數和約束條件均爲線性函數的規劃問題. 然而,在實際工作中,我們常常遇到另外一類更爲一般的規劃問題. 在這種問題中,目標函數和約束條件中至少有一個是非線性函數. 我們稱這樣的問題爲 非線性規劃問題.

非線性規劃是具有非線性約束條件或(和)非線性目標函數的數學規劃問題. 非線性規劃研究一個 nn 元實函數在一組等式或不等式的約束條件下的極值問題,且目標函數和約束條件中至少有一個是未知量的非線性函數.


3.1 非線性規劃的標準形式

非線性規劃在計算上相比線性規劃而言常常要困難得多, 理論上的討論也無法像線性規劃那樣給出簡潔的結果形式和全面透徹的結論. 在數學建模中, 要進行認真的分析, 對實際問題進行合理假設和簡化, 優先考慮使用線性規劃模型, 當線性近似誤差較大時再去考慮使用非線性規劃.

非線性規劃問題的標準形式爲:
minf(x)minf(x)
s.t.{gi(x)0i=1,2,,mhj(x)=0j=1,2,,r s.t.\begin{cases} g_{i}(x)\leqslant 0 & i = 1,2,\cdots,m \\ h_{j}(x) = 0 & j = 1,2,\cdots, r \end{cases}
其中, xxnn 維歐氏空間 RR^{*} 中的向量, f(x)f(x) 爲目標函數. gi(x)g_{i}(x) , hj(x)h_{j}(x) 爲約束條件,且目標函數和約束條件中至少有一個是非線性函數.

非線性規劃模型按照約束條件分類可分爲以下三類:

  1. 無約束非線性規劃模型
    minf(x)minf(x)
    xRnx \in R^{n}
  2. 等式約束非線性規劃模型
    minf(x)minf(x)
    s.t.hj(x)=0     j=1,2,,rs.t.h_{j}(x) = 0 \ \ \ \ \ j = 1,2,\cdots,r
  3. 不等式約束非線性規劃模型
    minf(x)minf(x)
    s.t.hi(x)0     i=1,2,,ms.t.h_{i}(x) \leqslant 0 \ \ \ \ \ i = 1,2,\cdots,m

3.2 二次規劃

若某個非線性規劃的目標函數是自變量的二次函數, 且它的約束條件全都是線性函數,則稱這種規劃爲 二次規劃. 二次規劃是一類特殊的非線性規劃.

二次規劃有多種求解方法. 其中較爲簡便的是沃爾夫法. 它是依據庫恩-塔克條件,在線性規劃單純形法的基礎上加以修正而成的.

沃爾夫法的標準數學模型爲;
minx12xTHx+fTxmin_{x} \frac{1}{2}x^{T}Hx + f^{T}x

s.t.{AxbAeqx=beqlbxubs.t.\begin{cases} A · x \leqslant b \\ Aeq · x = beq \\ lb \leqslant x \leqslant ub\end{cases}
式中,H,AH,AAeqAeq 爲矩陣, f,b,beq,lb,ubf,b,beq,lb,ubxx 爲列向量.

在 MATLAB中, 我們使用quadprog 函數求解二次規劃問題,調用格式爲:

1. x = quadprog(H,f,A,b)
2. x = quadprog(H,f,A,b,Aeq,beq)
3. x = quadprog(H,f,A,b,lb,ub)
4. x = quadprog(H,f,A,b,lb,ub,x0)
5. x = quadprog(H,f,A,b,lb,ub,x0,options)
6. [x,fval] = quadprog(...)
7. [x,fval,exitflag] = quadprog(...)
8. [x,fval,exitflag,output] = quadprog(...)
9. [x,fval,exitflag,output,lambda] = quadprog(...)
  1. 返回使函數 12xTHx+fTx\frac{1}{2}x^{T}Hx + f^{T}x 最小化的向量 xx,其約束條件爲 Axb.A·x \leqslant b.
  2. 返回使函數 12xTHx+fTx\frac{1}{2}x^{T}Hx + f^{T}x 最小化的向量 xx,其約束條件爲 AxbA·x \leqslant bAeqx=beq.Aeq · x = beq.
  3. 定義變量的下界和上界.
  4. 要求同上,且設置初值 x0.x0.
  5. 根據 options 所指定的優化參數最小化.
  6. 返回向量 xxxx 處的目標函數值 fval.fval.
  7. 返回參數 exitflag, 描述計算的退出條件.
  8. 返回包含優化信息的結構輸出 output.
  9. 返回解 xx 處包含 LagrangeLagrange 乘子的 lambda 結構參數.

[例]

求解下列最優化問題:

目標函數爲:
f(x)=12x12+x22x1x22x16x2f(x) = \frac{1}{2}x^{2}_{1} + x^{2}_{2} - x_{1}x_{2} - 2x_{1} - 6x_{2}
約束條件爲:
{x1+x22x1+2x222x1+x23x10,x20\begin{cases} x_{1} + x_{2} \leqslant 2 \\ -x_{1} + 2x_{2} \leqslant 2 \\ 2x_{1} + x_{2} \leqslant 3 \\ x_{1} \geqslant 0, x_{2} \geqslant 0\end{cases}

[解]

目標函數修改爲;
f(x)=12(x122x1x2+2x22)2x16x2f(x) = \frac{1}{2}(x_{1}^{2} - 2x_{1}x_{2} + 2x_{2}^{2}) -2x_{1} - 6x_{2}
並且記
H=[1112],f=[26],x=[x1x2],A=[111221],b=[223]H = \begin{bmatrix} 1 & -1 \\ -1 & 2\end{bmatrix}, f = \begin{bmatrix} -2 \\ -6\end{bmatrix}, x = \begin{bmatrix} x_{1}\\ x_{2}\end{bmatrix},A = \begin{bmatrix} 1 & 1 \\ -1 & 2 \\ 2 & 1\end{bmatrix}, b =\begin{bmatrix} 2 \\ 2 \\ 3\end{bmatrix}
上述優化問題相應地記爲
minx12xTHx+fTxmin_{x} \frac{1}{2}x_{T}Hx + f^{T}x
s.t.{Axb(0,0)Txs.t.\begin{cases} A \cdot x \leqslant b\\ (0,0)^{T} \leqslant x \end{cases}
按照上述思路,編寫程序:

H = [1,-1;-1,2];
f = [-2;-6];
A = [1 1;-1 2;2 1];
b = [2;2;3];
lb = zeros(2,1);
[x,fval,exitflag] = quadprog(H,f,A,b,[],[],lb)

程序運行結果如下:


Minimum found that satisfies the constraints.

Optimization completed because the objective function is non-decreasing in 
feasible directions, to within the default value of the optimality tolerance,
and constraints are satisfied to within the default value of the constraint tolerance.

<stopping criteria details>


x =

    0.6667
    1.3333


fval =

   -8.2222


exitflag =

     1

>> 

3.3 無約束規劃

無約束規法劃是最常見的一種求解非線性規劃的方法, 它在實際應用中也較爲常見. 此外, 我們也可以將許多有約束最優化問題轉換爲無約束最優化問題進行求解.

求解無約束最優化問題的方法主要有兩類: 直接搜索法和梯度法.

直接搜索法適用於目標函數高度非線性, 不存在導數或導數難以計算的情形. 很多實際問題都是非線性的, 直接搜索法不失爲一種有效的解決辦法. 常用的直接搜索法包括 單純形法, Hooke-Jeeves搜索法, Pavell 共軛方向法等. 直接搜索法的缺點是收斂速度慢,求解時間長.

在可求函數導數的情況下, 梯度法是一種更優越的方法. 梯度法利用函數的梯度和 HessianHessian 矩陣構造算法, 達成更快的收斂速度.

在 MATLAB 中,無約束規劃可以由三個功能函數 fminbnd, fminsearch, fminunc 實現.

3.3.1 fminbnd 函數

該函數的功能是求 取固定區間內單變量函數 的最小值.數學模型爲:
minxf(x),    x1xx2min_{x}f(x),\ \ \ \ x_{1}\leqslant x\leqslant x_{2}
式中, x,x1,x2x,x_{1},x_{2} 均爲標量, f(x)f(x) 爲目標函數.

函數調用格式如下:

1. x = fminbnd(fun,x1,x2)
2. x = fminbnd(fun,x1,x2,options)
3. x = fminbnd(fun,x1,x2,options,P1,P2,...)
4. [x,fval] = fminbnd(...)
5. [x,fval,exitflag] = fminbnd(...)
6. [x,fval,exitflag,output] = fminbnd(...)
  1. 返回 [x1,x2][x1,x2] 區間上 fun 參數描述的標量函數的最小值點 xx.
  2. options 參數指定的優化參數進行最小化.
  3. 提供額外的參數 P1,P2P1,P2 等,傳輸給目標函數 funfun. 若不需要則空置爲’[]’.
  4. 返回解 xx 處目標函數的值.
  5. 返回 exitflag 值描述 fminbnd 函數的退出條件.
  6. 返回包含優化信息的結構輸出.

對優化參數選項 optionsoptions, 可使用 optimset 函數設置或改變這些參量的值. options 參數有以下選項:

1. Display
2. MaxFunEvals
3. MaxIter
4. TolX
5. exitflag
6. output
  1. ‘off’:不顯示輸出. ‘iter’:顯示每一步迭代過程. ‘fina’:顯示最終結果.
  2. 指定函數評價的最大允許次數.
  3. 指定最大允許迭代次數.
  4. 指定 XX 處的終止容限.
  5. 描述退出條件: 大於0表示目標函數收斂於解 xx 處. 等於0表示已經達到函數評價或迭代的最大次數. 小於0表示目標函數不收斂.
  6. 該參數包含三種優化信息: ouput.iterations 表示迭代次數; output.algorithm 表示所用算法; output.funcCount 表示函數評價次數.

[注]

  1. 目標函數在區間內必須爲連續函數.
  2. fminbnd 函數可能只能給出局部最優解而非全局最優解.
  3. 當問題的解位於區間邊界上時,fminbnd 函數的收斂速度常常很慢.
  4. fminbnd 函數只用於實變量.

[例]

(0,2π)(0,2\pi) 上求函數 y=sin2xy = sin2x 的最小值.

[解]

輸入

[x,y_min] = fminbnd('sin(2*x)',0,2 * pi)

輸出爲


x =

    2.3562


y_min =

   -1.0000

[例]

對邊長爲 4m4m 的正方形鐵板,在四角處減去邊長相等的小正方形從而製成無蓋盒子,應該怎麼剪才能使得盒子容積最大?

[解]
構造數學模型:設剪去的正方形邊長爲 xx, 則對應的盒子容積爲 f(x)=(42x)2xf(x) = (4-2x)^{2}x
要使容積最大化,就要求函數 f(x)f(x) 在區間 x(0,2)x \in (0,2) 上的最大值, 也就是求 f(x)-f(x) 在區間上的最小值.

輸入

[x,f_min] = fminbnd('-(4-2*x)^2 * x',0,2)

輸出爲


x =

    0.6667


f_min =

   -4.7407

即:在四個邊角剪去邊長爲 0.6667m0.6667m 的正方形, 所得容器容積最大, 爲4.74.7m3.4.74.7m^{3}.


3.3.2 fminsearch 函數

該函數功能爲求解多變量無約束函數的最小值,其數學模型爲:
minxf(x)min_{x}f(x)
其中, xx 爲向量, f(x)f(x) 爲一個返回標量函數值的函數.

fminsearch 函數常用於無約束非線性最優化問題. 其調用格式如下:

1. x = fminserach(fun,x0)
2. x = fminserach(fun,x0,options)
3. x = fminserach(fun,x0,options,P1,P2,...)
4. [x,fval] = fminsearch(...)
5. [x,fval,exitflag] = fminsearch(...)
6. [x,fval,exitflag,output] = fminsearch(...)
  1. 設定初值爲 x0x0,求函數 funfun 的局部極小點 xx.
  2. optionsoptions 指定的優化參數進行優化.
  3. 將問題參數 P1,P2P1,P2 等直接輸給目標函數 funfun, 將 optionsoptions參數設爲空矩陣,作爲默認值.
  4. xx 處的目標函數值返回到 fvalfval 參數中.
  5. 返回 exitflagexitflag 值,描述函數的退出條件.
  6. 返回包含優化信息的參數 outputoutput 的結構輸出.

[注]

  1. 應用 fminsearch 函數可能會得到局部最優解.
  2. fminsearch 函數只對實數進行最小化,也即是說 xx 必須由實數組成, f(x)f(x) 函數也必須返回實數. 若 xx 爲複數,則必須將它分爲實部和虛部兩個部分.
  3. 對於求解二次以上的問題而言, fminubc 函數比 fminsearch 函數有效,但對於 高度非線性不連續問題, fminsearch 函數更具穩健性.
  4. fminsearch 函數不適合求解平方和問題, 使用 lsqnonlin 函數更好一些.

[例]

求函數 313+3x1x237x1x2+2x223_{1}^{3} + 3x_{1}x_{2}^{3} - 7x_{1}x_{2} + 2x_{2}^{2} 的最小值.

[解]

輸入

f = '3*x(1)^3 + 3*x(1)*x(2)^3 - 7*x(1)*x(2) + 2*x(2)^2'
x0 = [0,0];
[x,f_min] = fminsearch(f,x0) 

運行結果爲


f =

    '3*x(1)^3 + 3*x(1)*x(2)^3 - 7*x(1)*x(2) + 2*x(2)^2'


x =

    0.6269    0.5960


f_min =

   -0.7677


3.3.3 fminunc 函數

fminunc 函數功能爲求多變量標量函數的最小值, 常用於無約束非線性規劃問題的求解. 調用格式如下:

1. x = fminunc(fun,x0)
2. x = fminunc(fun,x0,options)
3. x = fminunc(fun,x0,options,P1,P2,...)
4. [x,fval] = fminunc(...)
5. [x,fval,exitflag] = fminunc(...)
6. [x,fval,exitflag,output] = fminunc(...)
7. [x,fval,exitflag,output,grad] = fminunc(...)
8. [x,fval,exitflag,output,grad,Hessian] = fminunc(...)
  1. 設定初值爲 x0x0,求函數 funfun 的局部極小點 xx.
  2. optionsoptions 指定的優化參數進行最小化.
  3. 將問題參數 P1,P2P1,P2 等直接輸給目標函數 funfun, 將 optionsoptions參數設爲空矩陣,作爲默認值.
  4. xx 處的目標函數值返回到 fvalfval 參數中.
  5. 返回 exitflagexitflag 值,描述函數的退出條件.
  6. 返回包含優化信息的參數 outputoutput 的結構輸出.
  7. 將解 xxfunfun 函數的梯度返回到 gradgrad 參數中.
  8. 將解 xx 處目標函數的 Hessian矩陣信息返回到參數 HessianHessian 中.

對於優化參數選項 options, 可使用 optimset 函數設置或改變這些參數的值. 其中有的參數適用於所有的優化算法, 有的只適用於大型優化問題, 另外一些適用於中型優化問題.

我們首先描述適用於大型優化問題的 optionsoptions 選項. 對於 fminunc 函數,必須提供的梯度信息包括:

1. LargeScale
2. Diagnostics
3. Display
4. GradObj
5. MaxFunEvals
6. MaxIter
7. TolFun
8. TolX
9. Hessian
10. HessPattern
11. MaxPCGIter
12. PrecondBandWidth
13. TolPCG
14. TypicalX
15. DerivativeCheck
16. DiffMaxChange
17. DiffMinChange
18. LineSearchType
19. exitflag變量
20. output變量
 
  1. 設爲’on’ 時, 使用大型算法; 設爲’off’ 時,使用解決中型問題的算法.
  2. 輸出最小化函數的診斷信息.
  3. 顯示水平: ‘off’: 不顯示輸出; ‘iter’: 顯示每一步迭代過程的輸出; ‘final’: 顯示最終結果.
  4. 用戶定義的目標函數的梯度.
  5. 函數評價的最大次數
  6. 最大允許迭代次數
  7. 函數值的終止容限
  8. xx 處的終止容限, 只適用於大型算法的參數.
  9. 用戶定義的目標函數的 Hessian 矩陣.
  10. 用於有限差分的 Hessian 矩陣的稀疏形式.
  11. PCG迭代的最大次數.
  12. PCG前處理的帶寬, 默認爲0.
  13. PCG迭代的終止容限.
  14. 典型 xx 值, 該參數只適用於中型算法.
  15. 對用戶提供的導數和有限差分求出的導數進行對比.
  16. 變量有限差分梯度的最大變化
  17. 變量有限差分梯度的最小變化
  18. 一維搜索算法的選擇
  19. 描述退出條件: >0>0 表示目標函數收斂於解 xx 處, =0=0 表示已經達到函數評價或迭代的最大次數; <0<0 表示目標函數不收斂.
  20. 該參數包含的優化信息有:
  1. outlut.iterations 表示迭代次數;
  2. output.algorithm 表示所採用的算法;
  3. output.funCount 表示函數評價次數;
  4. output.cgiterations 表示PCG迭代次數;
  5. output.stepsize 表示最終步長的大小;
  6. output.firstorderopt 表示一階優化的度量;

注:

  1. fun 爲需要最小化的目標函數. 該函數需要向量參數 xx 作爲輸入, 返回 xx 處的目標函數值(標量) I.I. 在實際使用中, 可將其定義爲命令行:

    x = fminunc(inline('norm(x)^2'),x0)
    

    同樣, fun 函數還可以是一個包含函數名的字符串, 它所對應的函數可以是.m 文件, 內部函數或 .mex 文件.

  2. fun = 'myfun', 則 x = fminunc(@myfun,x0). 其中,.m 文件必須具有以下形式:

    function f = myfun(x)
    f = ......       %計算x處的函數值
    
  3. 若可以計算出 fun 函數的梯度, 且參數 options.GradObj 設爲’on’,也就是:

    options = optimset('GradObj','on')
    

    fun 函數必須返回解 xx處的梯度向量 gg 到第二個輸出變量中. 當被調用的 fun 函數只需要一個輸出變量時(如算法只需要目標函數的值而不需要其梯度值時), 可通過覈對 nargout 的值避免計算梯度值:

     function[f, g] = myfun(x)
     f = ...
     if nargout >1
         g = ...
     end 
    
  4. 若 Hessian 矩陣可以求得, 且 options.Hessian 設爲 on, 即:

    options = optimset('Hessian','on')
    

    fun 函數必須返回解 xx 處的 Hessian 矩陣到第三個輸出變量中去. 當被調用的 fun 函 數不需要 Hessian 矩陣值時,可通過覈對 nargout 的值來避免計算 Hessian 矩陣:

    function[f, g] = myfun(x)
    f = ...
    if nargout > 1
        g = ...
        if nargout > 2
        H = ...
    end
    
  5. 目標函數必須是連續的, fminunc 函數有時只能給出局部最優解.

  6. fminunc 函數只能對實數進行優化, 因此 f(x)f(x) 必須返回實數, xx 必須是實數. 當 xx 爲複數時, 必須將其分解爲實部和虛部.

  7. 在使用大型算法時, 用戶必須在 fun函數中提供梯度,否則將給出警告信息.

  8. 對於求解平方和問題, 相較fminunc 函數, lsqnonlin 函數效果更佳.

[例]

最小化函數:
f(x)=3x12+2x1x2+x22f(x) = 3x_{1}^{2} + 2x_{1}x_{2} + x_{2}^{2}

[解]

% 定義函數並保存爲.m 文件
function f = myfun1(x)
f = 3*x(1)^2 + 2*x(1)*x(2) + x(2)^2;

隨後在Command Window中調用函數:

[x,fval] = fminunc(@myfun1,x0)

運行得到結果:

Local minimum found.

Optimization completed because the size of the gradient is less than
the default value of the optimality tolerance.

<stopping criteria details>

>> x,fval

x =

   1.0e-06 *

    0.2541   -0.2029


fval =

   1.3173e-13

下面再使用提供的梯度 gg 最小化原函數:

function [f,g] = myfun1(x)
f = 3*x(1)^2 + 2*x(1)*x(2) + x(2)^2;
if nargout >1
    g(1) = 6*x(1) + 2*x(2);
    g(2) = 2*x(1) + 2*x(2);
end

將優化選項結構 options.GradObj 設爲on得到梯度值:

>> options = optimoptions('fminunc','GradObj','on','Algorithm','trust-region');
>> x0 = [1,1];
>> [x,fval] = fminunc(@myfun1,x0,options)

Local minimum found.

Optimization completed because the size of the gradient is less than
the default value of the optimality tolerance.

<stopping criteria details>


x =

   1.0e-15 *

    0.2220   -0.2220


fval =

   9.8608e-32


3.4 有約束規劃

有約束規劃法是一種非線性規劃求解方法. 在有約束最優化問題中, 常需要將該問題轉化爲更簡單的子問題. 這些子問題可以求解並作爲迭代過程的基礎.

我們可以用 fmincon 函數求解有約束規劃問題. 該函數調用格式如下;

1. x = fmincon(fun,x0,A,b)
2. x = fmincon(fun,x0,A,b,Aeq,beq)
3. x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub)
4. x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon)
5. x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)
6. [x,fval] = fmincon(...)
7. [x,fval,exitflag] = fmincon(...)
8. [x,fval,exitflag,output] = fmincon(...)
9. [x,fval,exitflag,output,lambda] = fmincon(...)
10. [x,fval,exitflag,output,lambda,grad] = fmincon(...)
11. [x,fval,exitflag,output,lambda,grad,hessian] = fmincon(...)
  1. 給定初值 x0x0,求解函數fun 的最小值點 xx. 函數約束條件爲 AxbA\cdot x \leqslant b.
  2. 同時還增加約束條件 AxbA\cdot x \leqslant bAeqx=beq.Aeq \cdot x = beq.
  3. 同時還定義變量 xx 的上界和下界.
  4. 同時還在nonlcon 參數中提供非線性的 c(x)ceq(x).
  5. options 指定的參數進行最小化.
  6. 同時還返回解 xx 處的目標函數值.
  7. 同時還返回 exitflag 參數, 描述函數計算的退出條件.
  8. 同時還返回包含優化信息的輸出參數output.
  9. 同時還返回解 xxfun 函數 Lagrange乘子的 lambda 參數.
  10. 同時還返回解 xxfun 函數的梯度.
  11. 同時還返回解 xxfun 函數的 Hessian 矩陣

注: nonlcon 參數
nonlcon 參數計算非線性不等式約束 c0c \leqslant 0 和非線性等式約束 ceq(x)=0.ceq(x) = 0. 該參數是一個包含函數名的字符串. 此參數要求輸入一個向量 xx, 返回兩個變量: xx 處的非線性不等式向量 cc 和非線性等式向量 ceq.ceq. 舉例:若 nonlcon = 'mycon', 則.m 文件 mycon.m 必須具備以下格式:

function [c,ceq] = mycon(x)
c = ...       %計算x處的非線性不等式
ceq = ...     %計算x處的非線性等式

若還計算了約束的梯度,即:

options = optimset('GradConstr', 'on')

nonlcon 函數必須在第三個和第四個輸出變量中返回 c(x) 的梯度 GCceq 的梯度 GCeq.

當被調用的 nonlcon 函數不需要輸出梯度值時,可通過檢測 nargout 來避免計算梯度:

function [c,ceq,GC,GCeq] = mycon(x)
c = ...
ceq = ...
if nargout >2
    GC = ...
    GCeq = ...
end

[例]

解優化問題:
minf(x1,x2,x3)=x12(x2+2)x3min f(x_{1},x_{2},x_{3}) = x_{1}^{2}(x_{2} + 2)x_{3}
約束條件爲
{350163x12.86x30.860104103x14x2x33x1(x2+1.5)+4.4103x14x2x333.7x303753.56105x1x21x324x3x101x144.5x25010x330\begin{cases} 350-163x_{1}^{-2.86}x_{3}^{0.86} \leqslant 0 \\ 10-4*10^{-3}x_{1}^{-4}x_{2}x_{3}^{3} \leqslant \\ x_{1}(x_{2}+1.5) + 4.4*10^{-3}x_{1}^{-4}x_{2}x_{3}^{3}-3.7x_{3} \leqslant 0 \\ 375-3.56*10^{5}x_{1}x_{2}^{-1}x_{3}^{-2} \leqslant \\ 4-\frac{x_{3}}{x_{1}} \leqslant 0 \\ 1 \leqslant x_{1} \leqslant 4 \\ 4.5 \leqslant x_{2} \leqslant 50 \\ 10 \leqslant x_{3} \leqslant 30 \end{cases}

[解]

定義目標函數和非線性約束條件函數:

function f = myfun00(x)
f = x(1)*x(1)*(x(2)+2)*x(3); 

function [c,ceq] = myfun01(x)
c(1) = 350 - 163*x(1)^(-2.86)*x(3)^0.86;
c(2) = 10-0.004*(x(1)^(-4))*x(2)*(x(3)^3);
c(3) = x(1)*(x(2)+1.5)+0.0044*(x(1)^(-4))*x(2)*(x(3)^3)-3.7*x(3);
c(4) = 375-356000*x(1)*(x(2)^(-1))*x(3)^(-2);
c(5) = 4-x(3)/x(1);
ceq = 0;

函數求解程序:

x0 = [2 25 20]';
lb = [1 4.5 10]';
ub = [4 50 30]';
[x,fval,exitflag] = fmincon(@myfun00,x0,[],[],[],[],lb,ub,@myfun01)

運行結果如下:


Local minimum found that satisfies the constraints.

Optimization completed because the objective function is non-decreasing in 
feasible directions, to within the default value of the optimality tolerance,
and constraints are satisfied to within the default value of the constraint tolerance.

<stopping criteria details>


x =

    1.0000
    4.5000
   10.0000


fval =

   65.0005


exitflag =

     1

>> 

目標函數和非線性約束條件函數:

function f = myfun00(x)
f = x(1)*x(1)*(x(2)+2)*x(3); 

function [c,ceq] = myfun01(x)
c(1) = 350 - 163*x(1)^(-2.86)*x(3)^0.86;
c(2) = 10-0.004*(x(1)^(-4))*x(2)*(x(3)^3);
c(3) = x(1)*(x(2)+1.5)+0.0044*(x(1)^(-4))*x(2)*(x(3)^3)-3.7*x(3);
c(4) = 375-356000*x(1)*(x(2)^(-1))*x(3)^(-2);
c(5) = 4-x(3)/x(1);
ceq = 0;

函數求解程序:

x0 = [2 25 20]';
lb = [1 4.5 10]';
ub = [4 50 30]';
[x,fval,exitflag] = fmincon(@myfun00,x0,[],[],[],[],lb,ub,@myfun01)

運行結果如下:


Local minimum found that satisfies the constraints.

Optimization completed because the objective function is non-decreasing in 
feasible directions, to within the default value of the optimality tolerance,
and constraints are satisfied to within the default value of the constraint tolerance.

<stopping criteria details>


x =

    1.0000
    4.5000
   10.0000


fval =

   65.0005


exitflag =

     1

>> 
發佈了37 篇原創文章 · 獲贊 15 · 訪問量 8327
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章