馮蘊雯,嚴浩,路成,薛小鋒
(西北工業大學航空學院,西安710072)
航材作為綜合后勤保障的物資基礎,其科學的預測與合理的配置是有效保障民用飛機安全經濟運行的前提[1]。波音公司建立了覆蓋全球的供應鏈,擁有行業內先進的分銷網絡,能夠快速為全球客戶配置航材。美聯航建立了完善的航材庫存管理系統,使得各部門之間能夠及時共享信息,為航材管理部門制定庫存計劃和監控備件使用情況提供支持。我國航空公司在航材經營管理方面經驗不足,容易造成航材采購不合理和資金浪費的情況[2]。以國內某航空公司為例,2018年該公司因飛機維修過程中航材缺件引起的航班延誤或取消不到1%,但該公司在預算之內盡量多備航材庫存以滿足飛機維護需求,造成航材庫存成本偏高,公司運營成本增加[3]。
國內研究人員為解決合理采購和配置航材這一工程問題開展了很多研究。李俊生[4]分析了航材管理對于航空公司盈利的重要意義,闡述了信息化對提高航材管理水平的作用;喻拿侖[5]建立了以航材總體成本最小化為目標函數的模型,使用Python編程設計優化算法,選取某航空公司50個航材實際數據作為輸入,得到了成本更優的航材數量推薦清單;王洵麟[6]開發了民用飛機管理信息系統,實現了航材數據管理與航材預測兩個主要功能,其中航材預測功能是基于用戶經驗實現的;楊冰冰[7]使用灰色預測模型對30架B777飛機大修數據進行了研究,并使用VB語言和Access數據庫設計了飛機大修航材預測系統,能夠實現對大修航材的預測。此外,近年來,基于航材共享模式的航材管理也在快速發展。航材共享模式憑借規模優勢能夠有效降低航空公司的航材庫存成本,但一般只包括周轉件[8],并且航材共享支援網絡本身也需要對航材進行合理的采購和配置。
綜上所述,使用信息化平臺技術推動航材預測與配置理論算法工程應用是有必要的,但國內在這一方面尚未有很好的發展。主要存在如下問題:算法程序未能整合入系統平臺,工程上難以應用;系統平臺開發的技術并非主流的軟件開發技術,不利于部署使用及后期維護,同時,系統平臺的擴展性與操作性較差。
針對上述問題,本文設計并實現基于多語言混合編程的航材預測與配置平臺。以Java語言及其相應的SpringBoot、Mybatis、Vue等主流技術框架進行平臺框架搭建,將Python、Matlab編寫的航材預測與配置算法整合到系統平臺中,并運用實際工程數據對平臺的功能進行使用測試驗證。
目前,針對航材預測與配置的理論研究,國內外已取得了較多的成果,提出了較為豐富的理論算法。其中,航材預測技術總體上可分為三類[9-14]:基于時間序列的航材預測技術、基于回歸分析法的航材預測技術、基于機器學習的航材預測技術。航材配置技術總體上可分為兩類[15-16]:基于解析方法的航材配置管理和基于優化算法的航材配置管理。這些方法為民用飛機航材科學預測與合理配置提供了理論支撐。
支持向量機算法從統計學習理論發展而來,專門用于研究有限樣本情況下的機器學習規律[17],在數據預測問題上有較為廣泛的運用[18]。因此,本文使用支持向量機法作為實現航材預測功能的算法。
平臺中集成的航材配置算法為邊際分析法,這是一種經濟分析方法,該方法把投入的資金所得到的利益與輸出損失進行比較,如果組織的目標是取得最大利潤,那么當追加的收入和追加的支出相等時,這一目標就能達到[19]。在航材配置過程中,主要考慮的問題是在滿足航材配置需求的前提下盡量降低成本。基于邊際分析法,馮蘊雯等[20]考慮橫向供應的多級庫存配置問題,將維修比例這一實際因素引入庫存配置模型中,提出了一種考慮橫向供應及維修比例的民用飛機備件多級庫存配置方法。與不考慮橫向供應和維修比例的傳統配置模型、以及只考慮維修比例的庫存配置模型相比,該模型顯示的庫存成本得以顯著減少。因此,本文采用這一方法的算法程序來實現航材配置功能。
多種語言混合編程的目的是為了發揮不同語言各自特有的優勢,更好地實現平臺設計。Java語言最主要的特點是面向對象,通過初始化具有不同屬性的對象來實現具體的程序操作。基于這一特性,Java語言被廣泛應用于軟件平臺的開發中,目前也是全世界使用范圍最廣的編程語言,但使用Java語言來進行數據分析和處理的效率很低。Matlab語言在處理矩陣方面具有突出的優勢;Py‐thon語言語法簡潔,且擁有豐富的第三方庫,用戶可以方便地調用第三方庫快速實現數據處理與分析。在軟件平臺的開發過程中,把具體的算法和數據處理工作交給在這一方面具有優勢的編程語言來實現,將復雜的問題轉化為不同語言之間的參數傳遞問題,能夠降低程序設計的復雜程度,提升軟件平臺的性能和開發效率[21]。
Java與Matlab混合編程的實現方式有多種,但核心問題都是要解決兩種語言之間的參數傳遞。本文設計的軟件平臺是以Java語言為主,將其他語言編寫的算法整合到軟件平臺中。算法程序確定后基本不會再修改,而軟件平臺中實現功能的其他程序需要在編寫過程中不斷修改調試。為方便算法的調用和平臺開發,本文使用將Mat‐lab算法程序封裝成jar包程序提供給Java語言直接進行調用的方式來實現Java與Matlab混合編程。具體操作流程如下:
(1)將算法程序處理為函數形式,并封裝成jar程序包:通常情況下,為了便于直接獲取Matlab程序運算產生的過程變量值和結果值,算法程序會以程序流的形式編寫。但若要將程序封裝為jar包程序,則需要首先對腳本程序進行處理,將其處理為方法體的形式,使用function……end將算法程序包裹起來,并明確方法名稱、輸入和輸出參數。具體形式為
如果原程序開頭有clear,clc命令,需要在寫成方法體后將其注釋或刪除,避免該命令運行后將傳入的輸入參數清空。
通過以上步驟完成對算法腳本程序的處理后,在Matlab軟件中使用Library Compiler工具,將算法程序封裝成jar程序包。
(2)在SpringBoot項目中引入環境配置jar包和算法程序jar包:在SpringBoot項目中引入jar程序包有兩種方法,一種是將jar程序包放入本地maven倉庫中,然后在pom配置文件中引入;另一種是在SpringBoot項目中的resource目錄下新建一個lib文件夾,右鍵將其Add as library,項目便可以識別到里面的jar程序包。
考慮到在開發過程中,需要不斷地調試程序,修改jar包,本文選擇建立lib文件目錄的形式,將jar包添加進去。除了算法程序的jar包,還需要引入javabuilder的jar包,提供混合編程的環境配置,主要是為數據類型轉換提供支持,如圖1所示。

