陳 棟 吳保國 王姍姍 蘇曉慧 陳玉玲 李宜瑾
(1. 北京林業大學信息學院 北京100083; 2. 國家農業信息化工程技術研究中心 北京100097; 3. 中國聯通網絡技術研究院 北京100048)
近年來,人們對造林、撫育間伐、更新等階段的人工林經營模型研究逐步深入,模型規整、推廣和應用的方式方法也備受關注,隨著信息技術不斷發展,面向人工林經營的決策支持系統成為了模型應用的有力渠道。決策支持系統(decision support system,簡稱DSS)概念自提出以來,其基本結構不斷發生變化: 早期的決策支持系統是由模型庫、數據庫和人機交互界面3個部件構成的兩庫結構; 隨著研究的深入,將算法從模型庫中獨立出來構成方法庫,擴展成三庫結構; 在此基礎上,學者們又引入知識庫,形成四庫結構。這種四庫結構一直沿用至今,其中模型庫和方法庫是存儲決策支持系統決策所需各種模型和決策方法的數據庫。林業行業20世紀80年代末期開始了決策支持系統的探索(宋鐵英, 1990; 李際平, 1991; 1994),進入21世紀,林業決策支持系統的相關研究如雨后春筍般涌現,國內外研究者相繼構建了針對某一應用場景下的林業決策系統原型(吳保國等, 2006; 2009a; 2009b; 楊英奎, 2015; 沈立輝, 2015; 謝黎等, 2008; 謝小魁等, 2011; 李勇等, 2003; 李大偉等, 2010; 王琳等, 2006; 薛晶, 2008; 石磊等, 2007; 肖勁鋒等, 2001; Wangetal., 2008),目前決策支持系統的應用范圍已經擴展到林業各個領域。由于森林經營決策領域的模型眾多,且對統計學方法依賴性較強,因此模型庫和方法庫對森林經營決策支持系統的作用顯得尤為重要。Ren等(2014)構建南方人工林模型系統,存儲了經營、效益等模型; 李勇等(2003)研究了一類DSS方法庫的可重用體系結構; 李大偉等(2010)對決策支持系統的模型庫和方法庫進行了概要設計。隨著計算機技術不斷發展,基于Web Service以及SOA架構的B/S模型庫系統相繼出現(Richardsonetal., 2006; 陳砣等, 2009; Ayedetal., 2016; Rauscheretal., 2000; Soufietal., 2018; Zhuetal., 2007; Newton, 2015; 鄭廣成, 2011),大大提升了模型庫系統的管理水平。森林經營領域,王琳等(2016)從樹木生長模型分類入手,對模型的構建、存儲、管理等流程進行了研究; 吳保國等(2009a; 2009b)為實現森林培育專家決策,構建了適用于單一樹種的模型庫。綜上可見,現有森林經營決策系統中模型庫的設計只考慮了數學公式型模型,沒有涉及程序型模型(如基于人工神經網絡的應用模型),且往往針對的是某一樹種或特定決策過程,缺乏通用性; 而且,在森林經營決策系統中應用的方法多以嵌入程序的形式存在,大大增加了方法管理的復雜度; 此外,在模型與方法的統一管理、依托方法庫的模型更新以及基于Web技術的面向大眾和應用的模型與方法服務等方面鮮見研究報道。
針對以上現狀,本研究在分析人工林經營模型結構和構建方法的基礎上,為降低模型和方法存儲與管理的復雜度,增強模型存儲的通用性和方法管理的便捷性,結合森林經營模型和方法的特征,利用面向服務和數據耦合思想,將模型庫和方法庫與決策系統解耦,分別設計模型庫和方法庫關系模式,構建面向服務的模型庫和方法庫平臺系統原型,以期為人工林經營過程提供模型和方法的計算、調用和共享服務。
模型是人類認識自然、改造自然的強有力工具,幾乎所有領域都在不約而同地應用模型來解決其領域問題。人工林經營領域積累了大量數學模型,涵蓋造林、撫育、間伐、經營優化、更新等經營階段,主要包括立地質量評價模型、生長收獲模型、形態生長模型、效益評價模型等數學方程式模型,以及利用神經網絡等機器學習方法構建的程序塊模型,如表1所示。
為解決模型庫的通用性問題,本研究針對不同模型形式的存儲和解析展開探索,設計適用于不同樹種的數學方程型和程序塊型的存儲關系模式。為了方便存儲、管理和調用人工林經營模型,采用“數據表示法”和“程序表示法”分別表示數學方程型和程序塊型模型。
數據表示法將數學公式以字符串形式存儲在關系數據庫中,如內蒙古赤峰地區華北落葉松(Larixprincipis-rupprechtii)地位指數模型的表達方程(韓焱云, 2015):SI=Ht×{0.81÷[1-exp (-0.056t)]}1.36,在模型表“模型代數表達式”字段中存儲的公式字符串為“HT*(0.81/[1-EXP(-0.056*T)])^1.36”,解析公式時首先需要通過詞法分析識別字符串中的運算符,然后通過語義分析驗證公式的語義正確性,驗證通過后利用逆波蘭式對公式進行計算。

