1. 程式人生 > 其它 >matlab和python線性規劃和二次規劃

matlab和python線性規劃和二次規劃

技術標籤:Pythonmatlabpython

Python MATLAB

MATLAB和Python全文件

線性規劃問題

線性規劃問題的一般形式是:

min ⁡ α 1 x 1 + α 2 x 2 + ⋯ + α n x n    ( 1 ) \min \boldsymbol{\alpha }_1\boldsymbol{x}_1+\boldsymbol{\alpha }_2\boldsymbol{x}_2+\cdots +\boldsymbol{\alpha }_{\boldsymbol{n}}\boldsymbol{x}_{\boldsymbol{n}}\,\, \left( 1 \right)

minα1x1+α2x2++αnxn(1)

受平等約束:

不平等約束:

框約束:

x 1 ∈ ( X 1 min ⁡ , X 1 max ⁡ ) , ⋯   , x n ∈ ( X n min ⁡ , X n max ⁡ )    ( 4 ) \boldsymbol{x}_1\in \left( \boldsymbol{X}_{1}^{\min},\boldsymbol{X}_{1}^{\max} \right) ,\cdots ,\boldsymbol{x}_{\boldsymbol{n}}\in \left( \boldsymbol{X}_{\boldsymbol{n}}^{\min},\boldsymbol{X}_{\boldsymbol{n}}^{\max} \right) \,\, \left( 4 \right)

x1(X1min,X1max),,xn(Xnmin,Xnmax)(4)

值得注意的是形式的不等式約束:

∑ j = 1 n β j x j ⩾ γ j \sum_{\boldsymbol{j}=1}^{\boldsymbol{n}}{\boldsymbol{\beta }_{\boldsymbol{j}}\boldsymbol{x}_{\boldsymbol{j}}\geqslant \boldsymbol{\gamma }_{\boldsymbol{j}}} j=1nβjxjγj

等價於不平等約束:

− ∑ j = 1 n β j x j ⩽ − γ j -\sum_{\boldsymbol{j}=1}^{\boldsymbol{n}}{\boldsymbol{\beta }_{\boldsymbol{j}}\boldsymbol{x}_{\boldsymbol{j}}\leqslant -\boldsymbol{\gamma }_{\boldsymbol{j}}}

j=1nβjxjγj

因此,總是以以下形式寫任何不等式約束是很方便的

L H S ⩽ R H S \boldsymbol{LHS}\leqslant \boldsymbol{RHS} LHSRHS

等式(1)-(4)描述的線性規劃問題可以用矩陣形式表示為:

min ⁡ α T x \min \boldsymbol{\alpha }^{\boldsymbol{T}}\boldsymbol{x} minαTx

受限約束:

A x = b C x ⩽ d x ∈ X \boldsymbol{Ax}=\boldsymbol{b}\\\boldsymbol{Cx}\leqslant \boldsymbol{d}\\\boldsymbol{x}\in \boldsymbol{X} Ax=bCxdxX

其中,

