@
前言
Hello!小夥伴!
非常感謝您閱讀海轟的文章,倘若文中有錯誤的地方,歡迎您指出~
自我介紹 ଘ(੭ˊᵕˋ)੭
暱稱:海轟
標籤:程式猿|C++選手|學生
簡介:因C語言結識程式設計,隨後轉入計算機專業,有幸拿過一些國獎、省獎...已保研。目前正在學習C++/Linux/Python
學習經驗:紮實基礎 + 多做筆記 + 多敲程式碼 + 多思考 + 學好英語!
初學Python 小白階段
文章僅作為自己的學習筆記 用於知識體系建立以及複習
題不在多 學一題 懂一題
知其然 知其所以然!
本文僅從Pyhton如何解決建模問題出發
未對建模思路等進行深一步探索
線性規劃
線性規劃求解需要清晰兩部分,目標函式(max, min) 和 約束條件 ,求解前應轉化為標準形式:
樣例1:求解下列線性規劃問題
\[max z = 2x_1 + 3x_2 - 5x_3
\]
\]
\[ s.t. = \begin{cases}
x_1 + x_2 + x_3 = 7 \\
2x_1 - 5x_2 + x_3 >= 10\\
x_1 + 3x_2 + x_3 <= 12\\
x_1,x_2,x_3 >= 0
\end{cases}
\]
x_1 + x_2 + x_3 = 7 \\
2x_1 - 5x_2 + x_3 >= 10\\
x_1 + 3x_2 + x_3 <= 12\\
x_1,x_2,x_3 >= 0
\end{cases}
\]
scipy庫求解
涉及知識點
- optimize.linprog
Demo程式碼
from scipy import optimize
import numpy as np
c = np.array([2,3,-5])
A = np.array([[-2,5,-1],[1,3,1]])
B = np.array([-10,12])
Aeq = np.array([[1,1,1]])
Beq = np.array([7])
res = optimize.linprog(-c,A,B,Aeq,Beq)
res
執行結果
注:x結果為array陣列,從左到右依次表示x1 x2 x3....
對很大/小的數不使用科學計數法 np.set_printoptions(suppress=True)
Demo程式碼
from scipy import optimize
import numpy as np
np.set_printoptions(suppress=True)
c = np.array([2,3,-5])
A = np.array([[-2,5,-1],[1,3,1]])
B = np.array([-10,12])
Aeq = np.array([[1,1,1]])
Beq = np.array([7])
res = optimize.linprog(-c,A,B,Aeq,Beq)
res
執行結果
樣例2:求解下列線性規劃問題
pulp庫求解
設計知識點
- LpProblem(name='NoName', sense=LpMinimize)
- solve(solver=None, **kwargs)
- LpVariable(name, lowBound=None, upBound=None, cat='Continuous', e=None)
Demo程式碼
import pulp as pp
# 目標函式的係數
z = [2, 3, 1]
a = [[1, 4, 2], [3, 2, 0]]
b = [8,6]
aeq = [[1,2,4]]
beq = [101]
# 確定最大最小化問題,當前確定的是最大化問題
m = pp.LpProblem(sense=pp.LpMaximize)
# 定義三個變數放到列表中
x = [pp.LpVariable(f'x{i}', lowBound=0) for i in [1, 2, 3]]
# 定義目標函式,並將目標函式加入求解的問題中
m += pp.lpDot(z, x) # lpDot 用於計算點積
# 設定比較條件
for i in range(len(a)):
m += (pp.lpDot(a[i], x) >= b[i])
# 設定相等條件
for i in range(len(aeq)):
m += (pp.lpDot(aeq[i], x) == beq[i])
# 求解
m.solve()
# 輸出結果
print(f'優化結果:{pp.value(m.objective)}')
print(f'引數取值:{[pp.value(var) for var in x]}')
執行結果:
注:
- 最優結果為202
- x1 = 101 x2=0 x3=0
樣例3.運輸問題
Demo程式碼
import pulp
import numpy as np
from pprint import pprint
def transportation_problem(costs, x_max, y_max):
row = len(costs)
col = len(costs[0])
prob = pulp.LpProblem('Transportation Proble',sense=pulp.LpMaximize)
var = [[pulp.LpVariable(f'x{i}{j}',lowBound=0,cat=pulp.LpInteger) for j in range(col)] for i in range(row)]
# 轉為一維
flatten = lambda x:[y for l in x for y in flatten(l)] if type(x) is list else [x]
prob += pulp.lpDot(flatten(var),costs.flatten())
for i in range(row):
prob += (pulp.lpSum(var[i]) <= x_max[i])
for j in range(col):
prob += (pulp.lpSum([var[i][j] for i in range(row)]) <= y_max[j])
prob.solve()
return {'objective':pulp.value(prob.objective),'var':[[pulp.value(var[i][j]) for j in range(col)] for i in range(row)]}
costs = np.array([[500,550,630,1000,800,700],
[800,700,600,950,900,930],
[1000,960,840,650,600,700],
[1200,1040,980,860,880,780]])
max_plant = [76,88,96,40]
max_cultivation = [42,56,44,39,60,59]
res = transportation_problem(costs, max_plant, max_cultivation)
print(f'最大值為{res["objective"]}')
print("各個變數的取值為:")
pprint(res['var'])
執行結果:
說明
執行環境:Vs Code
結語
學習來源:B站及其課堂PPT,對其中程式碼進行了復現
連結:https://www.bilibili.com/video/BV12h411d7Dm? from=search&seid=5685064698782810720
文章僅作為學習筆記,記錄從0到1的一個過程
希望對您有所幫助,如有錯誤歡迎小夥伴指正~
我是 海轟ଘ(੭ˊᵕˋ)੭
如果您覺得寫得可以的話,請點個贊吧
謝謝支援 ️