數學建模 算法與應用 (python實現)第一章 線性規劃

第一章 線性規劃

線性規劃問題:

目標函數和約束條件均爲線性函數時的問題,成爲線性規劃問題

線性規劃的一般模型

max z=j=1ncjxjs.t.{j=1naijxjbx0 ,j=1,2,...,n max\ z = \sum_{j=1}^n c_jx_j \\ s.t. \begin{cases} \sum_{j=1}^n a_{ij}x_j\leq b \\ x\ge 0\ ,j=1,2,...,n \end{cases}

  • 可行解:滿足約束的解x=[x1,...,xn]Tx=[x_1, ...,x_n]^T
  • 可行域:所有可行解構成的集合,記作RR

線性規劃的軟件求解

爲規範,將線性規劃的標準形式定爲:
mincTx,s.t.{Aupx=bUpAeqx=beqlbxub \min c^Tx, \\ s.t. \begin{cases} A_{up}\cdot x = b_{Up} \\ A_{eq}\cdot x = b_{eq} \\ lb \leq x \leq ub \end{cases}
python代碼如下,其中rr爲解:

import numpy as np
from scipy.optimize import linprog

c = np.array([-2, -3, +5])
A_up = np.array([[-2, 5, -1], [1, 3, 1]])
b_up = np.array([-10, 12])
A_eq = np.array([[1, 1, 1]])
b_eq = np.array([7])

r = linprog(c, A_up, b_up, A_eq, b_eq, bounds=((0, None), (0, None), (0, None)))

print(r)

運行結果實例:

     con: array([1.80711979e-09])
     fun: -14.571428565645085
 message: 'Optimization terminated successfully.'
     nit: 5
   slack: array([-2.24563479e-10,  3.85714286e+00])
  status: 0
 success: True
       x: array([6.42857143e+00, 5.71428571e-01, 2.35900788e-10])

例:

求解下列線性規劃問題:
minz=2x1+3x2+xs.t.{x1+4x2+2x383x1+2x26x1,x2,x30 \min z = 2x_1+3x_2+x \\ s.t. \begin{cases} x_1+4x_2+2x_3 \ge 8 \\ 3x_1+2x_2 \ge 6 \\ x_1, x_2, x_3 \ge 0 \end{cases}
將線性規劃轉化成以下形式:
minz=2x1+3x2+xs.t.{[142320][x1x2x3][86]x1,x2,x30 \min z = 2x_1+3x_2+x \\ s.t. \begin{cases} \begin{bmatrix} -1 & -4 & -2 \\ -3 & -2 & 0 \end{bmatrix} \begin{bmatrix} x_1\\x_2\\x_3 \end{bmatrix} \leq \begin{bmatrix} -8\\-6 \end{bmatrix} \\ x_1, x_2, x_3 \ge 0 \end{cases}
python代碼如下:

import numpy as np
from scipy.optimize import linprog

c = np.array([2, 3, 1])
A_up = np.array([[-1, -4, -2], [-3, -2, 0]])
b_up = np.array([-8, -6])

r = linprog(c, A_ub=A_up, b_ub=b_up, bounds=((0, None), (0, None), (0, None)))

print(r)

結果:

     con: array([], dtype=float64)
     fun: 6.999999994872991
 message: 'Optimization terminated successfully.'
     nit: 3
   slack: array([ 3.85261067e-09, -1.41066305e-08])
  status: 0
 success: True
       x: array([1.17949641, 1.23075538, 0.94874104])

注:scipy的優化函數有限,在精度和優化程度上可能比不上專業優化軟件MATLABLingo等。

可轉化爲線性規劃的問題

數學規劃問題:
minx1+x2+...+xns.t. Axb \min |x_1|+|x_2|+...+|x_n| \\ s.t. \ Ax\leq b

例:

求解下列數學規劃問題:
minz=x1+2x2+3x3+4x4s.t.{x1x2x3+x42,x1x2+x33x41,x1x22x3+3x412 \min z = |x_1|+2|x_2|+3|x_3|+4|x_4| \\ s.t. \begin{cases} x_1-x_2-x_3+x_4\leq -2, \\ x_1-x_2+x_3-3x_4 \leq -1, \\ x_1-x_2-2x_3+3x_4 \leq -\frac{1}{2} \end{cases}
將變量變換ui=xi+xi2,vi=xixi2u_i=\frac{x_i+|x_i|}{2},v_i=\frac{|x_i|-x_i}{2},則可把模型變換爲:
mincTy,s.t.{[A,A][uv]bu,v0 \min c^Ty, \\s.t.\begin{cases}[A, -A]\begin{bmatrix}u\\v\end{bmatrix}\leq b \\u, v \ge 0\end{cases}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章