表1 人工林經營決策支持模型分類Tab.1 The decision support model classification of artificial forest management
程序表示法將模型與計算機程序融為一體,每個模型對應一套完整程序,如人工神經網絡構建的林分蓄積量模型等,模型實現基本使用統計程序語言進行編寫,將模型整理為程序包文件,在模型表的“模型程序包存放地址”字段中存儲程序包文件的路徑,解析公式時通過路徑獲取程序包文件,經解析后得到模型結果。
針對以上2種模型表示方式,結合人工林經營模型特征,構建模型庫關系模式(王珊等, 2006),并使用關系型數據庫(本研究使用SQL Server2008數據庫)存儲2種方式表示的模型。關系模式如下:
模型表(模型編號、模型名稱、模型分類、模型形式、樹種名、適用地區、模型描述、模型代數表達式、模型程序包存放地址、模型變量名列表、模型作者姓名、所屬國家、作者電子郵件、最后更新時間,備注);
模型調用記錄表(模型編號、調用日期、調用用戶編號、模型輸出結果、備注)。
模型表用于對模型全方位表述,其中,模型分類: 模型分類的名稱(按表1中模型分類名稱進行分類); 模型形式: 包括“數據表示”和“程序表示”2種; 模型代數表達式: 若模型形式為“數據表示”,則填寫模型由數學方程式公式改寫的公式字符串表達式,否則為空; 模型程序包存放地址: 如果模型形式為“程序表示”,則存儲模型程序包存放的相對路徑,否則為空; 樹種名: 代表此模型適用于具體哪種樹種; 模型變量名列表: 模型中的變量英文字符,用逗號分隔; 備注: 說明模型適合條件。
模型調用記錄表用于記錄模型的使用記錄,以方便對模型使用進行分析。表中調用用戶編號為模型調用中系統用戶編號,模型輸出結果記錄每次調用模型產生的結果。
表2所示為部分人工林經營所需要的模型具體存儲示例,系統管理員可以根據需要修改、增加、刪除模型。

表2 模型表中的存儲示例Tab.2 Sample storage in a model table
針對數據表示和程序表示2種模型,前者通過規定模型表達式的基本語法規則,使用詞法分析、語法分析、語義分析和表達式計算實現解析過程; 后者使用R語言對模型進行實現,通過Rsession調用R程序包實現模型計算。設計模型解析流程如圖1所示。在解析流程中,首先根據傳入的模型ID去模型庫中查詢具體模型,然后調出模型信息,判斷模型是數據表示模型還是程序表示模型,若為數據表示模型,則進入程序數據解析流程,反之進行程序模型解析流程。
1.3.1 “數據表示”模型解析 1) 詞法分析 詞法分析是讀取字符串形式的模型表達式,并將其分成一個個獨立的詞法單元token,如數字、操作符或函數等,構成單詞符號序列token流。以內蒙古赤峰市華北落葉松在立地質量為優時平均高模型表達方程20.597×[1-exp (-0.055t)]1.344為例(韓焱云, 2015),模型解析的詞法分析過程如圖2所示。

圖1 模型解析流程Fig.1 Model analytic flow diagram