A = [ a 11 a 12 ⋯ a 1 n a 21 a 22 ⋯ a 2 n ⋮ ⋮ ⋮ ⋮ a m 1 a m s ⋯ a m n ] , x = [ x 1 x 2 ⋮ x n ] , b = [ b 1 b 2 ⋮ b m ] , C = [ c 11 c 12 ⋯ c 1 n c 21 c 22 ⋯ c 2 n ⋮ ⋮ ⋱ ⋮ c l 1 c l s ⋯ c ln ⁡ ] , d = [ d 1 d 2 ⋮ d l ] , X = [ ( X 1 min ⁡ , X 1 max ⁡ ) ( X 2 min ⁡ , X 2 max ⁡ ) ⋮ ( X n min ⁡ , X n max ⁡ ) ] \boldsymbol{A}=\left[ \begin{matrix} \boldsymbol{a}_{11}& \boldsymbol{a}_{12}& \cdots& \boldsymbol{a}_{1\boldsymbol{n}}\\ \boldsymbol{a}_{21}& \boldsymbol{a}_{22}& \cdots& \boldsymbol{a}_{2\boldsymbol{n}}\\ \vdots& \vdots& \vdots& \vdots\\ \boldsymbol{a}_{\boldsymbol{m}1}& \boldsymbol{a}_{\boldsymbol{ms}}& \cdots& \boldsymbol{a}_{\boldsymbol{mn}}\\\end{matrix} \right] ,\boldsymbol{x}=\left[ \begin{array}{c} \boldsymbol{x}_1\\ \boldsymbol{x}_2\\ \vdots\\ \boldsymbol{x}_{\boldsymbol{n}}\\\end{array} \right] ,\boldsymbol{b}=\left[ \begin{array}{c} \boldsymbol{b}_1\\ \boldsymbol{b}_2\\ \vdots\\ \boldsymbol{b}_{\boldsymbol{m}}\\\end{array} \right] ,\\\boldsymbol{C}=\left[ \begin{matrix} \boldsymbol{c}_{11}& \boldsymbol{c}_{12}& \cdots& \boldsymbol{c}_{1\boldsymbol{n}}\\ \boldsymbol{c}_{21}& \boldsymbol{c}_{22}& \cdots& \boldsymbol{c}_{2\boldsymbol{n}}\\ \vdots& \vdots& \ddots& \vdots\\ \boldsymbol{c}_{\boldsymbol{l}1}& \boldsymbol{c}_{\boldsymbol{ls}}& \cdots& \boldsymbol{c}_{\ln}\\\end{matrix} \right] ,\boldsymbol{d}=\left[ \begin{array}{c} \boldsymbol{d}_1\\ \boldsymbol{d}_2\\ \vdots\\ \boldsymbol{d}_{\boldsymbol{l}}\\\end{array} \right] ,\boldsymbol{X}=\left[ \begin{array}{c} \left( \boldsymbol{X}_{1}^{\min},\boldsymbol{X}_{1}^{\max} \right)\\ \left( \boldsymbol{X}_{2}^{\min},\boldsymbol{X}_{2}^{\max} \right)\\ \vdots\\ \left( \boldsymbol{X}_{\boldsymbol{n}}^{\min},\boldsymbol{X}_{\boldsymbol{n}}^{\max} \right)\\\end{array} \right] A=a11a21am1a12a22amsa1na2namn,x=x1x2xn,b=b1b2bm,C=c11c21cl1c12c22clsc1nc2ncln,d=d1d2dl,X=(X1min,X1max)(X2min,X2max)(Xnmin,Xnmax)

最大化某個目標函式 f ( x ) \boldsymbol{f}\left( \boldsymbol{x} \right) f(x) 的問題等同於最小化 − f ( x ) -\boldsymbol{f}\left( \boldsymbol{x} \right) f(x) 的問題,因為 f ( x ) \boldsymbol{f}\left( \boldsymbol{x} \right) f(x) 的最大化問題和 − f ( x ) -\boldsymbol{f}\left( \boldsymbol{x} \right) f(x) 的最小化問題具有相同的最優解 x o p t \boldsymbol{x}^{\boldsymbol{opt}} xopt 。 在下圖1中,繪製了函式 f ( x ) = e − ( x − 0.5 ) sin ⁡ ( π x 2 ) \boldsymbol{f}\left( \boldsymbol{x} \right) =\boldsymbol{e}^{-\left( \boldsymbol{x}-0.5 \right)}\sin \left( \frac{\boldsymbol{\pi x}}{2} \right) f(x)=e(x0.5)sin(2πx) − f ( x ) -\boldsymbol{f}\left( \boldsymbol{x} \right) f(x) 的曲線圖。 從這兩個函式的圖形可以明顯看出, f ( x ) \boldsymbol{f}\left( \boldsymbol{x} \right) f(x) 的最大值是在使 − f ( x ) -\boldsymbol{f}\left( \boldsymbol{x} \right) f(x) 最小的同一點獲得的。

問題是,

max ⁡ α T x \max \boldsymbol{\alpha }^{\boldsymbol{T}}\boldsymbol{x} maxαTx

受約束,

A x = b C x ⩽ d x ∈ X \boldsymbol{Ax}=\boldsymbol{b}\\\boldsymbol{Cx}\leqslant \boldsymbol{d}\\\boldsymbol{x}\in \boldsymbol{X} Ax=bCxdxX

等同於問題:

min ⁡ β T x \min \boldsymbol{\beta }^{\boldsymbol{T}}\boldsymbol{x} minβTx

受約束,

A x = b C x ⩽ d x ∈ X \boldsymbol{Ax}=\boldsymbol{b}\\\boldsymbol{Cx}\leqslant \boldsymbol{d}\\\boldsymbol{x}\in \boldsymbol{X} Ax=bCxdxX

( β = − α ) \left( \boldsymbol{\beta }=-\boldsymbol{\alpha } \right) (β=α) 而沒有進一步改變相等性或不平等性約束。

用linprog解決線性規劃問題

考慮下面問題,

