郭治洪,童滬琨,張夢歌,劉震華,李建平,陳光中
(1.河南工業(yè)大學(xué)信息科學(xué)與工程學(xué)院,鄭州450001;2.河南工業(yè)大學(xué)土木建筑學(xué)院,鄭州450001)
糧倉建筑的氣密性對于儲糧安全具有重要意義,在以往的糧倉建筑設(shè)計中,缺乏針對糧倉設(shè)計方案與糧倉氣密性的關(guān)系進(jìn)行量化分析的工具,糧倉設(shè)計人員在進(jìn)行糧倉建筑氣密性設(shè)計時需要可供參考的依據(jù)[1]。本研究試圖建立糧倉設(shè)計特征變量與糧倉氣密性的回歸模型,開發(fā)出可以根據(jù)影響糧倉氣密性的相關(guān)因素對糧倉氣密性進(jìn)行提前預(yù)估的軟件,方便糧倉設(shè)計人員依照糧倉氣密性預(yù)測結(jié)果改進(jìn)設(shè)計方案,提高儲糧的安全性,減少糧食產(chǎn)后損失。
建立糧倉建筑設(shè)計方案特征變量與糧倉氣密性指標(biāo)的回歸模型需要一定數(shù)量的已建成糧倉的氣密性數(shù)據(jù),由于受到人力和財力限制,已建成糧倉的氣密性數(shù)據(jù)為小樣本數(shù)據(jù)。在文獻(xiàn)[1]中,支持向量機(jī)和bootstrap 方法相結(jié)合,將影響糧倉氣密性的特征變量值進(jìn)行歸一化和Onehot 編碼,建立回歸模型進(jìn)行氣密性區(qū)間預(yù)測,測試表明,糧倉氣密性的區(qū)間預(yù)測取得了較好的效果。該軟件的計算方法是:一方面,采用支持向量機(jī)建立糧倉氣密性回歸模型,利用該回歸模型對糧倉氣密性指標(biāo)進(jìn)行點預(yù)測;另一方面,將糧倉氣密性回歸模型與bootstrap 方法相結(jié)合,實現(xiàn)對糧倉氣密性指標(biāo)的區(qū)間預(yù)測,區(qū)間預(yù)測采用了文獻(xiàn)[1]提出的方法。
由臺灣大學(xué)林智仁先生開發(fā)的LIBSVM 支持向量機(jī)工具箱[2]被廣泛應(yīng)用于工業(yè)、農(nóng)業(yè)、交通、電力、醫(yī)學(xué)等多學(xué)科研究分析預(yù)測過程中[3~6]。為方便設(shè)計人員預(yù)測糧倉設(shè)計方案的氣密性,本研究使用LIBSVM 工具箱,并采取C++ GUI 框架Qt與MATLAB 混合編程相結(jié)合的方式開發(fā)了應(yīng)用軟件EAGDS 1.0,混合編程可以把MATLAB 強(qiáng)大的計算能力和Qt 優(yōu)秀的軟件界面設(shè)計性能結(jié)合起來[7,8]。本研究的軟件界面設(shè)計美觀實用,簡約大方,操作方便。該軟件使用多線程加速技術(shù)[9]防止卡頓,能夠讓使用者獲得良好的體驗。為了確保數(shù)據(jù)安全,該軟件加入正則表達(dá)式功能對用戶輸入進(jìn)行限制[10],使用異常警告來提示突發(fā)情況,幫助使用者分析和解決問題。軟件使用界面如圖1 所示。
圖1 EAGDS 1.0 軟件界面圖
數(shù)據(jù)集合表現(xiàn)為矩陣形式,矩陣每一行為一條數(shù)據(jù),每一列與一個變量相對應(yīng)。糧倉設(shè)計特征變量包括數(shù)值變量和種類變量,數(shù)值變量的變量值可以比較大小和排序,如墻厚、建筑面積等;種類變量的變量值不可比較大小和排序,如倉型、屋蓋類型等。
在數(shù)據(jù)預(yù)處理階段,對數(shù)值變量數(shù)據(jù)進(jìn)行歸一化,歸一化計算公式如下:
式中,xij表示矩陣中第i行第j列的數(shù)據(jù);x′i表示歸一化后的數(shù)據(jù)表示第j列的最小值;makx(xk)j表示第j列的最大值。
用公式(1),將數(shù)值變量值映射到區(qū)間[0,1]。
對于種類變量,采取Onehot 編碼[11],例如,有3 個種類,則第1 類編碼為(1,0,0),第2 類編碼為(0,1,0),第3 類編碼為(0,0,1)。
支持向量機(jī)是一種基于統(tǒng)計學(xué)的機(jī)器學(xué)習(xí)算法,能夠有效地處理小樣本數(shù)據(jù),可以避免局部最小值,具有較好的泛化能力[12,13]。支持向量機(jī)可以完成分類、回歸和分布估計等任務(wù)。本研究采用LIBSVM 工具箱建立糧倉設(shè)計特征變量與氣密性的回歸模型,氣密性指標(biāo)為500Pa 壓力半衰期[14]。
bootstrap 方法由美國統(tǒng)計學(xué)家Efron 系統(tǒng)地提出[15]。bootstrap 應(yīng)用了有放回抽樣技術(shù),可以用于機(jī)器學(xué)習(xí)模型的區(qū)間預(yù)測[16,17]。本研究采用支持向量機(jī)回歸模型結(jié)合bootstrap 方法對糧倉氣密性進(jìn)行區(qū)間預(yù)測。
在Qt 和MATLAB 混合編程前,應(yīng)該根據(jù)MATLAB 版本選擇合適的C++編譯器和Qt 版本,在本研究中,采用較新的MATLAB 2016b 版本,該版本支持與VS2015(對應(yīng)Qt 版本5.9.3)進(jìn)行混合編程,在安裝相關(guān)軟件后應(yīng)該對MATLAB 進(jìn)行設(shè)置。操作方法是在MATLAB 命令窗口輸入mbuild-setup 配置MATLAB 編譯器,選擇C++編譯模式進(jìn)行開發(fā)。
MATLAB 可以導(dǎo)出dll 動態(tài)鏈接庫與Qt 進(jìn)行調(diào)用,利用MATLAB 完成算法運算,Qt 的界面顯示和交互數(shù)據(jù)輸入輸出,從而滿足研究使用[18]。
由于Qt 是基于C++的開源庫,C++是面向?qū)ο螅∣OP)的開發(fā)語言,在軟件開發(fā)過程中應(yīng)該以面向?qū)ο蠓绞竭M(jìn)行開發(fā),配合Qt 的信號與槽函數(shù)機(jī)制使用。因此,要將之前的MATLAB 流程化代碼改成模塊化代碼,在本研究中,筆者將計算部分拆分成4 個模塊:(1)使用已有模型進(jìn)行點預(yù)測模式;(2)重新訓(xùn)練模型進(jìn)行點預(yù)測模式;(3)使用已有模型進(jìn)行區(qū)間預(yù)測模式;(4)重新訓(xùn)練模型進(jìn)行區(qū)間預(yù)測模式。這4 個模塊分別對應(yīng)軟件流程圖的4 條路線(見圖2)。
圖2 EAGDS 1.0 軟件流程圖
在Qt 與MATLAB 編程中,MATLAB 導(dǎo)出含有頭文件動態(tài)運行庫,需要將該頭文件加入到Qt 的項目工程中,同時通過#include <calc.h>頭文件的方式進(jìn)行調(diào)用(calc 這里只是實例名稱,實際研究可能不同),MATLAB 調(diào)用傳遞參數(shù)由mxArray 進(jìn)行聲明,聲明時要有該變量的種類和數(shù)值范圍,如含有多個實數(shù)(mxREAL)浮點矩陣類(mxDOUBLE_CLASS)。
信號槽是Qt 的核心機(jī)制,信號就是發(fā)生某種動作的條件,槽函數(shù)是滿足條件要執(zhí)行運算的函數(shù)[19,20]。例如,在Qt 中按下界面的按鈕就發(fā)送一個信號,信號發(fā)出后由槽函數(shù)接收并且進(jìn)行響應(yīng),槽函數(shù)可以是計算任務(wù)、網(wǎng)絡(luò)操作、消息事件的發(fā)出。在本研究中,筆者使用了大量信號槽機(jī)制來確保軟件的正常工作。
LIBSVM 庫下載后解壓,改變MATLAB 工作目錄并進(jìn)入庫的根目錄,運行make 命令進(jìn)行編譯,將編譯好的庫添加到MATLAB 搜索路徑中。
在MATLAB 中,輸入deploytool 命令打開開發(fā)工具對話框,選擇第三個庫編譯器(Library Compiler),打開動態(tài)鏈接庫生成器,選擇C++動態(tài)鏈接庫后,加入MATLAB 計算源碼文件*.m,等待軟件鏈接庫的打包。
打包之后會產(chǎn)生一個頭文件.h,一個編譯用靜態(tài)符號庫.lib,動態(tài)鏈接庫.dll,編輯Qt 的項目文件,添加頭文件和動態(tài)鏈接庫文件,并且同時添加MATLAB 的基礎(chǔ)庫文件(見圖3)。
對于本研究中軟件不同的預(yù)測類型、支持向量機(jī)訓(xùn)練模型方式的選擇,會產(chǎn)生不同的計算結(jié)果,表1 展示了預(yù)測類型,支持向量機(jī)訓(xùn)練模型方式及計算結(jié)果的評價指標(biāo)。
在本軟件中,筆者使用QButtonGroup 作為功能模式的選擇菜單,使用QLineEdit 作為用戶的抽樣數(shù)據(jù)輸入控制,使用QTextBrower 作為計算結(jié)果的輸出。在不同功能模式按鈕下,筆者使用了多個槽函數(shù)控制預(yù)測結(jié)果的顯示模式[21];同時為了限制用戶輸入,筆者在用戶輸入框使用正則表達(dá)式確保輸入符合取值范圍,保證用戶結(jié)果的準(zhǔn)確;為了能夠提示異常情況的發(fā)生,筆者利用MATLAB 對數(shù)據(jù)進(jìn)行了判斷處理,設(shè)置信號變量傳遞Qt 程序用以判斷響應(yīng),提示使用者注意[22];軟件還加入了數(shù)據(jù)文件自檢的功能,當(dāng)文件不存在時會告知用戶軟件受到損壞將無法使用。
圖3 Qt 工程項目配置MATLAB鏈接庫
表1 軟件功能表
本研究開發(fā)的第一代軟件實現(xiàn)了軟件的主要功能,但在測試使用中發(fā)現(xiàn)軟件在計算時主界面會卡死并出現(xiàn)崩潰的情況,使用者無法在界面得到軟件計算提示,重新得到響應(yīng)需等待計算過程結(jié)束,嚴(yán)重影響了使用者的體驗。這是由于主界面和計算功能共同使用一個線程,使用多線程可以避免這類情況。
在本研究開發(fā)第二代軟件中,筆者使用計算線程和界面主線程分開的方式分別完成不同的功能。在計算線程中完成MATLAB 計算接口的調(diào)用,使用自定義信號變量和槽函數(shù)告知計算功能的完成和異常情況的發(fā)生,該計算線程的定義如圖4 所示,界面主線程只負(fù)責(zé)執(zhí)行與用戶交互動作的功能。經(jīng)過實驗和測試,使用多線程編程起到了很好的效果。
圖4 計算線程的定義
本研究開發(fā)的糧倉氣密性預(yù)測軟件EAGDS 1.0 使用了支持向量機(jī)和bootstrap 對糧倉氣密性數(shù)據(jù)進(jìn)行建模分析,可以對新建糧倉氣密性進(jìn)行預(yù)測,以便設(shè)計人員改進(jìn)設(shè)計,提高儲存糧食的質(zhì)量,保證儲存糧食的安全,減少不必要的損失。本研究根據(jù)相關(guān)的算法開發(fā)出計算預(yù)測軟件,該軟件界面友好,簡潔易用,使得研究結(jié)果具有較好的實用性和推廣應(yīng)用價值。