圖2 模型表達式詞法分析過程Fig.2 The lexical analysis process of model formula
2) 語法分析 語法分析是對詞法分析獲得的token流進行識別并判斷其是否存在語法錯誤,如操作數個數是否符合、左右括號是否匹配等。本研究采用上下文無關(context free grammar,CFG)文法對其進行語法分析。
以華北落葉松在立地質量為優時平均高模型表達方程20.597*[1-exp(-0.055*t)]^1.344 為例,該模型的文法G1包含以下產生式:
G1: E->E-E|E*E|exp(E)|E^E|(E)|i
基于G1文法,采用最左推導,可以推導出i*((i-exp(i*i))^i),推導過程如下:
E->E*E->E*(E)->E*(E^E)->E*(E^i)—>E*((E)^i)->E*((E-E)^i)->E*((E-exp(E))^i)->E*((E-exp(E*E))^i)->E*((E-exp(E*i))^i)->E*((E-exp(i*i))^i)->E*((i-exp(i*i))^i)->i*((i-exp(i*i))^i)
E代表算數表達式,i為數字或變量標識符。
語法分析樹如圖3所示。語法樹根節點為開始符E,葉節點為終結點。通過自頂向下的語法分析算法對語法樹進行遍歷,并最終判斷語法的正確性,從而檢驗方程式表達式的正確性。

圖3 語法分析樹Fig.3 Parse tree
3) 語義分析與模型計算 語義分析是在語法分析基礎上進一步對模型表達式的運算對象進行邏輯檢查,如除數不能為0等; 同時利用逆波蘭式進行模型表達式計算。通過構建存儲器和符號棧,存儲數據和操作符。存儲器從左向右存儲數據,而符號棧遵循先進后出的原則,從左向右掃描模型表達式生成逆波蘭式,從而計算逆波蘭表達式,完成模型計算。
4) 模型解析核心流程實現 基于以上研究,數據表示模型解析核心流程實現包括詞法分析、語法分析和模型計算。具體實現如下:
①詞法分析函數: LexicalAnalysis(String modelstring),輸入的是模型公式字符串,返回的是單詞符號序列Map;
②語法分析函數: GrammaAnalysis(Map tokenmap),輸入的是單詞符號序列Map,返回的是Boolean值(公式是否有語法錯誤,沒有返回true,有返回false);
③ 步驟①、②是對模型公式正確性進行校驗,如返回true,則使用Java的ExpressionEvaluator類的eval方法對模型公式進行計算; 如返回false,則提示錯誤信息。
1.3.2 “程序表示”模型解析 程序包式模型類似于黑盒模式,直接輸入模型參數值,調用程序輸出結果即可完成模型計算。本研究將此類模型封裝在R語言程序包(王斌會, 2014)中,使用Rserver的Rsession對象調用封裝好的程序包。程序表示模型解析核心流程實現如下:
① 從模型表的模型讀取程序包存放地址字段,通過RserverConf對象連接Rserver服務器,獲取存儲在Rserver服務器上的模型程序包。
② 使用Rsession對象解析模型程序包,將參數代入。
③ 使用Rsession對象中的eval方法計算模型結果返回。
方法是指在自然科學領域中所采用的基本算法和過程,如圖4所示,包括基本數學方法、統計學習方法、優化方法和預測方法等。目前常用的做法是將方法嵌入業務程序中,但該做法會增加方法維護管理的復雜度。為了將方法代碼和業務代碼解耦,引入Rserver和Rsession將方法代碼用R語言實現并封裝。
為了方便對方法庫的方法進行管理和調用,決策支持系統中的方法庫由方法程序庫和方法描述表組成。方法程序庫以文件形式存儲方法程序塊,方法描述表存儲方法描述信息,采用關系型數據庫的關系存儲。
2.2.1 基于R語言的方法程序庫設計 統計學習方法是人工林經營模型生成和更新的常用方法,本研究以林業常用回歸方法為例,采用R語言依次對方法進行程序包開發,并將方法程序以R執行文件形式保存。每種方法生成一個R語言程序包,存儲在對應的文件夾下,具體如表3所示。
2.2.2 方法描述表設計 為了方便對方法庫的方法進行管理和調用,方法描述表中需要存儲方法的描述信息和方法程序包的調用地址。另外,為了記錄方法庫的使用情況,需設置一種方法調用記錄表。具體表的關系模式如下:
方法描述表(方法編號、方法名、方法說明、參數組成、輸出值類型、是否方法組合、組合方式、組合編號、組合方法執行順序號、程序包路徑、備注);
方法調用記錄表(方法編號、調用日期、方法輸入數據、方法輸出結果、備注)。
在方法描述表中,程序包路徑字段存放R語言程序包的路徑,方法被調用時,系統會根據該路徑去獲取方法程序包運行。

