羅云中 宗勝亮
(蘭州大學管理學院 甘肅省蘭州市 730000)
管理運籌學是經(jīng)濟學類和管理學類專業(yè)一門十分重要的基礎課程,通過對現(xiàn)實狀況的觀察總結基本規(guī)律后,以數(shù)學方法進行量化分析,通過建立數(shù)學模型和求解獲得最優(yōu)的解決方法,輔助決策者進行科學決策,在經(jīng)濟管理類專業(yè)的人才培養(yǎng)中占據(jù)十分重要的地位。線性規(guī)劃是管理運籌學最重要的領域之一,它主要研究線性約束條件下線性目標函數(shù)的最大值和最小值問題。隨著計算機技術的快速發(fā)展和應用,線性規(guī)劃有了很多的求解模塊和工具,使用這些軟件能快速對線性規(guī)劃問題進行求解。目前,求解線性規(guī)劃問題的大型軟件主要有Matlab、Mathematica 等;還有LINGO 和LINDO 等專業(yè)軟件,能處理大型多變量的矩陣運算;EXCEL 也有模塊(插件)來處理小型的線性規(guī)劃問題;Python 作為最流行的開源腳本語言,也有scipy、pulp 和pyomo 等多個庫可以用來求解線性規(guī)劃問題。
本文以如下線性規(guī)劃模型為例,該模型具有10 個決策變量8 個約束條件,分別運用Excel、Lingo 和Python 軟件這三個工具進行求解。
1.1.1 Excel 規(guī)劃求解介紹
Excel 規(guī)劃求解模塊是一款隨Office 軟件一同發(fā)行的規(guī)劃求解模塊(Solver),該模塊免費使用不需要單獨激活,內置有單純型法、對偶單純型法等算法,可以用來求解線性規(guī)劃、整數(shù)規(guī)劃和非線性規(guī)劃問題。
1.1.2 加載規(guī)劃求解模塊
Excel 中封裝的“規(guī)劃求解”模塊(插件)是可選安裝,一般不會默認安裝,在安裝完office 之后,需要通過Excel選項--加載項的方式來安裝規(guī)劃求解模塊,成功安裝完畢后在數(shù)據(jù)菜單會出現(xiàn)規(guī)劃求解插件,之后啟動office 會自動加載規(guī)劃求解模塊。下面以Excel2016 版本為例,簡單演示如何加載規(guī)劃求解模塊,其他版本office 加載方式類似。
第一步,打開文件菜單,點擊左下角的選項按鈕;
第二步,在Excel 選項對話框左側選擇加載項,右下管理選擇Excel 加載項,點擊右側轉到按鈕;
第三步,在加載宏對話框勾選規(guī)劃求解加載項,點擊確定按鈕;
第四步,安裝成功后在數(shù)據(jù)菜單會新增分析選項卡,分析選項卡新增規(guī)劃求解插件。
1.1.3 Excel 線性規(guī)劃求解實現(xiàn)
(1)創(chuàng)建求解模板。
針對以上的線性規(guī)劃模型,需要在EXCEL 中制作10 個決策變量和10 個約束條件的線性規(guī)劃求解模板來求解這個模型。下面是模板制作步驟:
第1 步,在Excel 編輯區(qū)劃分目標函數(shù)區(qū),約束條件區(qū)和最優(yōu)解區(qū)和最優(yōu)值區(qū)四個功能區(qū)。
第2 步,在約束條件實際值M7:M16 中輸入公式。M7單元格輸入公式M7=SUMPRODUCT(C7:L7,$C$20:$L$20),通過填充柄將公式填充到M16。
第3 步在最優(yōu)值單元格N20 單元格錄入計算公式
N20=SUMPRODUCT(C5:L5,C20:L20)。
第4 步設置規(guī)劃求解參數(shù)對話框,完成模板制作。具體過程如圖1 所示。
圖1:線性規(guī)劃求解模板
(2)輸入數(shù)據(jù)模板求解。
第1 步,在制作好的線性規(guī)劃模板中錄入數(shù)學模型目標函數(shù)系數(shù)、約束條件系數(shù)和常數(shù)項數(shù)據(jù)。第2 步,通過規(guī)劃求解插件設定規(guī)劃求解參數(shù)。在規(guī)劃求解參數(shù)對話框中,設置目標中輸入$N$20,選擇到最大值。可變單元格輸入或者選擇$C$20:$L$20。遵守約束按添加按鈕,在添加約束對話框單元格引用中把$M$7:$M$11 單元格選定,約束條件選擇小于等于,約束把$O$7:$O$11 單元格選定。勾選“使無約束變量為負數(shù)”單選框。求解方法選擇“單純線性規(guī)劃”,選項保持默認。具體過程如圖2 所示。
圖2:規(guī)劃求解參數(shù)
(3)求解結果。
點擊求解按鈕,后會彈出規(guī)劃求解結果對話框提示找到一解可滿足所有的約束及最優(yōu)狀況,報告中可以選擇運算報告、敏感性報告和極限值報告單獨輸出或者一起輸出,點確定按鈕和選擇運算結果報告后在求解模板中C20:L20 單元格會顯示最優(yōu)解,N20 單元格會顯示最優(yōu)值的求解結果。輸出運算報告如圖3 所示,由此可知,最優(yōu)解(x1=1200,x2=0,x3=230.0493,x4=500,x5=324.1379,x6=0,x7=500,x8=858.6207,x9=324.1379,x10=5714.4286),最優(yōu)值為1200.567。
圖3:Excel 規(guī)劃求解結果
1.2.1 Lingo 軟件簡介
Lingo 是Linear Interactive and General Optimizer 的縮寫。由美國Lindo 公司推出的一款專門用于求解運籌學優(yōu)化問題的軟件包。Lingo 軟件除了能求解線性規(guī)劃問題外,還能求解非線性規(guī)劃問題、線性和非線性混合問題,功能十分強大。Lingo 軟件內置了十幾個內部函數(shù),還能與Excel 和數(shù)據(jù)庫等軟件交換數(shù)據(jù),運算執(zhí)行速度快,操作方便簡單。模型輸入簡練,約束條件右面可以包含變量,能最大程度滿足數(shù)學模型的輸入,通過引入集的方式,給決策變量下標形式更簡單直觀的方式表達模型,更容易理解和維護。整體上代碼量較少,對編程能力要求不高,易于掌握。
1.2.2 Lingo 軟件求解實現(xiàn)
(1) Lingo 程序基本語法規(guī)則。
Lingo 程序的使用主要規(guī)則如下:
以“MAX=”或者“MIN=”開始來定義目標函數(shù)是最大值或者最小值問題。
決策變量和系數(shù)之間用“*”代表“×”連接,為了美觀之間使用空格。
變量名不區(qū)分大小寫,但必須以字母開始,變量名使用有意義單詞或詞語,不超過32 個字符。
表達式用“;”表示結束。表達式過長時可以回車多行顯示。
使用“<”來表示“小于等于”, 用“>”表示“大于等于”。
數(shù)據(jù)段以DATA:開始,以ENDDATA 表示數(shù)據(jù)段結束。
(2) 求解具體實現(xiàn)過程。
對以上線性規(guī)劃模型的Lingo 軟件求解具體實現(xiàn)過程,在Lingo Model 界面中輸入以下內容:
點擊slove 按鈕求解后,得到Solver Status 和Solution Report 兩個彈出框,目標值和迭代次數(shù)等信息。如圖4 所示的結果報告給出的信息比較詳細,提示找到了全局最優(yōu)解、目標值、變量、變量值以及靈敏度分析的Reduced Cost(表示當變量有微小變動時, 目標函數(shù)的變化率)、Slack or Surplus(松弛量或剩余量,常數(shù)項有剩余的資源)、Dual Price(對偶價格,維持最優(yōu)解不變的情況下,常數(shù)項每增加一個單位而使最優(yōu)目標函數(shù)得到改進的數(shù)量)。
圖4:LINGO 求解結果
從Lingo 對此線性規(guī)劃模型求解報告得到結果最優(yōu)值為1200.567,最優(yōu)解為(X1=1200,X2=0,X3=230.0493,X4=500,X5=324.1379,X6=0,X7=500,X8=858.6207,X9=324.1379,X10=571.4286)。
1.3.1 Python 簡介
Python 是由荷蘭人Guido van Rossum 于1989 年圣誕節(jié)開發(fā)的一門解釋性腳本語言。它繼承了傳統(tǒng)編譯語言的強大性和通用性,同時有借鑒了腳本語言和解釋語言的易用性。它的特點是只有較少的關鍵字,結構簡單;代碼定義清晰;源代碼容易維護;擁有豐富的標準庫和第三方模塊;跨平臺兼容性好;能在互動模式下支持代碼的輸入和調試;可擴展性強,可以使用C 或C++完成部分程序,在Python 程序中調用;支持GUI 編程;可以將Python 嵌入到C/C++程序等。Python 廣泛應用于工業(yè)界和學術界,在web 網(wǎng)絡開發(fā)、自動化運維、網(wǎng)絡爬蟲和圖像圖形處理得到很多運用,得益于大數(shù)據(jù)分析、機器學習和人工智能應用的迅速發(fā)展和全民大數(shù)據(jù)理念接受,Python 語言得到飛速的發(fā)展,在TIOBE 的語言排行榜上已經(jīng)是第一名,超過JAVA、C 和C++語言。
1.3.2 Python 求解線性規(guī)劃問題的實現(xiàn)
Python 中能求解線性規(guī)劃的庫比較多,有Scipy 庫、Pulp 庫和Pyomo 庫等,本文介紹Scipy 庫來求解線性規(guī)劃模型。要運行python 程序首先需要安裝python 解釋器,可以安裝python 官方的IDLE,也可以安裝Anaconda 或者Pycharm 解釋器,本文作者推薦使用Anaconda 解釋器,該解釋器內置了Python 基本庫和依賴包,初學者不用學習安裝各種依賴包。
在Anaconda 中求解線性規(guī)劃問題,第1 步,需要引入Scipy 庫的和numpy 庫。第2 步,因為該庫只能求解最小化問題和約束關系小于等于的約束條件,需要將目標函數(shù)乘以-1 轉化為求最小化問題,將大于等于約束條件兩邊乘以-1轉化為小于等于。第3 步,把目標函數(shù)系數(shù)組合成一維數(shù)組C,每個決策變量系數(shù)用“,”分開;將每個約束條件組成的一維數(shù)組組合成二維數(shù)組A,約束條件也用“,”分開;每個約束條件常數(shù)項組成一維數(shù)組b;約定決策變量的取值范圍。第4 步,調用optimize 模塊的linprog 方法并求解。第5步輸出模型結果。
Scipy 求解線性規(guī)劃的具體代碼實現(xiàn)如下:
即最優(yōu)值為1200.56,最優(yōu)解為(X1=1200,X2=0,X3=230.0493,X4=500,X5=324.1379,X6=0,X7=500,X8=858.6207,X9=324.1379,X10=571.4286)
通過運用Excel 軟件的運籌規(guī)劃模塊、Lingo 軟件和Python 語言的Scipy 模塊這三種不同方法對線性規(guī)劃模型進行求解,計算的最優(yōu)值和最優(yōu)解都是一樣,但求解過程和操作還存在一定的差別,現(xiàn)對這三種方法處理線性規(guī)劃模型進行對比分析。
Excel 規(guī)劃求解模塊,操作通過菜單操作,可視化程度較高,步驟簡單,使用難度最低。Office 平臺廣泛,幾乎所有臺式電腦都安裝有Office,只需要通過加載的方式就能運行規(guī)劃求解程序,不用專門下載軟件,可以求解線性規(guī)劃問題、整數(shù)規(guī)劃(包括混合整數(shù)規(guī)劃)、0-1 整數(shù)規(guī)劃問題和非線性規(guī)劃問題,使用方式能最便捷。但Excel 規(guī)劃求解以行或者列代表決策變量,當線性規(guī)劃模型中有較多變量時操作不方便,在輸入約束條件和目標函數(shù)時容易出現(xiàn)錯誤。結果輸出時中文翻譯也不太貼切,初學者或者偶爾使用時不容易明白結果真正意義,造成誤解。Excel 規(guī)劃求解模塊在決策變量數(shù)量、約束條件數(shù)量和求解時間上有限制,最多200個決策變量和包括變量上下界約束在內最多100 個約束條件,求解時間也不能超過30 秒,這些因素了Excel 規(guī)劃求解模塊不能處理大型的實際問題。
Lingo 軟件結構形式簡單,符合線性規(guī)劃模型的書寫習慣,容易閱讀、了解和修改??梢詮腅xcel 或數(shù)據(jù)庫讀取數(shù)據(jù)計算,結果也可以輸出到Excel 或者數(shù)據(jù)庫。Lingo 求解器十分強大,會根據(jù)模型自動選擇線性、非線性或整數(shù)優(yōu)化算法。但Lingo 軟件需要單獨安裝,試用版本決策變量只有30 個,軟件購買費用較高,對于高校教學來說是一筆巨大的投入。使用過程還是需要一定的代碼編寫,對編程零基礎的學生來說有存在一定的挑戰(zhàn)。
Python 語言是免費開源的程序,變量數(shù)量和約束條件數(shù)量均無限制,可以處理特別巨大的線性規(guī)劃模型,并且自帶的Python 編程語言能靈活處理復雜的數(shù)據(jù)輸入等功能,但scipy 的linprog 模塊只能處理最小化問題,輸出結果可讀性也較差。
總體來說,這三個工具都能很好地求解線性規(guī)劃模型,但相比而言,Lingo 軟件在處理線性規(guī)劃模型時更加專業(yè),輸出結果也更加合理,可讀性更強;Python 更適合于大型或者巨型線性規(guī)劃模型;EXCEL 插件適用于較小的線性規(guī)劃模型使用,但優(yōu)點是不需要特別安裝,也不需要有編程基礎都能順利將線性規(guī)劃模型求解出來。
因此,建議在日常的課堂教學過程中還是可以使用Excel 來教學,對學生們學習要求難度比較低,容易上手,但在處理實踐生活中或者商業(yè)化項目時,決策變量和約束條件比較多的時候,建議使用Python 或者Lingo 來處理大型線性規(guī)劃模型會更加合適。