圖1 在SpringBoot項目中引入jar程序包示意圖Fig.1 Diagram of introducing a jar package into the SpringBoot project
(3)調用Matlab算法,傳入參數,接收結果:完成上述操作后,即可在Java程序中通過初始化類的方式,調用算法程序。具體操作程序如圖2所示。

圖2 使用Java調用Matlab程序核心代碼Fig.2 Core code of using Java to call the Matlab program
使用Java調用Python程序的方式有多種,主要包括:
(1)在Java類中直接執行Python語句;
(2)在Java中通過PythonInterpreter類調用Python腳本;
(3)通過Runtime.getRuntime()方法執行Py‐thon腳本。
以上三種方法都可以實現Java調用Python程序,但在實際開發過程中,使用方法(1)和方法(2)存在無法正常引用Python第三方庫的問題,使得Python語言的優勢難以體現。因此,選擇第三種方法來實現混合編程,即保持了算法程序的獨立性,又能夠充分利用Python豐富的第三方庫。具體操作流程如下。
(1)處理Python腳本程序。
首先需要對源程序進行處理,將其改寫為方法體的形式,并聲明主函數入口,在主函數中調用具體的算法函數,確定輸入和輸出參數。具體形式如圖3所示。

圖3 Python腳本程序處理方法Fig.3 Python script processing method
(2)在SpringBoot項目中添加環境依賴。
要在SpringBoot項目的Java程序中調用py‐thon程序需要在pom文件中添加jython依賴,如圖4所示。