圖4 方法庫中的方法模塊Fig.4 Method module diagram in method library

表3 基于R語言的方法程序①Tab.3 A list of methods programs based on the R language

續表3 Continued
① “—”表示此內容本研究暫未涉及。“—”indicates that this study is not yet relevant.
方法庫中各方法使用R語言程序進行封裝,通過Rserver服務器進行發布,并將方法的描述存入關系型數據庫中,調用通過Rsession完成,如圖5所示。
方法解析流程是查找方法運行計算結果的過程。首先根據傳入的方法ID去方法庫中查詢具體方法,然后調出方法信息,提出方法程序包,將實參輸入,使用Rsession調用并執行程序包文件,計算出結果后將結果轉化為標準數據傳輸格式輸出。具體的方法解析流程如圖6所示。

圖5 方法庫調用示意Fig.5 Method call diagrammatic sketch

圖6 方法解析流程Fig.6 Method call flow diagram

圖7 模型與方法庫平臺系統結構Fig.7 The model library and method library management system structure
為了滿足模型與方法的統一管理,并實現面向大眾和應用的模型與方法服務,設計模型與方法庫平臺的系統結構。如圖7所示,模型庫與方法庫系統分別提供了基于API調用的接口服務和用戶使用界面,前者為人工林經營決策支持系統提供模型管理、計算與方法管理、運算服務, 后者為系統使用者提供模型查詢計算與方法查詢計算功能。另外,模型庫和方法庫管理系統之間設計中間件,實現對模型庫的更新。
模型與方法庫平臺系統原型的研建使用Java EE、Spring MVC、Hibernate、Jquery與Bootstrap等技術開發實現,模型與方法的調用使用基于HTTP協議構建的API。系統技術架構如圖8所示。

