馮蘊雯,嚴浩,路成,薛小鋒
(西北工業(yè)大學航空學院,西安710072)
航材作為綜合后勤保障的物資基礎(chǔ),其科學的預(yù)測與合理的配置是有效保障民用飛機安全經(jīng)濟運行的前提[1]。波音公司建立了覆蓋全球的供應(yīng)鏈,擁有行業(yè)內(nèi)先進的分銷網(wǎng)絡(luò),能夠快速為全球客戶配置航材。美聯(lián)航建立了完善的航材庫存管理系統(tǒng),使得各部門之間能夠及時共享信息,為航材管理部門制定庫存計劃和監(jiān)控備件使用情況提供支持。我國航空公司在航材經(jīng)營管理方面經(jīng)驗不足,容易造成航材采購不合理和資金浪費的情況[2]。以國內(nèi)某航空公司為例,2018年該公司因飛機維修過程中航材缺件引起的航班延誤或取消不到1%,但該公司在預(yù)算之內(nèi)盡量多備航材庫存以滿足飛機維護需求,造成航材庫存成本偏高,公司運營成本增加[3]。
國內(nèi)研究人員為解決合理采購和配置航材這一工程問題開展了很多研究。李俊生[4]分析了航材管理對于航空公司盈利的重要意義,闡述了信息化對提高航材管理水平的作用;喻拿侖[5]建立了以航材總體成本最小化為目標函數(shù)的模型,使用Python編程設(shè)計優(yōu)化算法,選取某航空公司50個航材實際數(shù)據(jù)作為輸入,得到了成本更優(yōu)的航材數(shù)量推薦清單;王洵麟[6]開發(fā)了民用飛機管理信息系統(tǒng),實現(xiàn)了航材數(shù)據(jù)管理與航材預(yù)測兩個主要功能,其中航材預(yù)測功能是基于用戶經(jīng)驗實現(xiàn)的;楊冰冰[7]使用灰色預(yù)測模型對30架B777飛機大修數(shù)據(jù)進行了研究,并使用VB語言和Access數(shù)據(jù)庫設(shè)計了飛機大修航材預(yù)測系統(tǒng),能夠?qū)崿F(xiàn)對大修航材的預(yù)測。此外,近年來,基于航材共享模式的航材管理也在快速發(fā)展。航材共享模式憑借規(guī)模優(yōu)勢能夠有效降低航空公司的航材庫存成本,但一般只包括周轉(zhuǎn)件[8],并且航材共享支援網(wǎng)絡(luò)本身也需要對航材進行合理的采購和配置。
綜上所述,使用信息化平臺技術(shù)推動航材預(yù)測與配置理論算法工程應(yīng)用是有必要的,但國內(nèi)在這一方面尚未有很好的發(fā)展。主要存在如下問題:算法程序未能整合入系統(tǒng)平臺,工程上難以應(yīng)用;系統(tǒng)平臺開發(fā)的技術(shù)并非主流的軟件開發(fā)技術(shù),不利于部署使用及后期維護,同時,系統(tǒng)平臺的擴展性與操作性較差。
針對上述問題,本文設(shè)計并實現(xiàn)基于多語言混合編程的航材預(yù)測與配置平臺。以Java語言及其相應(yīng)的SpringBoot、Mybatis、Vue等主流技術(shù)框架進行平臺框架搭建,將Python、Matlab編寫的航材預(yù)測與配置算法整合到系統(tǒng)平臺中,并運用實際工程數(shù)據(jù)對平臺的功能進行使用測試驗證。
目前,針對航材預(yù)測與配置的理論研究,國內(nèi)外已取得了較多的成果,提出了較為豐富的理論算法。其中,航材預(yù)測技術(shù)總體上可分為三類[9-14]:基于時間序列的航材預(yù)測技術(shù)、基于回歸分析法的航材預(yù)測技術(shù)、基于機器學習的航材預(yù)測技術(shù)。航材配置技術(shù)總體上可分為兩類[15-16]:基于解析方法的航材配置管理和基于優(yōu)化算法的航材配置管理。這些方法為民用飛機航材科學預(yù)測與合理配置提供了理論支撐。
支持向量機算法從統(tǒng)計學習理論發(fā)展而來,專門用于研究有限樣本情況下的機器學習規(guī)律[17],在數(shù)據(jù)預(yù)測問題上有較為廣泛的運用[18]。因此,本文使用支持向量機法作為實現(xiàn)航材預(yù)測功能的算法。
平臺中集成的航材配置算法為邊際分析法,這是一種經(jīng)濟分析方法,該方法把投入的資金所得到的利益與輸出損失進行比較,如果組織的目標是取得最大利潤,那么當追加的收入和追加的支出相等時,這一目標就能達到[19]。在航材配置過程中,主要考慮的問題是在滿足航材配置需求的前提下盡量降低成本?;谶呺H分析法,馮蘊雯等[20]考慮橫向供應(yīng)的多級庫存配置問題,將維修比例這一實際因素引入庫存配置模型中,提出了一種考慮橫向供應(yīng)及維修比例的民用飛機備件多級庫存配置方法。與不考慮橫向供應(yīng)和維修比例的傳統(tǒng)配置模型、以及只考慮維修比例的庫存配置模型相比,該模型顯示的庫存成本得以顯著減少。因此,本文采用這一方法的算法程序來實現(xiàn)航材配置功能。
多種語言混合編程的目的是為了發(fā)揮不同語言各自特有的優(yōu)勢,更好地實現(xiàn)平臺設(shè)計。Java語言最主要的特點是面向?qū)ο?,通過初始化具有不同屬性的對象來實現(xiàn)具體的程序操作?;谶@一特性,Java語言被廣泛應(yīng)用于軟件平臺的開發(fā)中,目前也是全世界使用范圍最廣的編程語言,但使用Java語言來進行數(shù)據(jù)分析和處理的效率很低。Matlab語言在處理矩陣方面具有突出的優(yōu)勢;Py‐thon語言語法簡潔,且擁有豐富的第三方庫,用戶可以方便地調(diào)用第三方庫快速實現(xiàn)數(shù)據(jù)處理與分析。在軟件平臺的開發(fā)過程中,把具體的算法和數(shù)據(jù)處理工作交給在這一方面具有優(yōu)勢的編程語言來實現(xiàn),將復(fù)雜的問題轉(zhuǎn)化為不同語言之間的參數(shù)傳遞問題,能夠降低程序設(shè)計的復(fù)雜程度,提升軟件平臺的性能和開發(fā)效率[21]。
Java與Matlab混合編程的實現(xiàn)方式有多種,但核心問題都是要解決兩種語言之間的參數(shù)傳遞。本文設(shè)計的軟件平臺是以Java語言為主,將其他語言編寫的算法整合到軟件平臺中。算法程序確定后基本不會再修改,而軟件平臺中實現(xiàn)功能的其他程序需要在編寫過程中不斷修改調(diào)試。為方便算法的調(diào)用和平臺開發(fā),本文使用將Mat‐lab算法程序封裝成jar包程序提供給Java語言直接進行調(diào)用的方式來實現(xiàn)Java與Matlab混合編程。具體操作流程如下:
(1)將算法程序處理為函數(shù)形式,并封裝成jar程序包:通常情況下,為了便于直接獲取Matlab程序運算產(chǎn)生的過程變量值和結(jié)果值,算法程序會以程序流的形式編寫。但若要將程序封裝為jar包程序,則需要首先對腳本程序進行處理,將其處理為方法體的形式,使用function……end將算法程序包裹起來,并明確方法名稱、輸入和輸出參數(shù)。具體形式為
如果原程序開頭有clear,clc命令,需要在寫成方法體后將其注釋或刪除,避免該命令運行后將傳入的輸入?yún)?shù)清空。
通過以上步驟完成對算法腳本程序的處理后,在Matlab軟件中使用Library Compiler工具,將算法程序封裝成jar程序包。
(2)在SpringBoot項目中引入環(huán)境配置jar包和算法程序jar包:在SpringBoot項目中引入jar程序包有兩種方法,一種是將jar程序包放入本地maven倉庫中,然后在pom配置文件中引入;另一種是在SpringBoot項目中的resource目錄下新建一個lib文件夾,右鍵將其Add as library,項目便可以識別到里面的jar程序包。
考慮到在開發(fā)過程中,需要不斷地調(diào)試程序,修改jar包,本文選擇建立lib文件目錄的形式,將jar包添加進去。除了算法程序的jar包,還需要引入javabuilder的jar包,提供混合編程的環(huán)境配置,主要是為數(shù)據(jù)類型轉(zhuǎn)換提供支持,如圖1所示。
圖1 在SpringBoot項目中引入jar程序包示意圖Fig.1 Diagram of introducing a jar package into the SpringBoot project
(3)調(diào)用Matlab算法,傳入?yún)?shù),接收結(jié)果:完成上述操作后,即可在Java程序中通過初始化類的方式,調(diào)用算法程序。具體操作程序如圖2所示。
圖2 使用Java調(diào)用Matlab程序核心代碼Fig.2 Core code of using Java to call the Matlab program
使用Java調(diào)用Python程序的方式有多種,主要包括:
(1)在Java類中直接執(zhí)行Python語句;
(2)在Java中通過PythonInterpreter類調(diào)用Python腳本;
(3)通過Runtime.getRuntime()方法執(zhí)行Py‐thon腳本。
以上三種方法都可以實現(xiàn)Java調(diào)用Python程序,但在實際開發(fā)過程中,使用方法(1)和方法(2)存在無法正常引用Python第三方庫的問題,使得Python語言的優(yōu)勢難以體現(xiàn)。因此,選擇第三種方法來實現(xiàn)混合編程,即保持了算法程序的獨立性,又能夠充分利用Python豐富的第三方庫。具體操作流程如下。
(1)處理Python腳本程序。
首先需要對源程序進行處理,將其改寫為方法體的形式,并聲明主函數(shù)入口,在主函數(shù)中調(diào)用具體的算法函數(shù),確定輸入和輸出參數(shù)。具體形式如圖3所示。
圖3 Python腳本程序處理方法Fig.3 Python script processing method
(2)在SpringBoot項目中添加環(huán)境依賴。
要在SpringBoot項目的Java程序中調(diào)用py‐thon程序需要在pom文件中添加jython依賴,如圖4所示。
圖4 調(diào)用Python程序所需添加的依賴Fig.4 The dependencies that need to be added to call the Python program
(3)在Java程序中調(diào)用Python腳本程序,傳入?yún)?shù)、處理結(jié)果。
完成前述操作后,即可在Java程序中調(diào)用Py‐thon算法程序。具體操作程序如圖5所示。
圖5 使用Java調(diào)用Python程序核心代碼Fig.5 Core code of using Java to call the Python program
平臺開發(fā)采用瀏覽器/服務(wù)器(Browser/Serv‐er,簡稱B/S)架構(gòu)和前后端分離的開發(fā)方式,程序開發(fā)環(huán)境在Windos10系統(tǒng)下進行。平臺功能結(jié)構(gòu)如圖6所示。
圖6 平臺功能結(jié)構(gòu)圖Fig.6 Diagram of platform functional architecture
平臺后端程序基于SpringBoot技術(shù)框架,主要使用Java語言開發(fā),并整合了Mybatis技術(shù)框架作為數(shù)據(jù)持久層。前端程序基于Vue技術(shù)框架,主要使用JavaScript語言開發(fā),使用了ElementUI組件庫用于前端頁面設(shè)計。后臺數(shù)據(jù)庫使用MySQL數(shù)據(jù)庫管理系統(tǒng),用于存儲計算分析的結(jié)果。由于平臺功能是基于Java、Matlab、Python混合編程實現(xiàn)的,在平臺開發(fā)和運行所使用的服務(wù)器上還需要配置這三種語言編譯的環(huán)境。基于框架技術(shù),平臺使用模塊化開發(fā)方式,便于將來更新和擴展功能模塊。平臺共包含兩個主要功能模塊:航材預(yù)測模塊和航材配置模塊,兩個功能模塊的業(yè)務(wù)流程功能相同,包括:
(1)通用文件查詢:用戶根據(jù)文件名查詢數(shù)據(jù)庫中存儲的數(shù)據(jù)源文件信息;
(2)文件上傳:用戶上傳數(shù)據(jù)源文件作為算法程序的輸入;
(3)調(diào)用算法程序:用戶完成數(shù)據(jù)源文件上傳后,點擊相應(yīng)功能按鈕,系統(tǒng)調(diào)用算法程序進行計算分析;
(4)狀態(tài)提醒功能:平臺頁面會對用戶的主要操作結(jié)果進行提示;
(5)結(jié)果導出功能:后臺計算完成并將結(jié)果存入結(jié)果數(shù)據(jù)庫后,相應(yīng)的結(jié)果顯示在平臺頁面上,用戶可以將結(jié)果進行導出,存儲到本地計算機中。
在航材預(yù)測模塊中,將某一型號航材的歷史使用數(shù)據(jù)作為輸入,調(diào)用支持向量機算法,讀取輸入數(shù)據(jù)后進行計算,得到未來一段時間的航材使用數(shù)量預(yù)測值。然后,再使用實際的使用數(shù)據(jù)與預(yù)測值進行比較,將比較折線圖和預(yù)測值作為輸出,顯示在前端頁面上,計算結(jié)果可提供給用戶進行下載導出。
在航材配置模塊中,將包含原始推薦數(shù)量、保障率、可用率、報廢率、備件費用、周轉(zhuǎn)時間、訂貨時間、人工時費用、材料費用、任務(wù)間隔時間等信息的航材信息表,機隊運營信息,航材庫位置信息作為輸入,調(diào)用邊際分析算法,讀取輸入數(shù)據(jù)后進行計算分析,得到航材在每個航材庫的配置數(shù)量并作為輸出,顯示在前端頁面上,計算結(jié)果可提供給用戶進行下載導出。
總之,平臺程序設(shè)計的核心就是傳入數(shù)據(jù),調(diào)用算法程序進行計算分析,返回計算分析結(jié)果。輸入數(shù)據(jù)的內(nèi)容是根據(jù)算法程序的需求來確定的,本文設(shè)計的平臺主要通過讀取表格文件內(nèi)容的方式來實現(xiàn)輸入。在程序開發(fā)過程中,主要解決的是不同語言程序之間的數(shù)據(jù)傳輸問題。
調(diào)用算法程序計算得到的結(jié)果返回Java程序后,會存在數(shù)據(jù)類型不一致的問題。Python語言為弱類型語言,它的參數(shù)類型與強類型語言Java的參數(shù)類型兼容性較好;Matlab語言的參數(shù)類型與Java語言參數(shù)類型并不完全對應(yīng),通常需要進行處理。
本文涉及到的參數(shù)處理技術(shù)途徑如圖7所示。程序調(diào)用Matlab編寫的航材配置算法對輸入?yún)?shù)進行計算分析后,得到的主要結(jié)果形式為矩陣,Ja‐va語言中沒有矩陣數(shù)據(jù)類型,因此,要先將結(jié)果矩陣轉(zhuǎn)換為Java語言可處理的結(jié)果類型,才能對其進行處理,并繼續(xù)將其存入結(jié)果數(shù)據(jù)庫。Matlab算法計算得到的是航材配置結(jié)果的矩陣輸出結(jié)果,每一個元素代表一個型號航材在某航材庫的配置數(shù)量。結(jié)果矩陣返回Java程序后,首先,使用MWNumercArray類將其轉(zhuǎn)換為二維數(shù)組;然后,循環(huán)遍歷該二維數(shù)組,依次取出二維數(shù)組中單個元素,該元素代表一個型號航材在若干航材庫的配置數(shù)量;二維數(shù)組中的單個元素可看作一維數(shù)組,繼續(xù)循環(huán)遍歷該元素,將其中的每個數(shù)值賦值給航材配置結(jié)果對象屬性,并將這個對象加入List集合;最后,使用Mybatis框架技術(shù)中的
圖7 參數(shù)類型轉(zhuǎn)換及屬性賦值方法流程圖Fig.7 Flowchart of parameter type conversion andattribute assignment methods
4.1.1 航材預(yù)測功能
登錄系統(tǒng)后,點擊左側(cè)菜單欄的航材預(yù)測選項進入航材預(yù)測頁面,頁面上半部分內(nèi)容為歷史上傳的航材預(yù)測數(shù)據(jù)源文件信息,下半部分為航材預(yù)測的結(jié)果,如圖8所示。點擊頁面右下方上傳數(shù)據(jù)文件按鈕,根據(jù)系統(tǒng)頁面提示上傳航材歷史使用情況的表格文件,如圖9所示。消耗數(shù)據(jù)表格中記錄了36個月的航材使用數(shù)據(jù),如圖10所示。繼續(xù)點擊航材預(yù)測運算按鈕,程序調(diào)用后臺計算程序開始計算,然后將計算結(jié)果以表格和折線圖的形式返回到頁面上,如圖11所示。表格數(shù)據(jù)代表某一航材在一個月份中的使用數(shù)量預(yù)測值,折線圖是實際使用數(shù)據(jù)與預(yù)測值的對比情況。用戶可將表格中的結(jié)果數(shù)據(jù)導出到本地計算機中,導出操作如圖12所示。
圖8 航材預(yù)測模塊頁面Fig.8 Aviation material prediction module page
圖9 上傳航材預(yù)測數(shù)據(jù)源文件操作頁面Fig.9 Upload aviation material prediction data source file operation page
圖10 航材消耗源文件數(shù)據(jù)內(nèi)容Fig.10 Content of aviation material consumption source file
圖11 航材預(yù)測計算結(jié)果頁面Fig.11 Aviation material prediction results page
圖12 航材預(yù)測結(jié)果導出操作頁面Fig.12 Export operation page of aviation material prediction results
4.1.2 航材配置功能
登錄系統(tǒng)后,進入航材配置頁面,如圖13所示。頁面上半部分顯示歷史上傳的數(shù)據(jù)源文件信息,下半部分顯示計算結(jié)果。點擊“上傳數(shù)據(jù)源文件”按鈕,根據(jù)系統(tǒng)彈窗中的提示選擇機隊信息、航站信息、航材信息的數(shù)據(jù)源文件進行上傳,如圖14所示。機隊信息文件中包含機隊數(shù)量、年飛行小時、航站數(shù)量和基地數(shù)量;航站信息文件中包含每個基地和航站之間的航程信息;航材信息文件中包含若干航材件的平均非計劃拆換間隔、原始推薦數(shù)量、保障率、可用度、時間等多個參數(shù)信息,如圖15所示。完成上傳后,繼續(xù)點擊“航材配置運算”按鈕,程序調(diào)用后臺程序開始計算,然后將計算結(jié)果以表格的形式顯示到頁面上。表格中一行數(shù)據(jù)代表某一型號航材在多個航站配置的數(shù)量。用戶可將表格中的結(jié)果數(shù)據(jù)導出到本地計算機中,如圖16所示。
圖13 航材配置模塊頁面Fig.13 Aviation material configuration module page
圖14 上傳航材配置數(shù)據(jù)源文件操作頁面Fig.14 Upload aviation material configuration data source file operation page
圖15 航材配置數(shù)據(jù)源文件內(nèi)容Fig.15 Content of aviation material configuration source file
圖16 航材配置計算結(jié)果及導出操作頁面Fig.16 Calculation results of aviation material configuration and export operation page
根據(jù)4.1節(jié)中對各功能模塊的測試操作可知,平臺的人機界面友好,操作簡單方便,成功整合了航材預(yù)測與航材配置算法程序,解決了混合編程存在的參數(shù)傳遞問題,實現(xiàn)了預(yù)先設(shè)計的兩個主要功能,即通過平臺技術(shù)整合理論算法,在平臺上實現(xiàn)航材預(yù)測與航材配置的功能。
(1)本文給出了基于Java、Matlab、Python混合編程的航材預(yù)測與配置平臺的設(shè)計,實現(xiàn)了將航材預(yù)測和配置理論研究算法整合入信息化平臺的目的。該平臺主要實現(xiàn)了基于航材歷史消耗數(shù)據(jù)的對航材需求量的預(yù)測功能,以及基于機隊信息、航站信息和航材信息的航材配置功能。
(2)在平臺開發(fā)過程中,提出了將Matlab矩陣結(jié)果參數(shù)轉(zhuǎn)化為Java語言可處理的參數(shù)類型的方法,并成功運用到平臺中。
(3)在將來的使用中,可以根據(jù)工程實際需要整合多種類型的算法、擴展平臺功能模塊,優(yōu)化原有算法程序,更好地為航材管理提供支持。