用Python进行数学建模(一)
一、導入數(shù)據(jù)
1.直接賦值
2.讀取 Excel 文件
3.代碼示例
import pandas as pd# 讀取數(shù)據(jù)文件 def readDataFile(readPath): # readPath: 數(shù)據(jù)文件的地址和文件名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 默認為 0dfFile = 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("讀取數(shù)據(jù)文件失敗:{}".format(str(e)))returnreturn dfFile# 主程序 def main():# 讀取數(shù)據(jù)文件readPath = "../data/toothpaste.csv" # 數(shù)據(jù)文件的地址和文件名dfFile = readDataFile(readPath) # 調(diào)用讀取文件子程序print(type(dfFile)) # 查看 dfFile 數(shù)據(jù)類型print(dfFile.shape) # 查看 dfFile 形狀(行數(shù),列數(shù))print(dfFile.head()) # 顯示 dfFile 前 5 行數(shù)據(jù)returnif __name__ == '__main__':main()二、線性規(guī)劃
1.什么是線性規(guī)劃問題
2.線性規(guī)劃問題如何求解
1.問題
2.代碼
import pulp # 導入 PuLP庫函數(shù)# 1.定義一個規(guī)劃問題 MyProbLP = pulp.LpProblem("LPProbDemo1", sense=pulp.LpMaximize) ''' pulp.LpProblem 是定義問題的構造函數(shù)。 "LPProbDemo1"是用戶定義的問題名(用于輸出信息)。 參數(shù) sense 用來指定求最小值/最大值問題,可選參數(shù)值:LpMinimize、LpMaximize 。本例 “sense=pulp.LpMaximize” 表示求目標函數(shù)的最大值。 ''' # 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 用來設定決策變量的下界、上界;可以不定義下界/上界,默認的下界/上界是負無窮/正無窮。本例中 x1,x2,x3 的取值區(qū)間為 [0,7]。 參數(shù) cat 用來設定變量類型,可選參數(shù)值:‘Continuous’ 表示連續(xù)變量(默認值)、’ Integer ’ 表示離散變量(用于整數(shù)規(guī)劃問題)、’ Binary ’ 表示0/1變量(用于0/1規(guī)劃問題)。 ''' # 3.設置目標函數(shù) MyProbLP += 2 * x1 + 3 * x2 - 5 * x3 ''' 添加目標函數(shù)使用 “問題名 += 目標函數(shù)式” 格式。 ''' # 4.添加約束條件 MyProbLP += (2 * x1 - 5 * x2 + x3 >= 10) # 不等式約束 MyProbLP += (x1 + 3 * x2 + x3 <= 12) # 不等式約束 MyProbLP += (x1 + x2 + x3 == 7) # 等式約束 ''' 添加約束條件使用 “問題名 += 約束條件表達式” 格式。 約束條件可以是等式約束或不等式約束,不等式約束可以是 小于等于 或 大于等于,分別使用關鍵字">="、"<=“和”=="。 ''' # 5.求解 MyProbLP.solve() print("Status:", pulp.LpStatus[MyProbLP.status]) # 輸出求解狀態(tài) for v in MyProbLP.variables():print(v.name, "=", v.varValue) # 輸出每個變量的最優(yōu)值 print("F(x) = ", pulp.value(MyProbLP.objective)) # 輸出最優(yōu)解的目標函數(shù)值 ''' solve() 是求解函數(shù)。PuLP默認采用 CBC 求解器來求解優(yōu)化問題,也可以調(diào)用其它的優(yōu)化器來求解,如:GLPK,COIN CLP/CBC,CPLEX,和GUROBI,但需要另外安裝。 '''3.結果
4.求解實例
三、整數(shù)規(guī)劃
線性規(guī)劃問題的最優(yōu)解可能是分數(shù)或小數(shù)。整數(shù)規(guī)劃是指變量的取值只能是整數(shù)的規(guī)劃。
pulp.LpVariable 用來定義決策變量的函數(shù),參數(shù) cat 用來設定變量類型,可選參數(shù)值:‘Continuous’ 表示連續(xù)變量(默認值)、’ Integer ’ 表示離散變量(用于整數(shù)規(guī)劃問題)、’ Binary ’ 表示0/1變量(用于0/1規(guī)劃問題)。
1.求解示例
import pulp # 導入 pulp 庫# 主程序 def main():# 模型參數(shù)設置"""問題描述:某廠生產(chǎn)甲乙兩種飲料,每百箱甲飲料需用原料6千克、工人10名,獲利10萬元;每百箱乙飲料需用原料5千克、工人20名,獲利9萬元。今工廠共有原料60千克、工人150名,又由于其他條件所限甲飲料產(chǎn)量不超過8百箱。(1)問如何安排生產(chǎn)計劃,即兩種飲料各生產(chǎn)多少使獲利最大?(2)若投資0.8萬元可增加原料1千克,是否應作這項投資?投資多少合理?(3)若不允許散箱(按整百箱生產(chǎn)),如何安排生產(chǎn)計劃,即兩種飲料各生產(chǎn)多少使獲利最大?(4)若不允許散箱(按整百箱生產(chǎn)),若投資0.8萬元可增加原料1千克,是否應作這項投資?投資多少合理?"""# 問題 1:"""問題建模:決策變量:x1:甲飲料產(chǎn)量(單位:百箱)x2:乙飲料產(chǎn)量(單位:百箱)目標函數(shù):max fx = 10*x1 + 9*x2約束條件:6*x1 + 5*x2 <= 6010*x1 + 20*x2 <= 150 x1, x2 >= 0,x1 <= 8此外,由 x1,x2>=0 和 10*x1+20*x2<=150 可知 0<=x2<=7.5"""ProbLP1 = pulp.LpProblem("ProbLP1", sense=pulp.LpMaximize) # 定義問題 1,求最大值x1 = pulp.LpVariable('x1', lowBound=0, upBound=8, cat='Continuous') # 定義 x1x2 = pulp.LpVariable('x2', lowBound=0, upBound=7.5, cat='Continuous') # 定義 x2ProbLP1 += (10*x1 + 9*x2) # 設置目標函數(shù) f(x)ProbLP1 += (6*x1 + 5*x2 <= 60) # 不等式約束ProbLP1 += (10*x1 + 20*x2 <= 150) # 不等式約束ProbLP1.solve()print(ProbLP1.name) # 輸出求解狀態(tài)print("Status :", pulp.LpStatus[ProbLP1.status]) # 輸出求解狀態(tài)for v in ProbLP1.variables():print(v.name, "=", v.varValue) # 輸出每個變量的最優(yōu)值print("F1(x) =", pulp.value(ProbLP1.objective)) # 輸出最優(yōu)解的目標函數(shù)值# 問題 2:"""問題建模:決策變量:x1:甲飲料產(chǎn)量(單位:百箱)x2:乙飲料產(chǎn)量(單位:百箱)x3:增加投資(單位:萬元)目標函數(shù):max fx = 10*x1 + 9*x2 - x3約束條件:6*x1 + 5*x2 <= 60 + x3/0.810*x1 + 20*x2 <= 150x1, x2, x3 >= 0,x1 <= 8此外,由 x1,x2>=0 和 10*x1+20*x2<=150 可知 0<=x2<=7.5"""ProbLP2 = pulp.LpProblem("ProbLP2", sense=pulp.LpMaximize) # 定義問題 2,求最大值x1 = pulp.LpVariable('x1', lowBound=0, upBound=8, cat='Continuous') # 定義 x1x2 = pulp.LpVariable('x2', lowBound=0, upBound=7.5, cat='Continuous') # 定義 x2x3 = pulp.LpVariable('x3', lowBound=0, cat='Continuous') # 定義 x3ProbLP2 += (10*x1 + 9*x2 - x3) # 設置目標函數(shù) f(x)ProbLP2 += (6*x1 + 5*x2 - 1.25*x3 <= 60) # 不等式約束ProbLP2 += (10*x1 + 20*x2 <= 150) # 不等式約束ProbLP2.solve()print(ProbLP2.name) # 輸出求解狀態(tài)print("Status :", pulp.LpStatus[ProbLP2.status]) # 輸出求解狀態(tài)for v in ProbLP2.variables():print(v.name, "=", v.varValue) # 輸出每個變量的最優(yōu)值print("F2(x) =", pulp.value(ProbLP2.objective)) # 輸出最優(yōu)解的目標函數(shù)值# 問題 3:整數(shù)規(guī)劃問題"""問題建模:決策變量:x1:甲飲料產(chǎn)量,正整數(shù)(單位:百箱)x2:乙飲料產(chǎn)量,正整數(shù)(單位:百箱)目標函數(shù):max fx = 10*x1 + 9*x2約束條件:6*x1 + 5*x2 <= 6010*x1 + 20*x2 <= 150x1, x2 >= 0,x1 <= 8,x1, x2 為整數(shù)此外,由 x1,x2>=0 和 10*x1+20*x2<=150 可知 0<=x2<=7.5"""ProbLP3 = pulp.LpProblem("ProbLP3", sense=pulp.LpMaximize) # 定義問題 3,求最大值print(ProbLP3.name) # 輸出求解狀態(tài)x1 = pulp.LpVariable('x1', lowBound=0, upBound=8, cat='Integer') # 定義 x1,變量類型:整數(shù)x2 = pulp.LpVariable('x2', lowBound=0, upBound=7.5, cat='Integer') # 定義 x2,變量類型:整數(shù)ProbLP3 += (10 * x1 + 9 * x2) # 設置目標函數(shù) f(x)ProbLP3 += (6 * x1 + 5 * x2 <= 60) # 不等式約束ProbLP3 += (10 * x1 + 20 * x2 <= 150) # 不等式約束ProbLP3.solve()print("Status:", pulp.LpStatus[ProbLP3.status]) # 輸出求解狀態(tài)for v in ProbLP3.variables():print(v.name, "=", v.varValue) # 輸出每個變量的最優(yōu)值print("F3(x) =", pulp.value(ProbLP3.objective)) # 輸出最優(yōu)解的目標函數(shù)值# 問題 4:"""問題建模:決策變量:x1:甲飲料產(chǎn)量,正整數(shù)(單位:百箱)x2:乙飲料產(chǎn)量,正整數(shù)(單位:百箱)x3:增加投資(單位:萬元)目標函數(shù):max fx = 10*x1 + 9*x2 - x3約束條件:6*x1 + 5*x2 <= 60 + x3/0.810*x1 + 20*x2 <= 150x1, x2, x3 >= 0,x1 <= 8,x1, x2 為整數(shù)此外,由 x1,x2>=0 和 10*x1+20*x2<=150 可知 0<=x2<=7.5"""ProbLP4 = pulp.LpProblem("ProbLP4", sense=pulp.LpMaximize) # 定義問題 4,求最大值print(ProbLP4.name) # 輸出求解狀態(tài)x1 = pulp.LpVariable('x1', lowBound=0, upBound=8, cat='Integer') # 定義 x1,變量類型:整數(shù)x2 = pulp.LpVariable('x2', lowBound=0, upBound=7, cat='Integer') # 定義 x2,變量類型:整數(shù)x3 = pulp.LpVariable('x3', lowBound=0, cat='Continuous') # 定義 x3ProbLP4 += (10*x1 + 9*x2 - x3) # 設置目標函數(shù) f(x)ProbLP4 += (6*x1 + 5*x2 - 1.25*x3 <= 60) # 不等式約束ProbLP4 += (10*x1 + 20*x2 <= 150) # 不等式約束ProbLP4.solve()print("Status:", pulp.LpStatus[ProbLP4.status]) # 輸出求解狀態(tài)for v in ProbLP4.variables():print(v.name, "=", v.varValue) # 輸出每個變量的最優(yōu)值print("F4(x) =", pulp.value(ProbLP4.objective)) # 輸出最優(yōu)解的目標函數(shù)值returnif __name__ == '__main__': main()2.結果
四、0-1規(guī)劃
0-1 整數(shù)規(guī)劃是一類特殊的整數(shù)規(guī)劃,變量的取值只能是 0 或 1。主要用于求解互斥的決策問題、互斥的約束條件問題、固定費用問題和分派問題。
1.規(guī)劃的分類及建模方法
規(guī)劃問題的數(shù)學模型包括決策變量、約束條件和目標函數(shù),圍繞這三個要素都可能存在互斥的情況,從而導出不同類型的0-1規(guī)劃問題,其建模方法也有差別。
- 1.互斥的決策問題
- 2.互斥的約束問題
- 3.固定費用問題
- 4.指派問題
2.PuLP 求解 0-1 規(guī)劃問題
1.案例問題描述
2.建模過程分析
3.模型求解的編程
import pulp # 導入 pulp 庫# 主程序 def main():# 投資決策問題:# 公司現(xiàn)有 5個擬投資項目,根據(jù)投資額、投資收益和限制條件,問如何決策使收益最大。"""問題建模:決策變量:x1~x5:0/1 變量,1 表示選擇第 i 個項目, 0 表示不選擇第 i 個項目目標函數(shù):max fx = 150*x1 + 210*x2 + 60*x3 + 80*x4 + 180*x5約束條件:210*x1 + 300*x2 + 100*x3 + 130*x4 + 260*x5 <= 600x1 + x2 + x3 = 1x3 + x4 <= 1x5 <= x1x1,...,x5 = 0, 1"""InvestLP = pulp.LpProblem("Invest decision problem", sense=pulp.LpMaximize) # 定義問題,求最大值# 參數(shù) cat 用來設定變量類型,’ Binary ’ 表示0/1變量(用于0/1規(guī)劃問題)。x1 = pulp.LpVariable('A', cat='Binary') # 定義 x1,A 項目 x2 = pulp.LpVariable('B', cat='Binary') # 定義 x2,B 項目x3 = pulp.LpVariable('C', cat='Binary') # 定義 x3,C 項目x4 = pulp.LpVariable('D', cat='Binary') # 定義 x4,D 項目x5 = pulp.LpVariable('E', cat='Binary') # 定義 x5,E 項目InvestLP += (150*x1 + 210*x2 + 60*x3 + 80*x4 + 180*x5) # 設置目標函數(shù) f(x)InvestLP += (210*x1 + 300*x2 + 100*x3 + 130*x4 + 260*x5 <= 600) # 不等式約束InvestLP += (x1 + x2 + x3 == 1) # 等式約束InvestLP += (x3 + x4 <= 1) # 不等式約束InvestLP += (x5 - x1 <= 0) # 不等式約束InvestLP.solve() # solve() 是求解函數(shù),可以對求解器、求解精度進行設置。print(InvestLP.name) # 輸出求解狀態(tài)print("Status youcans:", pulp.LpStatus[InvestLP.status]) # 輸出求解狀態(tài)for v in InvestLP.variables():print(v.name, "=", v.varValue) # 輸出每個變量的最優(yōu)值print("Max f(x) =", pulp.value(InvestLP.objective)) # 輸出最優(yōu)解的目標函數(shù)值returnif __name__ == '__main__': main()4.運行結果
結論:從 0-1 規(guī)劃模型的結果可知,選擇 A、C、E 項目進行投資,可以滿足限定條件并獲得最大收益 410萬元。
五、固定費用問題
1.問題定義
2.案例
1.問題描述
2.建模分析
首先要理解生產(chǎn)某種服裝就會發(fā)生設備租金,租金只與是否生產(chǎn)該產(chǎn)品有關,而與生產(chǎn)數(shù)量無關,這就是固定成本。因此本題屬于固定費用問題。
有些同學下意識地認為是從 3 種產(chǎn)品中選擇一種,但題目中并沒有限定必須或只能生產(chǎn)一種產(chǎn)品,因此決策結果可以是都不生產(chǎn)、選擇 1 種或 2 種產(chǎn)品、3 種都生產(chǎn)。
3.編程求解
結論:從固定費用問題模型的求解結果可知,A、B、C 三種服裝都生產(chǎn),產(chǎn)量分別為 A/100、B/600、C/150 時獲得最大利潤為:24000。
4.字典格式快捷建模方法
六、選址問題
選址問題是指在某個區(qū)域內(nèi)選擇設施的位置使所需的目標達到最優(yōu)。選址問題也是一種互斥的計劃問題。
選址問題有四個基本要素:設施、區(qū)域、距離和優(yōu)化目標。
1.P-中位問題
2.P-中心問題
3.集合覆蓋問題
4.游泳接力賽的指派問題
5.消防站的選址問題
總結
以上是生活随笔為你收集整理的用Python进行数学建模(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java坦克大战心得
- 下一篇: python 车辆识别_PythonAI