圖8 系統技術架構Fig.8 Technical architecture of subsystem
模型與方法庫平臺系統結構采用獨立的2種方式(API和界面)調用模型與方法,無論是以API方式還是以界面方式調用模型與方法,都需要提供查詢和計算功能。實現這2種方式,必須有良好的數據交互結構,因此設計面向服務的統一數據交互結構是實現模型與方法服務模型的基礎。本研究在模型與方法基本結構的基礎上,利用符號化表達法以及標準數據傳輸結構,設計模型調用和方法調用過程中的數據傳輸格式。
1) 模型調用過程中數據傳輸格式 調用模型庫中的模型時,數據傳輸格式采用符號化方法對模型進行表達,格式如下:
ForestryModel=(ModelDic,ModelDes,ModelResult,Time)。
式中:ModelDic是模型基本描述信息; ModelDes是模型具體信息; ModelResult是模型計算結果; Time是模型調用時間。
ModelDic=(ModelId,ModelName,ModelClassName,ModelForm,ModelTreeName,ModelArea,ModelExplain,ModelAuthors,Country,Email,Remark)。
式中:ModelId∈Integer是系統內部定義的模型編號;ModelName∈String是模型名稱;ModelClassName∈String是模型類別名稱;ModelForm∈String是模型形式(數據表示、程序表示);ModelTreeName∈String是模型適合的樹種名稱;ModelArea∈String是模型適合的地區名稱;ModelExplain∈String是對模型的解釋說明;ModelAuthors∈String是模型作者;Country∈String是模型作者所在國家;Email∈String是作者郵件地址;Remark∈String是模型表述的備注信息。
ModelDes=(ModelId,ModelAlgebraicExpression,ModelParams,Remark)。
式中:ModelId∈Integer是系統內部定義的模型編號;ModelAlgebraicExpression∈String是模型的代數表達式(如果模型使用的是程序包,則填“無”,并在Remark中填入“程序包”);ModelParams∈String是模型的自變量參數列表;Remark∈String是模型表述的備注信息。
ModelResult∈String,是模型調用后的結果。
Time∈Date,是模型調用時的時間戳。
基于以上分析,使用輕量級數據交換格式JSON(JavaScript Object Notation)作為數據傳輸格式。定義模型調用的數據傳輸格式如下:
{"ForestryModel":
"ModelDic":{ ∥模型基本描述信息
"ModelId":"XXX", ∥模型編號
"ModelName":"XXX", ∥模型名稱
"ModelClassName":"XXX", ∥模型類別名稱
"ModelTreeName":"XXX", ∥模型適用樹種名稱
"ModelArea":"XXX", ∥模型使用地區名稱
"ModelExplain":"XXX", ∥模型解釋說明
"ModelAuthors":"XXX”, ∥模型作者
"Country":"XXX", ∥作者所在國家
"Email":"XXX", ∥作者Email
"Remark":"XXX" ∥模型備注信息
},
"ModelDes":{ ∥模型具體信息
"ModelId":"XXX", ∥模型編號
"ModelAlgebraicExpression": "XXX", ∥模型代數表達式
"ModelParams":"XXX", ∥模型自變量參數列表
"Remark":"XXX" ∥模型具體信息備注
},
"ModelResult":"XXX", ∥模型計算結果
"Time":"XXX" ∥模型調用時間戳
}
2) 方法調用過程中數據傳輸格式 調用方法庫中的方法時,數據傳輸格式采用采用符號化方法對方法進行表達,格式如下:
ForestryAlgorithm=(AlgorithmDic,AlgorithmDes,AlgorithmResult,Time)。
式中:AlgorithmDic是方法基本描述信息; AlgorithmDes是方法具體信息; AlgorithmResult是方法計算結果; Time是方法調用時間。
AlgorithmDic=(AlgorithmId,AlgorithmName,AlgorithmExplain,AlgorithmParams,AlgorithmOutputType,IsGroup,GroupType,Remark)。
式中:AlgorithmId∈Int是系統內部定義的方法編號;AlgorithmName∈String是方法名稱;AlgorithmExplain∈String是對方法的解釋說明;AlgorithmParams∈String是方法輸入參數列表;AlgorithmOutputType∈String是方法輸出結果說明(數值型/代數表達式型);IsGroup∈String說明方法是以組合形式運行還以單個方法運行;GroupType∈String代表方法的組合方式[串聯: N1,N2…Nn/并聯: N1,N2…Nn/(Ni代表方法編號)];Remark∈String是方法表述的備注信息。
AlgorithmDes=(AlgorithmId,Remark)。
式中:AlgorithmId∈Int是系統內部定義的方法編號;Remark∈String是方法表述的備注信息。
AlgorithmResult∈String,是方法調用后的結果。
Time∈Date,是方法調用時的時間戳。
方法庫調用的數據傳輸格式參照模型調用的數據傳輸格式生成,具體如下:
{"ForestryAlgorithm":
"AlgorithmDic":{ ∥方法基本描述信息
"AlgorithmId":"XXX", ∥方法編號
"AlgorithmName":"XXX", ∥方法名稱
"AlgorithmExplain":"XXX", ∥方法解釋說明
"AlgorithmParams":"XXX", ∥方法參數說明
"AlgorithmOutputType":"XXX", ∥方法輸出結果說明
"IsGroup":"XXX", ∥是否為組合方法
"GroupType":"XXX" ∥組合方式
"Remark":"XXX" ∥方法備注信息
},
"AlgorithmDes":{ ∥方法具體信息
"AlgorithmId":"XXX", ∥方法編號
"AlgorithmURL":"XXX", ∥方法程序包存放地址
"Remark":"XXX" ∥方法具體備注信息
},
"AlgorithmResult":"XXX", ∥方法運算結果
"Time":"XXX" ∥方法調用時間戳
}
當模型和方法庫平臺與其他應用系統或平臺界面進行數據交互時,使用以上定義好的數據交互格式可以提高調用的規范化和便捷性。
平臺使用SQLServer2008數據庫實現模型(圖9)與方法(圖10)的存儲,目前存儲了廣西、福建等在內的人工林胸徑、斷面積、樹高、蓄積、地位指數、林分密度指數等生長收獲模型以及各種線性與非線性擬合方法等。平臺可提供API調用和友好的用戶使用界面功能2種服務方式: API接口是為人工林經營輔助決策等業務系統提供模型、方法調用服務的,業務系統通過HTTP請求的方式,用GET或POST方法向平臺發送請求,平臺計算出結果后將其轉換為統一數據交互結構返回給業務系統; 友好的用戶使用界面為用戶提供模型、方法基本信息的查詢、調用說明以及模型計算等功能。本研究以福建某國有林場人工林林分收獲模擬過程為應用場景,說明模型的計算調用運行過程; 以地位指數方程的擬合構建為例,說明非線性擬合方法的計算調用運行過程。
以福建杉木(Cunninghamialanceolata)全林分平均胸徑模型調用計算為例,分別通過API和頁面2種調用方式給出模型庫調用實例。
1) API調用 調用福建杉木全林分平均胸徑模型,地位指數為18,林分密度為2 000株·hm-2,預估10、15、20、25、30林齡的林分平均胸徑,模型調用說明如表4所示,整理計算機結果如表5所示。

