郭治洪,童滬琨,張夢歌,劉震華,李建平,陳光中
(1.河南工業大學信息科學與工程學院,鄭州450001;2.河南工業大學土木建筑學院,鄭州450001)
糧倉建筑的氣密性對于儲糧安全具有重要意義,在以往的糧倉建筑設計中,缺乏針對糧倉設計方案與糧倉氣密性的關系進行量化分析的工具,糧倉設計人員在進行糧倉建筑氣密性設計時需要可供參考的依據[1]。本研究試圖建立糧倉設計特征變量與糧倉氣密性的回歸模型,開發出可以根據影響糧倉氣密性的相關因素對糧倉氣密性進行提前預估的軟件,方便糧倉設計人員依照糧倉氣密性預測結果改進設計方案,提高儲糧的安全性,減少糧食產后損失。
建立糧倉建筑設計方案特征變量與糧倉氣密性指標的回歸模型需要一定數量的已建成糧倉的氣密性數據,由于受到人力和財力限制,已建成糧倉的氣密性數據為小樣本數據。在文獻[1]中,支持向量機和bootstrap 方法相結合,將影響糧倉氣密性的特征變量值進行歸一化和Onehot 編碼,建立回歸模型進行氣密性區間預測,測試表明,糧倉氣密性的區間預測取得了較好的效果。該軟件的計算方法是:一方面,采用支持向量機建立糧倉氣密性回歸模型,利用該回歸模型對糧倉氣密性指標進行點預測;另一方面,將糧倉氣密性回歸模型與bootstrap 方法相結合,實現對糧倉氣密性指標的區間預測,區間預測采用了文獻[1]提出的方法。
由臺灣大學林智仁先生開發的LIBSVM 支持向量機工具箱[2]被廣泛應用于工業、農業、交通、電力、醫學等多學科研究分析預測過程中[3~6]。為方便設計人員預測糧倉設計方案的氣密性,本研究使用LIBSVM 工具箱,并采取C++ GUI 框架Qt與MATLAB 混合編程相結合的方式開發了應用軟件EAGDS 1.0,混合編程可以把MATLAB 強大的計算能力和Qt 優秀的軟件界面設計性能結合起來[7,8]。本研究的軟件界面設計美觀實用,簡約大方,操作方便。該軟件使用多線程加速技術[9]防止卡頓,能夠讓使用者獲得良好的體驗。為了確保數據安全,該軟件加入正則表達式功能對用戶輸入進行限制[10],使用異常警告來提示突發情況,幫助使用者分析和解決問題。軟件使用界面如圖1 所示。

圖1 EAGDS 1.0 軟件界面圖
數據集合表現為矩陣形式,矩陣每一行為一條數據,每一列與一個變量相對應。糧倉設計特征變量包括數值變量和種類變量,數值變量的變量值可以比較大小和排序,如墻厚、建筑面積等;種類變量的變量值不可比較大小和排序,如倉型、屋蓋類型等。
在數據預處理階段,對數值變量數據進行歸一化,歸一化計算公式如下:

式中,xij表示矩陣中第i行第j列的數據;x′i表示歸一化后的數據表示第j列的最小值;makx(xk)j表示第j列的最大值。
用公式(1),將數值變量值映射到區間[0,1]。
對于種類變量,采取Onehot 編碼[11],例如,有3 個種類,則第1 類編碼為(1,0,0),第2 類編碼為(0,1,0),第3 類編碼為(0,0,1)。
支持向量機是一種基于統計學的機器學習算法,能夠有效地處理小樣本數據,可以避免局部最小值,具有較好的泛化能力[12,13]。支持向量機可以完成分類、回歸和分布估計等任務。本研究采用LIBSVM 工具箱建立糧倉設計特征變量與氣密性的回歸模型,氣密性指標為500Pa 壓力半衰期[14]。
bootstrap 方法由美國統計學家Efron 系統地提出[15]。bootstrap 應用了有放回抽樣技術,可以用于機器學習模型的區間預測[16,17]。本研究采用支持向量機回歸模型結合bootstrap 方法對糧倉氣密性進行區間預測。
在Qt 和MATLAB 混合編程前,應該根據MATLAB 版本選擇合適的C++編譯器和Qt 版本,在本研究中,采用較新的MATLAB 2016b 版本,該版本支持與VS2015(對應Qt 版本5.9.3)進行混合編程,在安裝相關軟件后應該對MATLAB 進行設置。操作方法是在MATLAB 命令窗口輸入mbuild-setup 配置MATLAB 編譯器,選擇C++編譯模式進行開發。
MATLAB 可以導出dll 動態鏈接庫與Qt 進行調用,利用MATLAB 完成算法運算,Qt 的界面顯示和交互數據輸入輸出,從而滿足研究使用[18]。
由于Qt 是基于C++的開源庫,C++是面向對象(OOP)的開發語言,在軟件開發過程中應該以面向對象方式進行開發,配合Qt 的信號與槽函數機制使用。因此,要將之前的MATLAB 流程化代碼改成模塊化代碼,在本研究中,筆者將計算部分拆分成4 個模塊:(1)使用已有模型進行點預測模式;(2)重新訓練模型進行點預測模式;(3)使用已有模型進行區間預測模式;(4)重新訓練模型進行區間預測模式。這4 個模塊分別對應軟件流程圖的4 條路線(見圖2)。

