王海龍 劉飄飄 王易平
(1邯鄲職業(yè)技術(shù)學(xué)院,河北 邯鄲 056005;2吉利學(xué)院,成都 641423)
作為開源免費(fèi)語言,Python語言簡(jiǎn)潔易讀、擴(kuò)展性強(qiáng),在科學(xué)計(jì)算、數(shù)據(jù)處理等方面功能強(qiáng)大,可以幫助我們解決各類數(shù)學(xué)問題,在數(shù)學(xué)建模中具有廣泛的應(yīng)用,逐漸成為數(shù)學(xué)建模中的常用編程語言。Python提供了數(shù)學(xué)建模所需的豐富的工具和庫,比如NumPy、SciPy、Matplotlib、Pandas、Pulp 等,下面通過一些實(shí)際問題來探討它們?cè)跀?shù)學(xué)建模中的具體應(yīng)用。
線性規(guī)劃主要是利用數(shù)學(xué)方法使資源的運(yùn)用最優(yōu)化,是數(shù)學(xué)建模問題中的常見類型。首先看一個(gè)典型題目:有一項(xiàng)工作需譯成英、日、德、俄四種文字,現(xiàn)有甲、乙、丙、丁四人,他們翻譯成不同語種的所需時(shí)間見表1,問如何安排人員最省時(shí)間?
表1 四人翻譯不同語種的所需時(shí)間(單位:h)
由于每個(gè)人僅參與一項(xiàng)翻譯工作,每個(gè)語種翻譯工作僅有1人完成,因此約束條件為:
這個(gè)問題可以運(yùn)用Python語言的Pulp模塊來求解。Pulp模塊不是Python的默認(rèn)安裝模塊,需要使用pip安裝。具體解題步驟如下:
1.定義問題為L(zhǎng)P,求最小值(LpMinimize):
2.定義變量x,參數(shù)cat="Binary"定義變量類型為0-1型:
3.定義目標(biāo)函數(shù),格式為“問題名+=目標(biāo)函數(shù)式”:
4.添加約束條件,格式為“問題名+=約束條件表達(dá)式”:
5.求解,solve()為求解函數(shù):
6.輸出,LP.objective是目標(biāo)函數(shù)值的最優(yōu)解,LP.variables為每個(gè)變量的最優(yōu)解:
在以上解題中,使用了Python 語言的pulp 模塊,輸出時(shí)還使用了pandas 和numpy 模塊,因此需要在程序中先使用import來導(dǎo)入這三個(gè)模塊。
NumPy 支持大量的維度數(shù)組與矩陣運(yùn)算,Pandas 的函數(shù)和方法可以快速處理數(shù)據(jù),這兩個(gè)模塊都可以在數(shù)學(xué)建模中發(fā)揮重要作用。上面題目如果數(shù)據(jù)量增加,可以通過pandas的read_excel函數(shù)來讀取,并可將計(jì)算結(jié)果再輸出到excel表格中。
數(shù)學(xué)建模就是要用數(shù)學(xué)的辦法來優(yōu)化和解決實(shí)際問題,題目通常源于生產(chǎn)生活,原始數(shù)據(jù)樣本采集自各個(gè)領(lǐng)域,一般數(shù)據(jù)量較大,且數(shù)據(jù)可能存在缺失、異常等情況,因此數(shù)據(jù)的處理和分析對(duì)數(shù)學(xué)建模非常重要。Python擁有的強(qiáng)大數(shù)據(jù)處理和分析能力,在數(shù)據(jù)讀取與預(yù)處理、數(shù)據(jù)分析、數(shù)據(jù)可視化等方面都可以發(fā)揮重要作用。
2021 年全國(guó)大學(xué)生數(shù)學(xué)建模競(jìng)賽E 題:中藥材的鑒別,題目附件1 給出的數(shù)據(jù)量為425(藥材的編號(hào))×3348(光譜的波數(shù)),如何分析和處理這上百萬的數(shù)據(jù)是解決問題的基礎(chǔ)。讀取數(shù)據(jù):由于Python讀取csv文件速度較快,可以先將所給數(shù)據(jù)另存為csv格式,再使用pandas的read_csv函數(shù)導(dǎo)入。數(shù)據(jù)處理:導(dǎo)入的數(shù)據(jù)結(jié)構(gòu)為DataFrame,可以使用眾多函數(shù)處理數(shù)據(jù),使用columns、index、values函數(shù)輸出列索引、行索引、值,使用describe函數(shù)查看數(shù)據(jù)的統(tǒng)計(jì)性信息,還可以通過loc、iloc函數(shù)獲取行或列的數(shù)據(jù),Concat函數(shù)可用于拼接數(shù)據(jù)等等。繪制圖像:Matplotlib庫的pyplot函數(shù)可方便地繪制圖像。使用Python將附件1給出的數(shù)據(jù)繪制圖像如圖1所示:
圖1 各波段下藥材吸光度圖
2022 年全國(guó)大學(xué)生數(shù)學(xué)建模競(jìng)賽E 題:小批量物料的生產(chǎn)安排,題目需首先計(jì)算各種物料需求出現(xiàn)的頻次、需求數(shù)量、平均價(jià)格等??梢允褂肞andas 的分組函數(shù)groupby 和聚合函數(shù)agg 很快求出:首先使用pandas的read_csv 函數(shù)讀取附件的csv文件,將數(shù)據(jù)存儲(chǔ)為DataFrame 對(duì)象;然后使用groupby 函數(shù)對(duì)數(shù)據(jù)按“物料編碼”列分組,并使用聚合函數(shù)agg 對(duì)“物料編碼”列計(jì)數(shù),對(duì)“需求量”列求和,對(duì)“銷售單價(jià)”列求平均值;最后使用pandas的to_csv()函數(shù)將結(jié)果導(dǎo)出。導(dǎo)出數(shù)據(jù)表如圖2所示(部分截圖):
圖2 物料的頻次、需求數(shù)量、平均價(jià)格表
數(shù)學(xué)建模有些題目需要參賽者自己采集網(wǎng)絡(luò)數(shù)據(jù)。2015 年全國(guó)大學(xué)生數(shù)學(xué)建模競(jìng)賽B 題:“互聯(lián)網(wǎng)+”時(shí)代的出租車資源配置,就要求參賽者自己搜集相關(guān)數(shù)據(jù),需要查找典型城市的出租車情況(數(shù)量、分布等)以及運(yùn)營(yíng)情況(高峰期、空載率等),從而得出出租車資源的供求關(guān)系。2019年全國(guó)大學(xué)生數(shù)學(xué)建模競(jìng)賽C題:機(jī)場(chǎng)的出租車問題,就需要參賽者自己收集國(guó)內(nèi)某一機(jī)場(chǎng)數(shù)據(jù)(如機(jī)場(chǎng)航班架次等)及其所在城市出租車的相關(guān)數(shù)據(jù)(如出租車數(shù)量等),從而研究機(jī)場(chǎng)乘客數(shù)量與出租車流量的關(guān)系。
Python語言功能強(qiáng)大,可以方便地獲取大量網(wǎng)絡(luò)數(shù)據(jù)。Python的requests庫可爬取網(wǎng)頁數(shù)據(jù),Beautiful-Soup庫可解析網(wǎng)頁,正則表達(dá)式re 庫可檢索網(wǎng)頁,獲得需要的信息。比如在當(dāng)當(dāng)網(wǎng)搜索數(shù)學(xué)建模類圖書,檢索得到100個(gè)頁面,每個(gè)頁面有50本圖書的信息,利用Python編寫爬蟲程序,可以很快爬取這些圖書的名稱和價(jià)格等信息,并導(dǎo)出到excel表格中進(jìn)行查看處理。導(dǎo)出數(shù)據(jù)表如圖3所示(部分截圖):
圖3 爬取的當(dāng)當(dāng)網(wǎng)數(shù)學(xué)建模類圖書表
除此之外還可以通過開源大數(shù)據(jù)平臺(tái)來獲取數(shù)據(jù),比如利用Python的財(cái)經(jīng)數(shù)據(jù)接口包TuShare來采集股票等金融數(shù)據(jù),然后進(jìn)行數(shù)據(jù)分析和可視化等操作。
邯鄲職業(yè)技術(shù)學(xué)院學(xué)報(bào)2023年4期