圖9 模型表存儲實例Fig.9 Model table storage

表4 模型API調用說明Tab.4 Model API call description

表5 杉木人工林林分平均胸徑模擬(SI=18)Tab.5 Simulation of mean BDH of Chinese fir plantation(SI=18)
2) 頁面調用 與API調用對應,使用頁面調用福建杉木人工林全林分平均胸徑模型,地位指數為18,林分密度為2 000株·hm-2,預估10、15、20、25、30林齡的林分平均胸徑。調用時,進入如圖11所示福建杉木人工林全林分平均胸徑模型計算交互頁面,在模型計算對話框中輸入地位指數: 18,密度: 2 000,林齡: 10、15、20、25、30,點擊“調用計算”按鈕即可得到計算結果。
以福建杉木地位指數方程擬合為例,使用Richards理論生長方程作為原型,采用代數差分法構建地位指數方程。
1) API調用 選擇以a為自由參數對Richards理論生長方程進行變換得到公式: HT2~HT1*{{[1-exp(-b*T2)]/[1-exp(-b*T1)]}^c},使用來自福建省兩期固定復測樣地(212塊)數據對以上公式進行擬合,其中,T1為第1期的林齡,HT1為第1期的優勢木高,T2為第2期的林齡,HT2為第2期的優勢木高。數據示例如表6所示。

表6 固定復測樣地林齡與優勢木高數據示例Tab.6 Fixed re-test sample forest age and superior wood height data
調用非線性回歸方法,參數分別為擬合公式formula=‘HT2~HT1*{{[1-exp(-b*T2)]/[1-exp(-b*T1)]}^c}’;b=0.105 636,c=1.139 241 (初始參數值);T1=14,16,18,20,14,…;T2=19,21,23,25,19,…; HT1=3.2,7.6,8.6,7.5,8.1,…; HT2=5.9,5,5,8.5,13.5,…; 不同參數之間以&符號隔開; 平臺擬合后將結果返回。具體調用說明如表7所示。

表7 方法API調用說明Tab.7 Method API call description
其他非線性擬合方法調用與表7中的調用方式類似,用戶可根據擬合的返回結果判斷擬合效果,選擇擬合效果好的模型補充到模型表中。
2) 頁面調用 采用與API調用同樣的應用場景,使用頁面的方式調用非線性回歸方法。 在方法庫頁面中選擇非線性回歸方法,將數據寫入如圖12所示的擬合數據文件(文件為Excel類型),然后點擊“上傳數據文件”按鈕,將填寫好的數據文件上傳; 在圖13的參數對話框中分別填寫擬合公式和初始參數值。平臺進行擬合,擬合結果返回,如圖13的頁面顯示。

圖12 方法調用擬合數據模板Fig.12 Method call fitting data template

圖13 方法調用接口說明界面Fig.13 Method call interface description interface
本研究應用關系型數據庫結合R語言程序封裝方法構建了通用性強的模型庫和方法庫,采用數據表示法和程序表示法分別表達人工林經營中數學公式型模型和程序塊型模型,針對數據表達的模型,使用詞法分析、語法分析、語義分析等方法實現模型的解析計算,針對程序表達的模型,利用Rsession實現程序模型的調用計算,同時利用Rsession實現對方法庫中方法的管理和調用,實現了模型、方法的管理更新與業務代碼的分離,降低了模型、方法的管理和使用復雜度。通過構建數據交互結構,為實現模型庫與方法庫的API調用奠定了基礎,使模型庫與方法庫具備了面向用戶的界面使用服務與程序級調用服務功能。