文章目錄
- (一)簡單陳述本文章的內容
- (二)常用匯入檔案方式
- (三)線性規劃
- 3.1 線性規劃的一般模型
- 3.2 運用python各種庫和模塊求解線性方程
- 3.2.1 Scipy線性規劃模型
- 3.2.2 pulp線性規劃模型
- 3.2.3 cvxopt.solvers 模塊求解
- 3.2.4 用cvxpy庫求解
(一)簡單陳述本文章的內容
python建模會持續更新,用途是只作為個人筆記,我博客中的所有資料都可通過我提供的鏈接永久獲取,最后希望大家一起相互促進,相互努力,
本文章只介紹如何用python中的庫和模塊求解相對應的建模,不介紹相應的理論知識,理論知識可以查看鏈接下載:《數學建模演算法與應用》 提取碼:fx4q
本文章所有(原始碼、檔案)獲取:鏈接:https://pan.baidu.com/s/1SFazXZ5uqJ2A6rIYXiG0cA
提取碼:kozt
(二)常用匯入檔案方式
- 為了方便初學者使用,下面是把幾種常用的匯入檔案方法寫入到一個定義函式中,
books檔案下載:books提取碼:ouvw--來自百度網盤的分享
# 資料匯入例程
import pandas as pd
# 讀取資料檔案
def readDataFile(readPath): # readPath: 資料檔案的地址和檔案名
# readPath = "../data/youcansxupt.csv" # 檔案路徑也可以直接在此輸入
try:
if (readPath[-4:] == ".csv"):
dfFile = pd.read_csv(readPath, header=0, sep=",") # 間隔符為逗號,首行為標題行
# dfFile = pd.read_csv(filePath, header=None, sep=",") # sep: 間隔符,無標題行
elif (readPath[-4:] == ".xls") or (readPath[-5:] == ".xlsx"): # sheet_name 默認為 0
dfFile = pd.read_excel(readPath, header=0) # 首行為標題行
# dfFile = pd.read_excel(filePath, header=None) # 無標題行
elif (readPath[-4:] == ".dat"): # sep: 間隔符,header:首行是否為標題行
dfFile = pd.read_table(readPath, sep=" ", header=0) # 間隔符為空格,首行為標題行
# dfFile = pd.read_table(filePath,sep=",",header=None) # 間隔符為逗號,無標題行
else:
print("不支持的檔案格式,")
except Exception as e:
print("讀取資料檔案失敗:{}".format(str(e)))
return
return dfFile
# 主程式
def main():
# 讀取資料檔案
readPath = "books.csv" # 資料檔案的地址和檔案名
dfFile = readDataFile(readPath) # 呼叫讀取檔案子程式
print(type(dfFile)) # 查看 dfFile 資料型別
print(dfFile.shape) # 查看 dfFile 形狀(行數,列數)
print(dfFile.head()) # 顯示 dfFile 前 5 行資料
return
if __name__ == '__main__':
main()
OUT:
<class 'pandas.core.frame.DataFrame'>
(10000, 23)
id ... small_image_url
0 1 ... https://images.gr-assets.com/books/1447303603s...
1 2 ... https://images.gr-assets.com/books/1474154022s...
2 3 ... https://images.gr-assets.com/books/1361039443s...
3 4 ... https://images.gr-assets.com/books/1361975680s...
4 5 ... https://images.gr-assets.com/books/1490528560s...
[5 rows x 23 columns]
(三)線性規劃
3.1 線性規劃的一般模型
max(min) =
∑
j
=
1
n
\sum_{j=1}^n
∑j=1n?
c
j
c_j
cj?
x
j
x_j
xj?,
s
.
t
.
{
∑
j
=
1
n
a
i
j
x
j
≤
(
≥
)
b
i
,
i
=
1
,
2
,
3
,
?
?
?
,
m
x
j
>
=
0
,
j
=
1
,
2
,
3
,
?
?
?
,
m
s.t. \begin{cases} \sum_{j=1}^n a_{ij}x_{j} \le(\ge) b_{i}, &i = 1,2,3,···,m\\ x_{j}>=0, &j = 1,2,3,···,m \end{cases}
s.t.{∑j=1n?aij?xj?≤(≥)bi?,xj?>=0,?i=1,2,3,???,mj=1,2,3,???,m?
3.2 運用python各種庫和模塊求解線性方程
min z =
c
T
x
c^Tx
cTx,
s
.
t
.
{
A
?
x
≤
b
,
A
e
q
?
x
=
b
e
q
,
L
B
≤
x
≤
U
B
s.t. \begin{cases} A \bullet x \le b, &\\ Aeq \bullet x = beq, &\\ LB \le x \le UB \end{cases}
s.t.??????A?x≤b,Aeq?x=beq,LB≤x≤UB??
linprog 的基本呼叫格式為
from scipy.optimize import linprog
# 默認每個決策變數下界為0,上界為正無窮
res = linprog(c,A,b,Aeq,beq)
res = linprog(c, A = None, b = None, Aeq = None, beq = None, bounds = None, mothod = 'simplex')
print(res.fun) # 顯示目標函式的最小值
print(res.x) # 顯示最優解
3.2.1 Scipy線性規劃模型
max z =
2
x
1
+
3
x
2
?
5
x
3
2x_1 + 3x_2 - 5x_3
2x1?+3x2??5x3?,
s
.
t
.
{
x
1
+
3
x
2
+
x
3
≤
12
,
2
x
1
?
5
x
2
+
x
3
≥
10
,
x
1
+
x
2
+
x
3
=
7
,
x
1
,
x
2
,
x
3
≥
0
s.t. \begin{cases} x_1 + 3x_2 + x_3 \le 12,&\\ 2x_1 - 5x_2 + x_3 \ge 10,\\ x_1 + x_2 +x_3 = 7,\\ x_1, x_2, x_3 \ge 0 \end{cases}
s.t.??????????x1?+3x2?+x3?≤12,2x1??5x2?+x3?≥10,x1?+x2?+x3?=7,x1?,x2?,x3?≥0?
# Scipy線性規劃模型
from scipy.optimize import linprog
c = [-2,-3,5]; A = [[1,3,1],[-2,5,-1]] # 或者 c = np.array([-2,-3,5])
b = [[12],[-10]]; Aeq = [[1,1,1]]; beq = [7]
LB = [0,0,0]
UB = [None]*len(c) # 生成3個None的串列
bound = tuple(zip(LB,UB)) #生成決策向量界限的元組
res = linprog(c,A,b,Aeq,beq,bound)
print("目標函式的最小值:",res.fun)
print("最優解為:",res.x)
# 目標函式的最小值: -14.571428565645057, 所以最大值為:14.571428565645057
# 最優解為: [6.42857143e+00 5.71428571e-01 2.35900788e-10]
OUT:
目標函式的最小值: -14.571428565645057
最優解為: [6.42857143e+00 5.71428571e-01 2.35900788e-10]
Process finished with exit code 0
3.2.2 pulp線性規劃模型
與2.2.1一樣的題目,用不同模型求解
max z = 2 x 1 + 3 x 2 ? 5 x 3 2x_1 + 3x_2 - 5x_3 2x1?+3x2??5x3?,
s . t . { x 1 + 3 x 2 + x 3 ≤ 12 , 2 x 1 ? 5 x 2 + x 3 ≥ 10 , x 1 + x 2 + x 3 = 7 , x 1 , x 2 , x 3 ≥ 0 s.t. \begin{cases} x_1 + 3x_2 + x_3 \le 12,&\\ 2x_1 - 5x_2 + x_3 \ge 10,\\ x_1 + x_2 +x_3 = 7,\\ x_1, x_2, x_3 \ge 0 \end{cases} s.t.??????????x1?+3x2?+x3?≤12,2x1??5x2?+x3?≥10,x1?+x2?+x3?=7,x1?,x2?,x3?≥0?
# pulp線性規劃模型
import pulp
# 定義一個規劃問題
MyProbLP = pulp.LpProblem("LPProbDemo1", sense=pulp.LpMaximize) # 求最大值
# 定義決策變數
x1 = pulp.LpVariable('x1', lowBound=0, upBound=7, cat='Continuous')
x2 = pulp.LpVariable('x2', lowBound=0, upBound=7, cat='Continuous')
x3 = pulp.LpVariable('x3', lowBound=0, upBound=7, cat='Continuous')
# 添加目標函式
MyProbLP += 2*x1 + 3*x2 - 5*x3 # 設定目標函式
# 添加約束條件
MyProbLP += (2*x1 - 5*x2 + x3 >= 10) # 不等式約束
MyProbLP += (x1 + 3*x2 + x3 <= 12) # 不等式約束
MyProbLP += (x1 + x2 + x3 == 7) # 等式約束
MyProbLP.solve()
print("Status:", pulp.LpStatus[MyProbLP.status]) # 輸出求解狀態
for v in MyProbLP.variables(): # youcans
print(v.name, "=", v.varValue) # 輸出每個變數的最優值
print("Max F(x) = ", pulp.value(MyProbLP.objective)) #輸出最優解的目標函式值
OUT:
Status: Optimal
x1 = 6.4285714
x2 = 0.57142857
x3 = 0.0
Max F(x) = 14.57142851
Process finished with exit code 0
3.2.3 cvxopt.solvers 模塊求解
- cvxopt.solvers 模塊求解線性規劃模型的標準型如下:
min z = c T x c^Tx cTx,
s . t . { A ? x ≤ b , A e q ? x = b e q . s.t. \begin{cases} A \bullet x \le b, &\\ Aeq \bullet x = beq. \end{cases} s.t.{A?x≤b,Aeq?x=beq.? - 求解線性規劃
min z = ? 4 x 1 ? 5 x 2 -4x_1 - 5x_2 ?4x1??5x2?,
s . t . { 2 x 1 + x 2 ≤ 3 , x 1 + 2 x 2 ≤ 3 , x 1 ≥ 0 , x 2 ≥ 0. s.t. \begin{cases} 2x_1 + x_2 \le 3,\\ x_1 + 2x_2 \le 3,&\\ x_1 \ge 0, x_2 \ge 0. \end{cases} s.t.??????2x1?+x2?≤3,x1?+2x2?≤3,x1?≥0,x2?≥0.??
# 線性規劃 使用cvxopy.solvers模塊求解
import numpy
from cvxopt import matrix,solvers
c = matrix([2.,1]); A = matrix([[-1.,1],[-1,-1],[1,-2],[0,-1]]).T # matrix([2.,1]):記住matrix中第一個元素不許是float型
b = matrix([1.,-2,4,0]); Aeq = matrix([1.,2],(1,2)) # Aeq為行向量
beq = matrix(3.5); sol = solvers.lp(c,A,b,Aeq,beq)
print("最優解為:\n",sol['x'])
print("最優值為:\n",sol['primal objective'])
OUT:
D:\ProgramData\Anaconda3\python.exe C:/Users/Administrator/PycharmProjects/pythonProject/數學建模/線性規劃/線性規劃3.cvxopy.solvers.py
pcost dcost gap pres dres k/t
0: 5.5556e+00 1.2222e+00 1e+01 0e+00 2e+00 1e+00
1: 4.6038e+00 3.7995e+00 2e+00 1e-16 4e-01 2e-01
2: 2.5229e+00 2.4639e+00 2e-01 2e-16 4e-02 4e-02
3: 2.5002e+00 2.4997e+00 2e-03 1e-16 4e-04 4e-04
4: 2.5000e+00 2.5000e+00 2e-05 4e-16 4e-06 4e-06
5: 2.5000e+00 2.5000e+00 2e-07 1e-16 4e-08 4e-08
Optimal solution found.
最優解為:
[ 5.00e-01]
[ 1.50e+00]
最優值為:
2.500000024611047
3.2.4 用cvxpy庫求解
P183 . 例題: 已知某種商品 6 個倉庫的存貨量,8個客戶對該商品的需求量,單位商品運價如下表所示,試確定6個倉庫到8個客戶的商品調運數量,使總的運輸費用最小,
| 倉庫:單位運價:客戶 | V1 | V2 | V3 | V4 | V5 | V6 | V7 | V8 | 存貨量 |
|---|---|---|---|---|---|---|---|---|---|
| W1 | 6 | 2 | 6 | 7 | 4 | 2 | 5 | 9 | 60 |
| W2 | 4 | 9 | 5 | 3 | 8 | 5 | 3 | 2 | 55 |
| W3 | 5 | 2 | 1 | 9 | 7 | 4 | 3 | 3 | 51 |
| W4 | 7 | 6 | 7 | 3 | 9 | 2 | 7 | 1 | 43 |
| W5 | 2 | 3 | 9 | 5 | 7 | 2 | 6 | 5 | 41 |
| W6 | 5 | 5 | 2 | 2 | 8 | 1 | 4 | 3 | 52 |
| 需求量 | 35 | 37 | 22 | 32 | 41 | 32 | 43 | 38 |
解 : 設
x
i
j
x_{ij}
xij?(i = 1,2,·······,8)表示第 i 個倉庫運到第 j 個客戶的商品數量,
c
i
j
c_{ij}
cij?表示第 i個倉庫到底 j 個客戶的單位運價,
d
j
d_j
dj? 表示第 j 個客戶的需求量,
e
i
e_i
ei? 表示第 i 倉庫的存貨量,建立如下線性規劃模型:
min
∑
i
=
1
6
\sum_{i=1}^6
∑i=16?
∑
j
=
1
8
\sum_{j=1}^8
∑j=18?
c
i
j
x
i
j
c_{ij}x_{ij}
cij?xij?,
s
.
t
.
{
∑
j
=
1
8
x
i
j
≤
e
i
,
i
=
1
,
2
,
?
?
?
,
6
∑
i
=
1
6
x
i
j
=
d
j
,
j
=
1
,
2
,
?
?
?
,
8
x
i
j
≥
0
,
i
=
1
,
2
,
?
?
?
,
6
;
j
=
1
,
2
,
?
?
?
,
8.
s.t. \begin{cases} \sum_{j=1}^8 x_{ij} \le e_i,&i = 1,2,···,6\\ \sum_{i=1}^6 x_{ij} = d_j,&j = 1,2,···,8\\ x_{ij} \ge 0, &i = 1,2,···,6;j = 1,2,···,8. \end{cases}
s.t.??????∑j=18?xij?≤ei?,∑i=16?xij?=dj?,xij?≥0,?i=1,2,???,6j=1,2,???,8i=1,2,???,6;j=1,2,???,8.?
把上表中7行9列的資料保存到Excel檔案,并命名為作業簿3.xlsx,
鏈接:作業簿3.xlsx 提取碼:kzmp
import cvxpy as cp
import numpy as np
import pandas as pd
d1 = pd.read_excel("作業簿3.xlsx",header=None)
d2 = d1.values; c = d2[:-1,:-1]
d = d2[-1,:-1].reshape(1,-1)
e = d2[:-1,-1].reshape(-1,1)
x = cp.Variable((6,8))
obj = cp.Minimize(cp.sum(cp.multiply(c,x)))
con = [cp.sum(x,axis=1,keepdims=True)<=e,cp.sum(x,axis=0,keepdims=True)==d,x>=0]
prob = cp.Problem(obj,con)
prob.solve(solver='GLPK_MI',verbose=True)
print("最優值為:\n",prob.value)
print("最優解為:\n",x.value)
OUT:
最優值為:
664.0
最優解為:
[[-0. 19. -0. -0. 41. -0. -0. -0.]
[-0. -0. -0. 32. -0. -0. -0. 1.]
[-0. 12. 22. -0. -0. -0. 17. -0.]
[-0. -0. -0. -0. -0. 6. -0. 37.]
[35. 6. -0. -0. -0. -0. -0. -0.]
[-0. -0. -0. -0. -0. 26. 26. -0.]]
Process finished with exit code 0
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/291483.html
標籤:python
