Python數(shù)學(xué)建模PuLP庫(kù)線性規(guī)劃入門示例詳解
1、什么是線性規(guī)劃
線性規(guī)劃(Linear programming),在線性等式或不等式約束條件下求解線性目標(biāo)函數(shù)的極值問(wèn)題,常用于解決資源分配、生產(chǎn)調(diào)度和混合問(wèn)題。例如:
max fx = 2*x1 + 3*x2 - 5*x3 s.t. x1 + 3*x2 + x3 <= 12 2*x1 - 5*x2 + x3 >= 10 x1 + x2 + x3 = 7 x1, x2, x3 >=0
線性規(guī)劃問(wèn)題的建模和求解,通常按照以下步驟進(jìn)行:
(1)問(wèn)題定義,確定決策變量、目標(biāo)函數(shù)和約束條件;
(2)模型構(gòu)建,由問(wèn)題描述建立數(shù)學(xué)方程,并轉(zhuǎn)化為標(biāo)準(zhǔn)形式的數(shù)學(xué)模型;
(3)模型求解,用標(biāo)準(zhǔn)模型的優(yōu)化算法對(duì)模型求解,得到優(yōu)化結(jié)果;
2、PuLP 庫(kù)求解線性規(guī)劃
PuLP是一個(gè)開(kāi)源的第三方工具包,可以求解線性規(guī)劃、整數(shù)規(guī)劃、混合整數(shù)規(guī)劃問(wèn)題。
下面以該題為例講解 PuLP 求解線性規(guī)劃問(wèn)題的步驟:
-(0)導(dǎo)入 PuLP庫(kù)函數(shù)
import pulp
-(1)定義一個(gè)規(guī)劃問(wèn)題
MyProbLP = pulp.LpProblem("LPProbDemo1", sense=pulp.LpMaximize)
pulp.LpProblem 是定義問(wèn)題的構(gòu)造函數(shù)。
"LPProbDemo1"是用戶定義的問(wèn)題名(用于輸出信息)。
參數(shù) sense 用來(lái)指定求最小值/最大值問(wèn)題,可選參數(shù)值:LpMinimize、LpMaximize 。
-(2)定義決策變量
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')
pulp.LpVariable 是定義決策變量的函數(shù)。
‘x1' 是用戶定義的變量名。
參數(shù) lowBound、upBound 用來(lái)設(shè)定決策變量的下界、上界;可以不定義下界/上界,默認(rèn)的下界/上界是負(fù)無(wú)窮/正無(wú)窮。本例中 x1,x2,x3 的取值區(qū)間為 [0,7]。
參數(shù) cat 用來(lái)設(shè)定變量類型,可選參數(shù)值:‘Continuous' 表示連續(xù)變量(默認(rèn)值)、' Integer ' 表示離散變量(用于整數(shù)規(guī)劃問(wèn)題)、' Binary ' 表示0/1變量(用于0/1規(guī)劃問(wèn)題)。
-(3)添加目標(biāo)函數(shù)
MyProbLP += 2*x1 + 3*x2 - 5*x3 # 設(shè)置目標(biāo)函數(shù)
添加目標(biāo)函數(shù)使用 “問(wèn)題名 += 目標(biāo)函數(shù)式” 格式。
-(4)添加約束條件
MyProbLP += (2*x1 - 5*x2 + x3 >= 10) # 不等式約束 MyProbLP += (x1 + 3*x2 + x3 <= 12) # 不等式約束 MyProbLP += (x1 + x2 + x3 == 7) # 等式約束
添加約束條件使用 “問(wèn)題名 += 約束條件表達(dá)式” 格式。
約束條件可以是等式約束或不等式約束,不等式約束可以是 小于等于 或 大于等于,分別使用關(guān)鍵字">="、"<=“和”=="。
-(5)求解
MyProbLP.solve() print("Status:", pulp.LpStatus[MyProbLP.status]) # 輸出求解狀態(tài) for v in MyProbLP.variables(): print(v.name, "=", v.varValue) # 輸出每個(gè)變量的最優(yōu)值 print("F(x) = ", pulp.value(MyProbLP.objective)) #輸出最優(yōu)解的目標(biāo)函數(shù)值
solve() 是求解函數(shù)。PuLP默認(rèn)采用 CBC 求解器來(lái)求解優(yōu)化問(wèn)題,也可以調(diào)用其它的優(yōu)化器來(lái)求解,如:GLPK,COIN CLP/CBC,CPLEX,和GUROBI,但需要另外安裝。
3、Python程序和運(yùn)行結(jié)果
完整的程序代碼如下:
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 # 設(shè)置目標(biāo)函數(shù) 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]) # 輸出求解狀態(tài) for v in MyProbLP.variables(): print(v.name, "=", v.varValue) # 輸出每個(gè)變量的最優(yōu)值 print("F(x) = ", pulp.value(MyProbLP.objective)) #輸出最優(yōu)解的目標(biāo)函數(shù)值 #= 關(guān)注 Youcans,分享原創(chuàng)系列 https://blog.csdn.net/youcans =
程序運(yùn)行結(jié)果如下:
Welcome to the CBC MILP Solver Version: 2.9.0 Build Date: Feb 12 2015 Status: Optimal x1 = 6.4285714 x2 = 0.57142857 x3 = 0.0 F(x) = 14.57142851
以上就是Python數(shù)學(xué)建模PuLP庫(kù)線性規(guī)劃入門示例詳解的詳細(xì)內(nèi)容,更多關(guān)于數(shù)學(xué)建模PuLP庫(kù)線性規(guī)劃入門的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python實(shí)現(xiàn)的銀行系統(tǒng)模擬程序完整案例
這篇文章主要介紹了Python實(shí)現(xiàn)的銀行系統(tǒng)模擬程序,結(jié)合完整實(shí)例形式分析了Python基于面向?qū)ο蟪绦蛟O(shè)計(jì)模擬的銀行系統(tǒng)登錄驗(yàn)證、開(kāi)戶、找回密碼、掛失、查詢、存取款、轉(zhuǎn)賬等功能相關(guān)操作技巧,需要的朋友可以參考下2019-04-04python 密碼學(xué)示例——理解哈希(Hash)算法
這篇文章主要介紹了哈希(Hash)算法的相關(guān)資料,幫助大家更好的利用python處理密碼,感興趣的朋友可以了解下2020-09-09python函數(shù)裝飾器之帶參數(shù)的函數(shù)和帶參數(shù)的裝飾器用法示例
這篇文章主要介紹了python函數(shù)裝飾器之帶參數(shù)的函數(shù)和帶參數(shù)的裝飾器用法,結(jié)合實(shí)例形式分析了Python函數(shù)裝飾器中函數(shù)帶多個(gè)參數(shù)以及裝飾器帶有多個(gè)參數(shù)的具體原理與實(shí)現(xiàn)方法,需要的朋友可以參考下2019-11-11python獲取網(wǎng)頁(yè)中所有圖片并篩選指定分辨率的方法
下面小編就為大家分享一篇python獲取網(wǎng)頁(yè)中所有圖片并篩選指定分辨率的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-03-03