圖2 EAGDS 1.0 軟件流程圖
在Qt 與MATLAB 編程中,MATLAB 導出含有頭文件動態運行庫,需要將該頭文件加入到Qt 的項目工程中,同時通過#include <calc.h>頭文件的方式進行調用(calc 這里只是實例名稱,實際研究可能不同),MATLAB 調用傳遞參數由mxArray 進行聲明,聲明時要有該變量的種類和數值范圍,如含有多個實數(mxREAL)浮點矩陣類(mxDOUBLE_CLASS)。
信號槽是Qt 的核心機制,信號就是發生某種動作的條件,槽函數是滿足條件要執行運算的函數[19,20]。例如,在Qt 中按下界面的按鈕就發送一個信號,信號發出后由槽函數接收并且進行響應,槽函數可以是計算任務、網絡操作、消息事件的發出。在本研究中,筆者使用了大量信號槽機制來確保軟件的正常工作。
LIBSVM 庫下載后解壓,改變MATLAB 工作目錄并進入庫的根目錄,運行make 命令進行編譯,將編譯好的庫添加到MATLAB 搜索路徑中。
在MATLAB 中,輸入deploytool 命令打開開發工具對話框,選擇第三個庫編譯器(Library Compiler),打開動態鏈接庫生成器,選擇C++動態鏈接庫后,加入MATLAB 計算源碼文件*.m,等待軟件鏈接庫的打包。
打包之后會產生一個頭文件.h,一個編譯用靜態符號庫.lib,動態鏈接庫.dll,編輯Qt 的項目文件,添加頭文件和動態鏈接庫文件,并且同時添加MATLAB 的基礎庫文件(見圖3)。
對于本研究中軟件不同的預測類型、支持向量機訓練模型方式的選擇,會產生不同的計算結果,表1 展示了預測類型,支持向量機訓練模型方式及計算結果的評價指標。
在本軟件中,筆者使用QButtonGroup 作為功能模式的選擇菜單,使用QLineEdit 作為用戶的抽樣數據輸入控制,使用QTextBrower 作為計算結果的輸出。在不同功能模式按鈕下,筆者使用了多個槽函數控制預測結果的顯示模式[21];同時為了限制用戶輸入,筆者在用戶輸入框使用正則表達式確保輸入符合取值范圍,保證用戶結果的準確;為了能夠提示異常情況的發生,筆者利用MATLAB 對數據進行了判斷處理,設置信號變量傳遞Qt 程序用以判斷響應,提示使用者注意[22];軟件還加入了數據文件自檢的功能,當文件不存在時會告知用戶軟件受到損壞將無法使用。

圖3 Qt 工程項目配置MATLAB鏈接庫

表1 軟件功能表
本研究開發的第一代軟件實現了軟件的主要功能,但在測試使用中發現軟件在計算時主界面會卡死并出現崩潰的情況,使用者無法在界面得到軟件計算提示,重新得到響應需等待計算過程結束,嚴重影響了使用者的體驗。這是由于主界面和計算功能共同使用一個線程,使用多線程可以避免這類情況。
在本研究開發第二代軟件中,筆者使用計算線程和界面主線程分開的方式分別完成不同的功能。在計算線程中完成MATLAB 計算接口的調用,使用自定義信號變量和槽函數告知計算功能的完成和異常情況的發生,該計算線程的定義如圖4 所示,界面主線程只負責執行與用戶交互動作的功能。經過實驗和測試,使用多線程編程起到了很好的效果。

圖4 計算線程的定義
本研究開發的糧倉氣密性預測軟件EAGDS 1.0 使用了支持向量機和bootstrap 對糧倉氣密性數據進行建模分析,可以對新建糧倉氣密性進行預測,以便設計人員改進設計,提高儲存糧食的質量,保證儲存糧食的安全,減少不必要的損失。本研究根據相關的算法開發出計算預測軟件,該軟件界面友好,簡潔易用,使得研究結果具有較好的實用性和推廣應用價值。