計算機軟件求解線性規劃模型--Python

線性規劃簡介

線性規劃(Linear programming,簡稱LP),是運籌學中研究較早、發展較快、應用普遍、方法較成熟的一個重要分支,它是輔助人們進行科學管理的一種數學方法。研究線性約束條件下線性目標函數的極值問題的數學理論和方法。英文縮寫LP。python

線性規劃是運籌學的一個重要分支,普遍應用於軍事做戰、經濟分析、經營管理和工程技術等方面。爲合理地利用有限的人力、物力、財力等資源做出的最優決策,提供科學的依據。算法

線性規劃模型的三要素

線性規劃模型主要包括三個部分:決策變量、目標函數、約束條件編程

決策變量
決策變量是指問題中能夠改變的量,例如生產多少貨物,選擇哪條路徑等;線性規劃的目標就是找到最優的決策變量。
在線性規劃中決策變量包括實數變量,整數變量,0-1變量等。

微信

目標函數
目標函數就是把問題中的決策目標量化,通常分爲最大化目標函數和最小化目標函數。在線性規劃中,目標函數爲一個包含決策變量的線性函數,例如
max x 1 + x 2 \text{max}\quad x_1 +x_2 maxx1+x2
約束條件


函數

約束條件是指問題中各類時間,空間,人力,物力等限制。在線性規劃中約束條件通常表示爲一組包含決策變量的不等式,例如
x 1 + 2 x 2 ≤ 10 4 x 1 + 3 x 2 ≤ 24 \begin{array}{r} x_{1}+2 x_{2} \leq 10 \\ 4 x_{1}+3 x_{2} \leq 24 \end{array} x1+2x2104x1+3x224
此外,決策變量的取值範圍稱爲符號約束,例如:
x 1 ≥ 0 , x 2 ≥ 0 x_1 \geq 0,x_2\geq 0 x10,x20


spa

線性規劃模型的數學表示

線性規劃模型能夠寫成以下形式:
max ⁡ z = x 1 + x 2  s.t.  x 1 + 2 x 2 ≤ 10 4 x 1 + 3 x 2 ≤ 24 x 1 , x 2 ≥ 0 \begin{aligned} &\max \quad z=x_{1}+x_{2}\\ &\text { s.t. } \quad x_{1}+2 x_{2} \leq 10\\ &\begin{array}{r} \quad \quad 4 x_{1}+3 x_{2} \leq 24 \\ \quad x_{1}, x_{2} \geq 0 \end{array} \end{aligned} maxz=x1+x2 s.t. x1+2x2104x1+3x224x1,x20
其中, s . t . s.t. s.t. 表示 s u b j e c t    t o subject \; to subjectto 的縮寫。

3d

上述模型的矩陣形式以下:
max ⁡ z = c T x  s.t.  A x ≤ b x ≥ 0 \begin{array}{rr} \max & z=c^{T} x \\ \text { s.t. } & A x \leq b \\ & x \geq 0 \end{array} max s.t. z=cTxAxbx0
對於有 n n n 個決策變量, m m m 個約束的線性規劃模型, c , x c,x c,x n n n 維列向量, b b b m m m 爲列向量, A A A m ∗ n m*n mn 維繫數矩陣。

code

單純型法標準型與編程過程的「標準型」

單純型法:blog

​ 單純型法思路就是在 可行域的一個頂點處找到一個初始可行解判斷該解是否是最優,若不是,則迭代到下一個頂點處進行重複判斷。由於最優解的搜索範圍從整個可行域縮小到了可行域的有限個頂點,算法的效率獲得了極大的提高。圖片

在這裏插入圖片描述

在單純型法中,咱們經過增長變量等將約束條件變成等式。在編程中,通常支持直接寫等式約束小於等於約束

在單純型法中,咱們將最大化目標函數視爲標準型。在編程中,咱們將最小化目標函數做爲標準型。

Python 求解線性規劃模型

編程思路:

1. 選擇適當的決策變量

在解決實際問題時,把問題歸結成一個線性規劃數學模型是很重要的一步,但每每也是困難的一步,模型創建得是否恰當,直接影響到求解。而選適當的決策變量,是咱們創建有效模型的關鍵之一。