圖4 調用Python程序所需添加的依賴Fig.4 The dependencies that need to be added to call the Python program
(3)在Java程序中調用Python腳本程序,傳入參數、處理結果。
完成前述操作后,即可在Java程序中調用Py‐thon算法程序。具體操作程序如圖5所示。

圖5 使用Java調用Python程序核心代碼Fig.5 Core code of using Java to call the Python program
平臺開發采用瀏覽器/服務器(Browser/Serv‐er,簡稱B/S)架構和前后端分離的開發方式,程序開發環境在Windos10系統下進行。平臺功能結構如圖6所示。

圖6 平臺功能結構圖Fig.6 Diagram of platform functional architecture
平臺后端程序基于SpringBoot技術框架,主要使用Java語言開發,并整合了Mybatis技術框架作為數據持久層。前端程序基于Vue技術框架,主要使用JavaScript語言開發,使用了ElementUI組件庫用于前端頁面設計。后臺數據庫使用MySQL數據庫管理系統,用于存儲計算分析的結果。由于平臺功能是基于Java、Matlab、Python混合編程實現的,在平臺開發和運行所使用的服務器上還需要配置這三種語言編譯的環境。基于框架技術,平臺使用模塊化開發方式,便于將來更新和擴展功能模塊。平臺共包含兩個主要功能模塊:航材預測模塊和航材配置模塊,兩個功能模塊的業務流程功能相同,包括:
(1)通用文件查詢:用戶根據文件名查詢數據庫中存儲的數據源文件信息;
(2)文件上傳:用戶上傳數據源文件作為算法程序的輸入;
(3)調用算法程序:用戶完成數據源文件上傳后,點擊相應功能按鈕,系統調用算法程序進行計算分析;
(4)狀態提醒功能:平臺頁面會對用戶的主要操作結果進行提示;
(5)結果導出功能:后臺計算完成并將結果存入結果數據庫后,相應的結果顯示在平臺頁面上,用戶可以將結果進行導出,存儲到本地計算機中。
在航材預測模塊中,將某一型號航材的歷史使用數據作為輸入,調用支持向量機算法,讀取輸入數據后進行計算,得到未來一段時間的航材使用數量預測值。然后,再使用實際的使用數據與預測值進行比較,將比較折線圖和預測值作為輸出,顯示在前端頁面上,計算結果可提供給用戶進行下載導出。
在航材配置模塊中,將包含原始推薦數量、保障率、可用率、報廢率、備件費用、周轉時間、訂貨時間、人工時費用、材料費用、任務間隔時間等信息的航材信息表,機隊運營信息,航材庫位置信息作為輸入,調用邊際分析算法,讀取輸入數據后進行計算分析,得到航材在每個航材庫的配置數量并作為輸出,顯示在前端頁面上,計算結果可提供給用戶進行下載導出。
總之,平臺程序設計的核心就是傳入數據,調用算法程序進行計算分析,返回計算分析結果。輸入數據的內容是根據算法程序的需求來確定的,本文設計的平臺主要通過讀取表格文件內容的方式來實現輸入。在程序開發過程中,主要解決的是不同語言程序之間的數據傳輸問題。
調用算法程序計算得到的結果返回Java程序后,會存在數據類型不一致的問題。Python語言為弱類型語言,它的參數類型與強類型語言Java的參數類型兼容性較好;Matlab語言的參數類型與Java語言參數類型并不完全對應,通常需要進行處理。
本文涉及到的參數處理技術途徑如圖7所示。程序調用Matlab編寫的航材配置算法對輸入參數進行計算分析后,得到的主要結果形式為矩陣,Ja‐va語言中沒有矩陣數據類型,因此,要先將結果矩陣轉換為Java語言可處理的結果類型,才能對其進行處理,并繼續將其存入結果數據庫。Matlab算法計算得到的是航材配置結果的矩陣輸出結果,每一個元素代表一個型號航材在某航材庫的配置數量。結果矩陣返回Java程序后,首先,使用MWNumercArray類將其轉換為二維數組;然后,循環遍歷該二維數組,依次取出二維數組中單個元素,該元素代表一個型號航材在若干航材庫的配置數量;二維數組中的單個元素可看作一維數組,繼續循環遍歷該元素,將其中的每個數值賦值給航材配置結果對象屬性,并將這個對象加入List集合;最后,使用Mybatis框架技術中的