min ⁡ x ∈ R n α T x \underset{\boldsymbol{x}\in \mathbb{R}^{\boldsymbol{n}}}{\min}\boldsymbol{\alpha }^{\boldsymbol{T}}\boldsymbol{x} xRnminαTx

受約束,

A x = b , C x ⩽ d , l b ⩽ x ⩽ u b \boldsymbol{Ax}=\boldsymbol{b},\\\boldsymbol{Cx}\leqslant \boldsymbol{d},\\\boldsymbol{lb}\leqslant \boldsymbol{x}\leqslant \boldsymbol{ub} Ax=b,Cxd,lbxub

MATLAB函式linprog可用於解決線性程式設計問題。 它的形式為:

[xopt, fval] = linprog(objfun, C, d, A, b, lb, ub)

其中x0是初始起點。 如果問題不包含上下限,則形式為:

[xopt, fval] = linprog(objfun, C, d, A, b)

如果問題不包含相等約束,則將A和b替換為空方括號[]。 形式將是:

[xopt, fval] = linprog(objfun, C, d, [], [], lb, ub)

為了說明如何使用函式linprog,請考慮以下示例:

示例1在本例中,MATLAB的linprog函式將用於解決線性程式設計問題:

max ⁡ 3 x 1 + x 2 + 2 x 3 \max 3\boldsymbol{x}_1+\boldsymbol{x}_2+2\boldsymbol{x}_3 max3x1+x2+2x3

受限於,

3 x 1 + x 2 ⩽ 40 x 1 + 2 x 3 ⩽ 60 x 2 + 2 x 3 ⩽ 60 x 1 ⩾ 0 , x 2 ⩾ 0 , x 3 ⩾ 0 3\boldsymbol{x}_1+\boldsymbol{x}_2\leqslant 40\\\boldsymbol{x}_1+2\boldsymbol{x}_3\leqslant 60\\\boldsymbol{x}_2+2\boldsymbol{x}_3\leqslant 60\\\boldsymbol{x}_1\geqslant 0,\boldsymbol{x}_2\geqslant 0,\boldsymbol{x}_3\geqslant 0 3x1+x240x1+2x360x2+2x360x10,x20,x30

以下MATLAB指令用於查詢最佳解決方案:

>> objfun = [-3; -1; -2] ;
>> C = [3, 1, 0; 1, 0, 2; 0, 1, 2] ;
>> d = [40; 60; 60] ;
>> lb = [0; 0; 0] ;
>> [xopt, fval] = linprog(objfun, C, d, [], [], lb, [])
Optimal solution found.
xopt =
10
10
25
fval =
-90

預設情況下,MATLAB linprog函式使用雙單工演算法。 可以通過優化選項結構來更改演算法的選擇。 例如,切換到內點求解器並求解示例1,可以使用以下指令。

>> Options = optimoptions(’linprog’, ’Algorith’, ’interior-point’);
>> [xopt, fval] = linprog(objfun, C, d, [], [], lb, [], Options)
Minimum found that satisfies the constraints.
Optimization completed because the objective function is nondecreasing in feasible directions, to within the selected value
of the function tolerance, and constraints are satisfied to
within the selected value of the constraint tolerance.
xopt =
10.0000
10.0000
25.0000
fval =
-90.0000
>> Options = optimoptions(’linprog’, ’Algorith’,
’interior-point-legacy’, ’Disp’, ’Iter’) ;
>> [xopt, fval] = linprog(objfun, C, d, [], [], lb, [], Options)
Optimization terminated.
xopt =
10.0000
10.0000
25.0000
fval =
-90.0000

Python在scipy.optimize庫中還有一個函式linprog。 要使用linprog函式,必須從scipy的優化庫中匯入。 可以按照以下步驟進行:

In [1]: from scipy.optimize import linprog

Python函式linprog形式接近MATLAB的linporg形式。 其語法為:

OptSol = linprog(objfun, A_ub = C, b_ub = d, A_eq = A, b_eq = b,
bounds = bnds,\ method=’optmethod’, options = optoptions)

要使用Python解決示示例1,可以使用以下Python指令:

linprog函式的預設求解器是內部點方法。 但是該方法還有其他兩個選項,即單純形法和修訂的單純形法。 它們的用法如下:

使用fmincon MATLAB函式解決線性規劃問題

用pulp Python解決線性規劃問題

用pyomo解決線性規劃問題

用gekko解決線性規劃問題

解決二次規劃問題

詳情參閱http://viadean.com/matlab_python_linear_prog.html