2.將求解目標簡化爲求一個目標函數的最大/最小值

能把要求解的問題簡化爲一個最值問題是可否使用線性規劃模型的關鍵,若是這一點不能達到,以後的工做都有沒有意義的。

3. 根據實際要求寫出約束條件(正負性,資源約束等)

線性規劃的約束條件針對不一樣的問題有不一樣的形式,總結來講有如下三種:等式約束、不等式約束、符號約束

考慮如下線性規劃問題:
max ⁡ z = 2 x 1 + 3 x 2 − 5 x 3  s.t.  x 1 + x 2 + x 3 = 7 2 x 1 − 5 x 2 + x 3 ≥ 10 x 1 + 3 x 2 + x 3 ≤ 12 x 1 , x 2 , x 3 ≥ 0 \begin{array}{r} \max z=2 x_{1}+3 x_{2}-5 x_{3} \\ \text { s.t. } \quad x_{1}+x_{2}+x_{3}=7 \\ 2 x_{1}-5 x_{2}+x_{3} \geq 10 \\ x_{1}+3 x_{2}+x_{3} \leq 12 \\ x_{1}, x_{2}, x_{3} \geq 0 \end{array} maxz=2x1+3x25x3 s.t. x1+x2+x3=72x15x2+x310x1+3x2+x312x1,x2,x30
Step1:導入相關函數庫:

import numpy as np 
from scipy import optimize as op

Step2: 定義決策變量:

# 給出變量取值範圍
x1=(0,None)  
x2=(0,None)
x3=(0,None)

Step3: 將原問題化爲標準形式

注意:編程時默認爲最小化目標函數,所以這裏改成 ;第二個約束爲大於等於約束,這裏化爲小於等於約束;

Step4: 定義目標函數係數和約束條件係數

c=np.array([-2,-3,5])   # 目標函數係數,3x1列向量

A_ub=np.array([[-2,5,-1],[1,3,1]]) # 不等式約束係數A,2x3維矩陣
B_ub=np.array([-10,12])  # 等式約束係數b, 2x1維列向量
A_eq=np.array([[1,1,1]])  # 等式約束係數Aeq,3x1維列向量
B_eq=np.array([7])   # 等式約束係數beq,1x1數值

Step5: 求解

res=op.linprog(c,A_ub,B_ub,A_eq,B_eq,bounds=(x1,x2,x3)) #調用函數進行求解
print('結果以下:\n',res)

完整代碼以下:

import numpy as np 
from scipy import optimize as op 
# 給出變量取值範圍
x1=(0,None)  
x2=(0,None)
x3=(0,None)
c=np.array([-2,-3,5])   # 目標函數係數,3x1列向量

A_ub=np.array([[-2,5,-1],[1,3,1]]) # 不等式約束係數A,2x3維矩陣
B_ub=np.array([-10,12])  # 等式約束係數b, 2x1維列向量
A_eq=np.array([[1,1,1]])  # 等式約束係數Aeq,3x1維列向量
B_eq=np.array([7])   # 等式約束係數beq,1x1數值
res=op.linprog(c,A_ub,B_ub,A_eq,B_eq,bounds=(x1,x2,x3)) #調用函數進行求解
print('結果以下:\n',res)

結果以下

結果以下:
      con: array([1.80712334e-09])
     fun: -14.571428565645078
 message: 'Optimization terminated successfully.'
     nit: 5
   slack: array([-2.24570584e-10,  3.85714286e+00])
  status: 0
 success: True
       x: array([6.42857143e+00, 5.71428571e-01, 2.35900788e-10])

即,當 x 1 = 6.42857143 , x 2 = 0.571428571 , x 3 = 2.35900788 × 1 0 − 10 x_1=6.42857143,x_2=0.571428571,x_3=2.35900788\times10^{-10} x1=6.42857143,x2=0.571428571,x3=2.35900788×1010 時候目標函數取得最大值。

部份內容參考其餘文章 分享自微信公衆號 - 數據科學CLUB(jiji8215) 做者:少年吉

相關文章
相關標籤/搜索