圖7 參數類型轉換及屬性賦值方法流程圖Fig.7 Flowchart of parameter type conversion andattribute assignment methods
4.1.1 航材預測功能
登錄系統后,點擊左側菜單欄的航材預測選項進入航材預測頁面,頁面上半部分內容為歷史上傳的航材預測數據源文件信息,下半部分為航材預測的結果,如圖8所示。點擊頁面右下方上傳數據文件按鈕,根據系統頁面提示上傳航材歷史使用情況的表格文件,如圖9所示。消耗數據表格中記錄了36個月的航材使用數據,如圖10所示。繼續點擊航材預測運算按鈕,程序調用后臺計算程序開始計算,然后將計算結果以表格和折線圖的形式返回到頁面上,如圖11所示。表格數據代表某一航材在一個月份中的使用數量預測值,折線圖是實際使用數據與預測值的對比情況。用戶可將表格中的結果數據導出到本地計算機中,導出操作如圖12所示。

圖8 航材預測模塊頁面Fig.8 Aviation material prediction module page

圖9 上傳航材預測數據源文件操作頁面Fig.9 Upload aviation material prediction data source file operation page

圖10 航材消耗源文件數據內容Fig.10 Content of aviation material consumption source file

圖11 航材預測計算結果頁面Fig.11 Aviation material prediction results page

圖12 航材預測結果導出操作頁面Fig.12 Export operation page of aviation material prediction results
4.1.2 航材配置功能
登錄系統后,進入航材配置頁面,如圖13所示。頁面上半部分顯示歷史上傳的數據源文件信息,下半部分顯示計算結果。點擊“上傳數據源文件”按鈕,根據系統彈窗中的提示選擇機隊信息、航站信息、航材信息的數據源文件進行上傳,如圖14所示。機隊信息文件中包含機隊數量、年飛行小時、航站數量和基地數量;航站信息文件中包含每個基地和航站之間的航程信息;航材信息文件中包含若干航材件的平均非計劃拆換間隔、原始推薦數量、保障率、可用度、時間等多個參數信息,如圖15所示。完成上傳后,繼續點擊“航材配置運算”按鈕,程序調用后臺程序開始計算,然后將計算結果以表格的形式顯示到頁面上。表格中一行數據代表某一型號航材在多個航站配置的數量。用戶可將表格中的結果數據導出到本地計算機中,如圖16所示。

圖13 航材配置模塊頁面Fig.13 Aviation material configuration module page

圖14 上傳航材配置數據源文件操作頁面Fig.14 Upload aviation material configuration data source file operation page

圖15 航材配置數據源文件內容Fig.15 Content of aviation material configuration source file

圖16 航材配置計算結果及導出操作頁面Fig.16 Calculation results of aviation material configuration and export operation page
根據4.1節中對各功能模塊的測試操作可知,平臺的人機界面友好,操作簡單方便,成功整合了航材預測與航材配置算法程序,解決了混合編程存在的參數傳遞問題,實現了預先設計的兩個主要功能,即通過平臺技術整合理論算法,在平臺上實現航材預測與航材配置的功能。
(1)本文給出了基于Java、Matlab、Python混合編程的航材預測與配置平臺的設計,實現了將航材預測和配置理論研究算法整合入信息化平臺的目的。該平臺主要實現了基于航材歷史消耗數據的對航材需求量的預測功能,以及基于機隊信息、航站信息和航材信息的航材配置功能。
(2)在平臺開發過程中,提出了將Matlab矩陣結果參數轉化為Java語言可處理的參數類型的方法,并成功運用到平臺中。
(3)在將來的使用中,可以根據工程實際需要整合多種類型的算法、擴展平臺功能模塊,優化原有算法程序,更好地為航材管理提供支持。