摘 要:文章將深入研究Python Tkinter圖形用戶界面庫和Pulp庫在運輸問題中的應用情況。首先,我們對運輸問題的基本概念和分類進行了詳細介紹,以幫助讀者理解這一領域的基礎知識和核心要點。隨后,我們重點探討了該如何利用Pulp庫結(jié)合Tkinter圖形用戶界面庫來解決運輸問題。通過案例研究的方式,展示了Python Tkinter庫在實際運輸問題中的靈活應用,并評估了其在處理這些問題時具備的性能和效果。此外,我們還將對Python Tkinter庫在解決運輸問題中的潛力和未來發(fā)展方向進行討論。
關(guān)鍵詞:運籌學;運輸問題;用戶界面
中圖分類號:F252.1 文獻標志碼:A DOI:10.13714/j.cnki.1002-3100.2024.22.021
Abstract: This paper investigates the practical applications of Python Tkinter GUI library and Pulp library in transportation problems. Firstly, we introduce the basic concepts and classifications of transportation problems in detail to help readers understand the basic knowledge and core points of this field. Then, we focus on discussing how to use Pulp library and Tkinter GUI library to solve transportation problems. After that, through case studies, we demonstrate the flexible application of Python Tkinter library in practical transportation problems, and evaluate its performance and effectiveness in dealing with these problems. Finally, we discuss the potential and future development directions of Python Tkinter library in transportation problems.
Key words: operational research; transportation problems; user interface
收稿日期:2024-04-26
作者簡介:努日曼古麗·牙森(1983—),女,維吾爾族,新疆巴音郭楞蒙古自治州人,廣州商學院信息技術(shù)與工程學院,助教,碩士,研究方向:應用數(shù)學;肉孜買買提·馬合木提(1984—),男,維吾爾族,新疆和田人,廣州商學院信息技術(shù)與工程學院,副教授,博士,研究方向:應用數(shù)學。
引文格式:努日曼古麗·牙森,肉孜買買提·馬合木提.Python在運輸問題中的應用研究[J].物流科技,2024,47(22):82-85.
0 引 言
Python作為一種流行編程語言,憑借其簡潔、易讀和高效的特點,已被廣泛應用于解決各種問題[1-4],包括微積分、線性代數(shù)、微分方程及運籌學。Python的特點使其成為了解決運輸問題的理想選擇。Tkinter是Python的標準GUI庫,用于創(chuàng)建圖形用戶界面,使用Tkinter可以輕松創(chuàng)建用戶友好的界面,使問題更加直觀且易于理解,在各領域都取得了良好的應用效果[5-6]。
運輸問題是物流、供應鏈和許多其他領域經(jīng)常遇到的問題[7]。隨著全球化和電子商務的快速發(fā)展,運輸問題的解決變得越來越重要了。在運輸問題中,Tkinter可以用于創(chuàng)建更加直觀和易于理解的界面,使得運輸問題的求解過程變得更加便捷。
SciPy庫和Pulp庫在解決線性規(guī)劃問題方面都有其獨特的應用。首先,SciPy庫是一個基于Python的科學計算庫,它提供了豐富的數(shù)學工具,包括線性代數(shù)、統(tǒng)計分析、優(yōu)化、信號處理等。在解決線性規(guī)劃問題時,SciPy庫可以使用其優(yōu)化模塊中的線性規(guī)劃求解器,這些求解器基于數(shù)學優(yōu)化算法,如單純形法、內(nèi)點法等,能夠找到線性目標函數(shù)在給定線性約束條件下的最優(yōu)解[8]。SciPy庫的優(yōu)點在于其強大的數(shù)學計算能力,能夠處理各種復雜的線性規(guī)劃問題。
Pulp庫則是一個專門用于創(chuàng)建和求解線性規(guī)劃整數(shù)規(guī)劃問題的Python庫。它提供了一個簡潔的語法,使得定義決策變量、目標函數(shù)和約束條件變得非常方便;同時,Pulp庫支持多種類型的決策變量,包括連續(xù)型、整數(shù)型、二進制型等,使得它能夠適用于更多類型的優(yōu)化問題[6];此外,Pulp庫還支持多種求解器,包括內(nèi)置的求解器以及外部的求解器,如CBC、GLPK、CPLEX、Gurobi等,使得用戶可以根據(jù)問題的特性和需求選擇合適的求解器。
在解決線性規(guī)劃問題時,Pulp庫和SciPy庫都可以找到最優(yōu)解。然而,對于某些特定問題,如整數(shù)規(guī)劃問題或運輸問題,Pulp庫更加適合。因為Pulp庫集成了多種適用于不同問題的求解器,包括線性規(guī)劃、整數(shù)規(guī)劃、混合整數(shù)規(guī)劃等,使得其能夠針對運輸問題提供專門的求解器,從而提高求解效率和準確性。SciPy庫的優(yōu)化模塊雖然也支持多種優(yōu)化方法,但可能仍缺乏針對運輸問題的特定求解器。
本文旨在為運輸問題的解決提供一種新的方法和工具,并推動Python在相關(guān)領域的應用和發(fā)展。
本文的結(jié)構(gòu)安排如下:在第二節(jié)簡單介紹運輸問題,并闡述Python在運輸問題中的必要性;在第三節(jié)詳細介紹界面的建立和核心函數(shù);在第四節(jié)通過實際案例來展示此界面在運輸問題和分配問題中的實際應用,并評估其性能和效果;最后,討論Python Tkinter的應用及其未來的研究方向。
1 運輸問題及Python的必要性
運輸問題的數(shù)學模型如下所示。
其中,xij為決策變量,cij為從第i個產(chǎn)地運輸?shù)降趈個銷售地所發(fā)生的運價。當表達式(2)和(3)同時滿足等式條件時,該問題被稱為平衡問題。平衡問題通常通過表上作業(yè)法來解決,然而,在處理大規(guī)模運輸問題時,如何制定最優(yōu)運輸方案成為了一個突出的挑戰(zhàn),特別是因為不同地點的需求量和供應量之間可能存在不一致性,導致需求與供應不平衡,即表達式(2)和(3)中有一個不滿足等式條件。為有效解決這個問題,我們通常需要先通過某種方法將問題轉(zhuǎn)化為平衡問題,然后再進行求解。
對這個問題,Python的Tkinter庫和Pulp庫可以提供強大的工具。其中Tkinter庫主要用于圖形用戶界面(GUI)的開發(fā),Pulp庫則提供簡潔易用的接口來定義線性規(guī)劃問題。在這種情況下,我們可以使用這兩個庫來完成不同的任務。首先,使用Tkinter庫可以創(chuàng)建一個圖形用戶界面,這樣用戶就可以輸入其數(shù)據(jù),例如運價、需求量和提供量,并查看結(jié)果,能使得程序更易于使用和理解,尤其是對于非技術(shù)用戶而言。其次,我們可以使用Pulp庫中的優(yōu)化算法來解決這個平衡和不平衡的問題,特別是Pulp庫有多種線性規(guī)劃求解器,如CBC、GLPK等。這些求解器經(jīng)過優(yōu)化,能夠高效處理大規(guī)模線性規(guī)劃問題。
2 方案分析及主要技術(shù)實現(xiàn)過程
2.1 方案分析
本文研究一個結(jié)合Tkinter模塊與Pulp模塊的實踐項目,旨在通過構(gòu)建一個簡易的用戶界面來求解運輸問題和分配問題。本文不僅提供了直觀的用戶體驗,還力圖融合教育意義,使得學生在實踐中能夠掌握Python基礎語言、Tkinter界面設計和Pulp優(yōu)化求解模塊的應用。
首先,Tkinter模塊是Python的標準GUI庫,易于學習和使用。通過Tkinter構(gòu)建的界面,用戶可以輕松輸入問題參數(shù),而無需具備復雜的編程背景。界面友好、操作簡便的特性,有助于提高用戶(尤其是學生)的參與度和學習興趣。
其次,Pulp模塊的應用是本文的核心部分。作為一個強大的線性規(guī)劃求解器,Pulp能夠有效處理運輸和分配問題,這些問題在實際生活和工作中廣泛存在。通過Tkinter界面與Pulp模塊結(jié)合,學生可以在實踐中理解并掌握線性規(guī)劃問題的建模與求解過程,這對其未來的學術(shù)研究和職業(yè)發(fā)展大有裨益。
此外,通過區(qū)分平衡問題、不平衡問題和分配問題,學生可以更加深入地理解這些概念之間的差異,同時,這種項目導向的學習方式也能夠激發(fā)學生的學習熱情,使他們能夠在實踐中發(fā)現(xiàn)問題、解決問題,從而實現(xiàn)知識的內(nèi)化與能力的提升。
2.2 主要技術(shù)實現(xiàn)過程
先通過tkinter.Tk定義一個窗口,參考代碼如下。
Import tkinter as tk
root = tk.Tk()
root.title(“運輸問題”)
接下來,通過tk.Label、tk.Text、tk.Entry和tk.Button函數(shù),可以創(chuàng)建界面輸入?yún)?shù)所用的文本框和按鈕,并通過tk.Listbox函數(shù)創(chuàng)建輸出列表(如圖1所示)。
具體輸入方法我們將在第4節(jié)舉例操作中進行說明,這里主要解釋程序內(nèi)部的運行過程。當我們錄入完所有參數(shù)并按求解按鈕時,將按照下面步驟運行程序。
首先,把運價表里的參數(shù)賦給cij(i=1,2,...,n;j=1,2,...,m),其中n,m分別由運價表的行數(shù)和列數(shù)來確定,提供量的參數(shù)和需求量的參數(shù)分別賦給ai(i=1,2,...,n)和bj(j=1,2,...,m)。
其次,創(chuàng)建線性規(guī)劃問題。通過import pulp導入Pulp 庫,并通過prob = pulp.LpProblem(name,sense)函數(shù)創(chuàng)建線性規(guī)劃問題。由于我們解決的問題是運輸問題,因此參數(shù)設置為:
name = 'Transportation Problem',
sense = pulp.LpMinimize。
然后,按照已錄入數(shù)值的大小,創(chuàng)建決策變量的數(shù)列。參考如下代碼:
var = [[pulp.LpVariable(f'x{i}{j}', lowBound=0, cat=pulp.LpInteger) for j in range(col)] for i in range(row)]。
其中,lowBound=0表示決策變量滿足xij≥0的條件,cat=pulp.LpInteger表示決策變量是整數(shù)。
再次,創(chuàng)建目標函數(shù)和約束條件。這些步驟可以通過Pulp庫里的lpDot函數(shù)和lpSum函數(shù)來實現(xiàn),參考如下代碼:
prob += pulp.lpDot(var,c)
for i in range(row):
prob += (pulp.lpSum(var[i]) == a[i])
for j in range(col):
prob += (pulp.lpSum([var[i][j] for i in range(row)]) == b[j])
最后,可以通過prob.solve()函數(shù)來求解運輸問題的最優(yōu)方案。
代碼中可以應用if語句來判斷輸入問題是否為平衡問題,如果是平衡問題,上面的代碼就是可行的;如果提供量大于需求量,可以將上面代碼中的lpSum(var[i]) == a[i]換成lpSum(var[i]) < a[i];如果需求量超過提供量,則將代碼中的pulp.lpSum([var[i][j] for i in range(row)]) == b[j]換成pulp.lpSum([var[i][j] for i in range(row)]) < b[j]即可。這一步可以通過if語句自動實現(xiàn),無需手動調(diào)整。因此,對于不平衡問題,此程序具有可行性。
3 舉例操作
例題1. 某部門有Ai(i=1,2,3)3個生產(chǎn)同類產(chǎn)品的工廠Ai(i=1,2,3),生產(chǎn)的產(chǎn)品有4個銷售點Bi(i=1,2,3,4)出售,各工廠的生產(chǎn)量、各銷售點的銷售量以及各工廠到各銷售點的運價(元/噸)如表1所示。
試求出最優(yōu)運輸方案。
我們運行程序后,出現(xiàn)圖1所示的窗口;將數(shù)據(jù)輸入對應的文本框,并按<求解>按鈕(如圖2所示),可以算出此問題的最優(yōu)方案和總運價費。數(shù)字之間用空0ef7f9d786ca9a4a4b46c1472d43b339格來分割,如果出現(xiàn)數(shù)字不完整的情況就會出現(xiàn)相應的錯誤提醒。
除了運輸問題,我們還可以運算分配問題的最優(yōu)方案。
例題2. 有一份材料需翻譯成A,B,C,D四種語言,現(xiàn)有3個人,一個人完成一項任務,問如何分派任務總時間最少,所需時間如表2所示。
其實分配問題是運輸問題中的特殊情況,只要把提供量和需求量都設置為1,就可以計算分配問題了。運行結(jié)果如圖3所示。
如圖3所示,當甲完成A,乙完成D,丙完成B時所需時間最少為5 h。
例題3. 有甲、乙、丙三個化肥廠供應Ⅰ、Ⅱ、Ⅲ、Ⅳ四個地區(qū)的農(nóng)用化肥,三個工廠每年各自的產(chǎn)量分別為50萬噸、60萬噸和50萬噸。四個地區(qū)的需求量分別為Ⅰ地區(qū)最高50萬噸,最低30萬噸,Ⅱ地區(qū)為70萬噸,Ⅲ地區(qū)為30萬噸以下,Ⅳ地區(qū)不低于10萬噸。已知從各化肥廠到各地區(qū),單位化肥的運價如表3所示。如何調(diào)運,可使總調(diào)運費用最?。?/p>
由于產(chǎn)量小于需求量,因此虛設一個虛擬化肥廠“丁”。按照最低需求和最高需求,可以寫平衡表如表4所示。
其中“丁”是虛擬產(chǎn)地,M是任意大的正數(shù)。由于需求地Ⅰ的最低需求是30萬噸,因此第2列的30萬噸不可以由虛擬產(chǎn)地“丁”所提供。因此,我們把產(chǎn)地“丁”到銷地I的運價設為任意大的正數(shù)M。銷售地Ⅱ和Ⅳ也是同一個道理。運行結(jié)果如圖4所示。
4 結(jié) 論
本文使用Tkinter模塊構(gòu)建了一個簡單的界面,并利用Pulp模塊求解了運輸問題和分配問題。這個界面使用起來非常方便和簡單,效果也非常好,在代碼編寫過程中,學生可以掌握Python基礎語言、Tkinter模塊和Pulp模塊的使用;同時,這個界面也可以幫助學生分辨平衡問題、不平衡問題和分配問題的區(qū)別,對培養(yǎng)學生的學習熱情起到了很大的作用。在未來的工作中,我們將進一步研究Tkinter庫在目標規(guī)劃和動態(tài)規(guī)劃中的應用。
參考文獻:
[1] 譚立云,張曉瑾.python在極限運算中的應用[J].科學技術(shù)創(chuàng)新,2020(27):18-20.
[2] 劉雙.基于Python的微分方程在多領域中的應用[J].黑龍江科學,2022,13(7):162-164.
[3] 趙禹琦.基于Python軟件求多元隱函數(shù)的偏導數(shù)[J].新型工業(yè)化,2021,11(8):224-226.
[4] 宋婷婷,王琳琳.Python語言在高等數(shù)學積分教學中的應用探析[J].電腦知識與技術(shù),2023,19(25):118-121.
[5] 高秀艷.基于Tkinter的多語語料庫分段與對齊工具實現(xiàn)研究[J].河北軟件職業(yè)技術(shù)學院學報,2020,22(3):5-8.
[6] 肉孜買買提·馬合木提.Python在運籌學教學中的應用[J].現(xiàn)代職業(yè)教育,2022(6):88-90.
[7] 胡運權(quán).運籌學基礎及應用(第六版)[M].北京:高等教育出版社,2014.
[8] 羅伯特·約翰遜.Python科學計算和數(shù)據(jù)科學應用(第2版)[M].黃強,譯.北京:清華大學出版社,2022.