陳 棟 吳保國 王姍姍 蘇曉慧 陳玉玲 李宜瑾
(1. 北京林業(yè)大學信息學院 北京100083; 2. 國家農(nóng)業(yè)信息化工程技術(shù)研究中心 北京100097; 3. 中國聯(lián)通網(wǎng)絡(luò)技術(shù)研究院 北京100048)
近年來,人們對造林、撫育間伐、更新等階段的人工林經(jīng)營模型研究逐步深入,模型規(guī)整、推廣和應用的方式方法也備受關(guān)注,隨著信息技術(shù)不斷發(fā)展,面向人工林經(jīng)營的決策支持系統(tǒng)成為了模型應用的有力渠道。決策支持系統(tǒng)(decision support system,簡稱DSS)概念自提出以來,其基本結(jié)構(gòu)不斷發(fā)生變化: 早期的決策支持系統(tǒng)是由模型庫、數(shù)據(jù)庫和人機交互界面3個部件構(gòu)成的兩庫結(jié)構(gòu); 隨著研究的深入,將算法從模型庫中獨立出來構(gòu)成方法庫,擴展成三庫結(jié)構(gòu); 在此基礎(chǔ)上,學者們又引入知識庫,形成四庫結(jié)構(gòu)。這種四庫結(jié)構(gòu)一直沿用至今,其中模型庫和方法庫是存儲決策支持系統(tǒng)決策所需各種模型和決策方法的數(shù)據(jù)庫。林業(yè)行業(yè)20世紀80年代末期開始了決策支持系統(tǒng)的探索(宋鐵英, 1990; 李際平, 1991; 1994),進入21世紀,林業(yè)決策支持系統(tǒng)的相關(guān)研究如雨后春筍般涌現(xiàn),國內(nèi)外研究者相繼構(gòu)建了針對某一應用場景下的林業(yè)決策系統(tǒng)原型(吳保國等, 2006; 2009a; 2009b; 楊英奎, 2015; 沈立輝, 2015; 謝黎等, 2008; 謝小魁等, 2011; 李勇等, 2003; 李大偉等, 2010; 王琳等, 2006; 薛晶, 2008; 石磊等, 2007; 肖勁鋒等, 2001; Wangetal., 2008),目前決策支持系統(tǒng)的應用范圍已經(jīng)擴展到林業(yè)各個領(lǐng)域。由于森林經(jīng)營決策領(lǐng)域的模型眾多,且對統(tǒng)計學方法依賴性較強,因此模型庫和方法庫對森林經(jīng)營決策支持系統(tǒng)的作用顯得尤為重要。Ren等(2014)構(gòu)建南方人工林模型系統(tǒng),存儲了經(jīng)營、效益等模型; 李勇等(2003)研究了一類DSS方法庫的可重用體系結(jié)構(gòu); 李大偉等(2010)對決策支持系統(tǒng)的模型庫和方法庫進行了概要設(shè)計。隨著計算機技術(shù)不斷發(fā)展,基于Web Service以及SOA架構(gòu)的B/S模型庫系統(tǒng)相繼出現(xiàn)(Richardsonetal., 2006; 陳砣等, 2009; Ayedetal., 2016; Rauscheretal., 2000; Soufietal., 2018; Zhuetal., 2007; Newton, 2015; 鄭廣成, 2011),大大提升了模型庫系統(tǒng)的管理水平。森林經(jīng)營領(lǐng)域,王琳等(2016)從樹木生長模型分類入手,對模型的構(gòu)建、存儲、管理等流程進行了研究; 吳保國等(2009a; 2009b)為實現(xiàn)森林培育專家決策,構(gòu)建了適用于單一樹種的模型庫。綜上可見,現(xiàn)有森林經(jīng)營決策系統(tǒng)中模型庫的設(shè)計只考慮了數(shù)學公式型模型,沒有涉及程序型模型(如基于人工神經(jīng)網(wǎng)絡(luò)的應用模型),且往往針對的是某一樹種或特定決策過程,缺乏通用性; 而且,在森林經(jīng)營決策系統(tǒng)中應用的方法多以嵌入程序的形式存在,大大增加了方法管理的復雜度; 此外,在模型與方法的統(tǒng)一管理、依托方法庫的模型更新以及基于Web技術(shù)的面向大眾和應用的模型與方法服務等方面鮮見研究報道。
針對以上現(xiàn)狀,本研究在分析人工林經(jīng)營模型結(jié)構(gòu)和構(gòu)建方法的基礎(chǔ)上,為降低模型和方法存儲與管理的復雜度,增強模型存儲的通用性和方法管理的便捷性,結(jié)合森林經(jīng)營模型和方法的特征,利用面向服務和數(shù)據(jù)耦合思想,將模型庫和方法庫與決策系統(tǒng)解耦,分別設(shè)計模型庫和方法庫關(guān)系模式,構(gòu)建面向服務的模型庫和方法庫平臺系統(tǒng)原型,以期為人工林經(jīng)營過程提供模型和方法的計算、調(diào)用和共享服務。
模型是人類認識自然、改造自然的強有力工具,幾乎所有領(lǐng)域都在不約而同地應用模型來解決其領(lǐng)域問題。人工林經(jīng)營領(lǐng)域積累了大量數(shù)學模型,涵蓋造林、撫育、間伐、經(jīng)營優(yōu)化、更新等經(jīng)營階段,主要包括立地質(zhì)量評價模型、生長收獲模型、形態(tài)生長模型、效益評價模型等數(shù)學方程式模型,以及利用神經(jīng)網(wǎng)絡(luò)等機器學習方法構(gòu)建的程序塊模型,如表1所示。
為解決模型庫的通用性問題,本研究針對不同模型形式的存儲和解析展開探索,設(shè)計適用于不同樹種的數(shù)學方程型和程序塊型的存儲關(guān)系模式。為了方便存儲、管理和調(diào)用人工林經(jīng)營模型,采用“數(shù)據(jù)表示法”和“程序表示法”分別表示數(shù)學方程型和程序塊型模型。
數(shù)據(jù)表示法將數(shù)學公式以字符串形式存儲在關(guān)系數(shù)據(jù)庫中,如內(nèi)蒙古赤峰地區(qū)華北落葉松(Larixprincipis-rupprechtii)地位指數(shù)模型的表達方程(韓焱云, 2015):SI=Ht×{0.81÷[1-exp (-0.056t)]}1.36,在模型表“模型代數(shù)表達式”字段中存儲的公式字符串為“HT*(0.81/[1-EXP(-0.056*T)])^1.36”,解析公式時首先需要通過詞法分析識別字符串中的運算符,然后通過語義分析驗證公式的語義正確性,驗證通過后利用逆波蘭式對公式進行計算。
表1 人工林經(jīng)營決策支持模型分類Tab.1 The decision support model classification of artificial forest management
程序表示法將模型與計算機程序融為一體,每個模型對應一套完整程序,如人工神經(jīng)網(wǎng)絡(luò)構(gòu)建的林分蓄積量模型等,模型實現(xiàn)基本使用統(tǒng)計程序語言進行編寫,將模型整理為程序包文件,在模型表的“模型程序包存放地址”字段中存儲程序包文件的路徑,解析公式時通過路徑獲取程序包文件,經(jīng)解析后得到模型結(jié)果。
針對以上2種模型表示方式,結(jié)合人工林經(jīng)營模型特征,構(gòu)建模型庫關(guān)系模式(王珊等, 2006),并使用關(guān)系型數(shù)據(jù)庫(本研究使用SQL Server2008數(shù)據(jù)庫)存儲2種方式表示的模型。關(guān)系模式如下:
模型表(模型編號、模型名稱、模型分類、模型形式、樹種名、適用地區(qū)、模型描述、模型代數(shù)表達式、模型程序包存放地址、模型變量名列表、模型作者姓名、所屬國家、作者電子郵件、最后更新時間,備注);
模型調(diào)用記錄表(模型編號、調(diào)用日期、調(diào)用用戶編號、模型輸出結(jié)果、備注)。
模型表用于對模型全方位表述,其中,模型分類: 模型分類的名稱(按表1中模型分類名稱進行分類); 模型形式: 包括“數(shù)據(jù)表示”和“程序表示”2種; 模型代數(shù)表達式: 若模型形式為“數(shù)據(jù)表示”,則填寫模型由數(shù)學方程式公式改寫的公式字符串表達式,否則為空; 模型程序包存放地址: 如果模型形式為“程序表示”,則存儲模型程序包存放的相對路徑,否則為空; 樹種名: 代表此模型適用于具體哪種樹種; 模型變量名列表: 模型中的變量英文字符,用逗號分隔; 備注: 說明模型適合條件。
模型調(diào)用記錄表用于記錄模型的使用記錄,以方便對模型使用進行分析。表中調(diào)用用戶編號為模型調(diào)用中系統(tǒng)用戶編號,模型輸出結(jié)果記錄每次調(diào)用模型產(chǎn)生的結(jié)果。
表2所示為部分人工林經(jīng)營所需要的模型具體存儲示例,系統(tǒng)管理員可以根據(jù)需要修改、增加、刪除模型。
表2 模型表中的存儲示例Tab.2 Sample storage in a model table
針對數(shù)據(jù)表示和程序表示2種模型,前者通過規(guī)定模型表達式的基本語法規(guī)則,使用詞法分析、語法分析、語義分析和表達式計算實現(xiàn)解析過程; 后者使用R語言對模型進行實現(xiàn),通過Rsession調(diào)用R程序包實現(xiàn)模型計算。設(shè)計模型解析流程如圖1所示。在解析流程中,首先根據(jù)傳入的模型ID去模型庫中查詢具體模型,然后調(diào)出模型信息,判斷模型是數(shù)據(jù)表示模型還是程序表示模型,若為數(shù)據(jù)表示模型,則進入程序數(shù)據(jù)解析流程,反之進行程序模型解析流程。
1.3.1 “數(shù)據(jù)表示”模型解析 1) 詞法分析 詞法分析是讀取字符串形式的模型表達式,并將其分成一個個獨立的詞法單元token,如數(shù)字、操作符或函數(shù)等,構(gòu)成單詞符號序列token流。以內(nèi)蒙古赤峰市華北落葉松在立地質(zhì)量為優(yōu)時平均高模型表達方程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流進行識別并判斷其是否存在語法錯誤,如操作數(shù)個數(shù)是否符合、左右括號是否匹配等。本研究采用上下文無關(guān)(context free grammar,CFG)文法對其進行語法分析。
以華北落葉松在立地質(zhì)量為優(yōu)時平均高模型表達方程20.597*[1-exp(-0.055*t)]^1.344 為例,該模型的文法G1包含以下產(chǎn)生式:
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代表算數(shù)表達式,i為數(shù)字或變量標識符。
語法分析樹如圖3所示。語法樹根節(jié)點為開始符E,葉節(jié)點為終結(jié)點。通過自頂向下的語法分析算法對語法樹進行遍歷,并最終判斷語法的正確性,從而檢驗方程式表達式的正確性。
圖3 語法分析樹Fig.3 Parse tree
3) 語義分析與模型計算 語義分析是在語法分析基礎(chǔ)上進一步對模型表達式的運算對象進行邏輯檢查,如除數(shù)不能為0等; 同時利用逆波蘭式進行模型表達式計算。通過構(gòu)建存儲器和符號棧,存儲數(shù)據(jù)和操作符。存儲器從左向右存儲數(shù)據(jù),而符號棧遵循先進后出的原則,從左向右掃描模型表達式生成逆波蘭式,從而計算逆波蘭表達式,完成模型計算。
4) 模型解析核心流程實現(xiàn) 基于以上研究,數(shù)據(jù)表示模型解析核心流程實現(xiàn)包括詞法分析、語法分析和模型計算。具體實現(xiàn)如下:
①詞法分析函數(shù): LexicalAnalysis(String modelstring),輸入的是模型公式字符串,返回的是單詞符號序列Map;
②語法分析函數(shù): GrammaAnalysis(Map tokenmap),輸入的是單詞符號序列Map,返回的是Boolean值(公式是否有語法錯誤,沒有返回true,有返回false);
③ 步驟①、②是對模型公式正確性進行校驗,如返回true,則使用Java的ExpressionEvaluator類的eval方法對模型公式進行計算; 如返回false,則提示錯誤信息。
1.3.2 “程序表示”模型解析 程序包式模型類似于黑盒模式,直接輸入模型參數(shù)值,調(diào)用程序輸出結(jié)果即可完成模型計算。本研究將此類模型封裝在R語言程序包(王斌會, 2014)中,使用Rserver的Rsession對象調(diào)用封裝好的程序包。程序表示模型解析核心流程實現(xiàn)如下:
① 從模型表的模型讀取程序包存放地址字段,通過RserverConf對象連接Rserver服務器,獲取存儲在Rserver服務器上的模型程序包。
② 使用Rsession對象解析模型程序包,將參數(shù)代入。
③ 使用Rsession對象中的eval方法計算模型結(jié)果返回。
方法是指在自然科學領(lǐng)域中所采用的基本算法和過程,如圖4所示,包括基本數(shù)學方法、統(tǒng)計學習方法、優(yōu)化方法和預測方法等。目前常用的做法是將方法嵌入業(yè)務程序中,但該做法會增加方法維護管理的復雜度。為了將方法代碼和業(yè)務代碼解耦,引入Rserver和Rsession將方法代碼用R語言實現(xiàn)并封裝。
為了方便對方法庫的方法進行管理和調(diào)用,決策支持系統(tǒng)中的方法庫由方法程序庫和方法描述表組成。方法程序庫以文件形式存儲方法程序塊,方法描述表存儲方法描述信息,采用關(guān)系型數(shù)據(jù)庫的關(guān)系存儲。
2.2.1 基于R語言的方法程序庫設(shè)計 統(tǒng)計學習方法是人工林經(jīng)營模型生成和更新的常用方法,本研究以林業(yè)常用回歸方法為例,采用R語言依次對方法進行程序包開發(fā),并將方法程序以R執(zhí)行文件形式保存。每種方法生成一個R語言程序包,存儲在對應的文件夾下,具體如表3所示。
2.2.2 方法描述表設(shè)計 為了方便對方法庫的方法進行管理和調(diào)用,方法描述表中需要存儲方法的描述信息和方法程序包的調(diào)用地址。另外,為了記錄方法庫的使用情況,需設(shè)置一種方法調(diào)用記錄表。具體表的關(guān)系模式如下:
方法描述表(方法編號、方法名、方法說明、參數(shù)組成、輸出值類型、是否方法組合、組合方式、組合編號、組合方法執(zhí)行順序號、程序包路徑、備注);
方法調(diào)用記錄表(方法編號、調(diào)用日期、方法輸入數(shù)據(jù)、方法輸出結(jié)果、備注)。
在方法描述表中,程序包路徑字段存放R語言程序包的路徑,方法被調(diào)用時,系統(tǒng)會根據(jù)該路徑去獲取方法程序包運行。
圖4 方法庫中的方法模塊Fig.4 Method module diagram in method library
表3 基于R語言的方法程序①Tab.3 A list of methods programs based on the R language
續(xù)表3 Continued
① “—”表示此內(nèi)容本研究暫未涉及。“—”indicates that this study is not yet relevant.
方法庫中各方法使用R語言程序進行封裝,通過Rserver服務器進行發(fā)布,并將方法的描述存入關(guān)系型數(shù)據(jù)庫中,調(diào)用通過Rsession完成,如圖5所示。
方法解析流程是查找方法運行計算結(jié)果的過程。首先根據(jù)傳入的方法ID去方法庫中查詢具體方法,然后調(diào)出方法信息,提出方法程序包,將實參輸入,使用Rsession調(diào)用并執(zhí)行程序包文件,計算出結(jié)果后將結(jié)果轉(zhuǎn)化為標準數(shù)據(jù)傳輸格式輸出。具體的方法解析流程如圖6所示。
圖5 方法庫調(diào)用示意Fig.5 Method call diagrammatic sketch
圖6 方法解析流程Fig.6 Method call flow diagram
圖7 模型與方法庫平臺系統(tǒng)結(jié)構(gòu)Fig.7 The model library and method library management system structure
為了滿足模型與方法的統(tǒng)一管理,并實現(xiàn)面向大眾和應用的模型與方法服務,設(shè)計模型與方法庫平臺的系統(tǒng)結(jié)構(gòu)。如圖7所示,模型庫與方法庫系統(tǒng)分別提供了基于API調(diào)用的接口服務和用戶使用界面,前者為人工林經(jīng)營決策支持系統(tǒng)提供模型管理、計算與方法管理、運算服務, 后者為系統(tǒng)使用者提供模型查詢計算與方法查詢計算功能。另外,模型庫和方法庫管理系統(tǒng)之間設(shè)計中間件,實現(xiàn)對模型庫的更新。
模型與方法庫平臺系統(tǒng)原型的研建使用Java EE、Spring MVC、Hibernate、Jquery與Bootstrap等技術(shù)開發(fā)實現(xiàn),模型與方法的調(diào)用使用基于HTTP協(xié)議構(gòu)建的API。系統(tǒng)技術(shù)架構(gòu)如圖8所示。
圖8 系統(tǒng)技術(shù)架構(gòu)Fig.8 Technical architecture of subsystem
模型與方法庫平臺系統(tǒng)結(jié)構(gòu)采用獨立的2種方式(API和界面)調(diào)用模型與方法,無論是以API方式還是以界面方式調(diào)用模型與方法,都需要提供查詢和計算功能。實現(xiàn)這2種方式,必須有良好的數(shù)據(jù)交互結(jié)構(gòu),因此設(shè)計面向服務的統(tǒng)一數(shù)據(jù)交互結(jié)構(gòu)是實現(xiàn)模型與方法服務模型的基礎(chǔ)。本研究在模型與方法基本結(jié)構(gòu)的基礎(chǔ)上,利用符號化表達法以及標準數(shù)據(jù)傳輸結(jié)構(gòu),設(shè)計模型調(diào)用和方法調(diào)用過程中的數(shù)據(jù)傳輸格式。
1) 模型調(diào)用過程中數(shù)據(jù)傳輸格式 調(diào)用模型庫中的模型時,數(shù)據(jù)傳輸格式采用符號化方法對模型進行表達,格式如下:
ForestryModel=(ModelDic,ModelDes,ModelResult,Time)。
式中:ModelDic是模型基本描述信息; ModelDes是模型具體信息; ModelResult是模型計算結(jié)果; Time是模型調(diào)用時間。
ModelDic=(ModelId,ModelName,ModelClassName,ModelForm,ModelTreeName,ModelArea,ModelExplain,ModelAuthors,Country,Email,Remark)。
式中:ModelId∈Integer是系統(tǒng)內(nèi)部定義的模型編號;ModelName∈String是模型名稱;ModelClassName∈String是模型類別名稱;ModelForm∈String是模型形式(數(shù)據(jù)表示、程序表示);ModelTreeName∈String是模型適合的樹種名稱;ModelArea∈String是模型適合的地區(qū)名稱;ModelExplain∈String是對模型的解釋說明;ModelAuthors∈String是模型作者;Country∈String是模型作者所在國家;Email∈String是作者郵件地址;Remark∈String是模型表述的備注信息。
ModelDes=(ModelId,ModelAlgebraicExpression,ModelParams,Remark)。
式中:ModelId∈Integer是系統(tǒng)內(nèi)部定義的模型編號;ModelAlgebraicExpression∈String是模型的代數(shù)表達式(如果模型使用的是程序包,則填“無”,并在Remark中填入“程序包”);ModelParams∈String是模型的自變量參數(shù)列表;Remark∈String是模型表述的備注信息。
ModelResult∈String,是模型調(diào)用后的結(jié)果。
Time∈Date,是模型調(diào)用時的時間戳。
基于以上分析,使用輕量級數(shù)據(jù)交換格式JSON(JavaScript Object Notation)作為數(shù)據(jù)傳輸格式。定義模型調(diào)用的數(shù)據(jù)傳輸格式如下:
{"ForestryModel":
"ModelDic":{ ∥模型基本描述信息
"ModelId":"XXX", ∥模型編號
"ModelName":"XXX", ∥模型名稱
"ModelClassName":"XXX", ∥模型類別名稱
"ModelTreeName":"XXX", ∥模型適用樹種名稱
"ModelArea":"XXX", ∥模型使用地區(qū)名稱
"ModelExplain":"XXX", ∥模型解釋說明
"ModelAuthors":"XXX”, ∥模型作者
"Country":"XXX", ∥作者所在國家
"Email":"XXX", ∥作者Email
"Remark":"XXX" ∥模型備注信息
},
"ModelDes":{ ∥模型具體信息
"ModelId":"XXX", ∥模型編號
"ModelAlgebraicExpression": "XXX", ∥模型代數(shù)表達式
"ModelParams":"XXX", ∥模型自變量參數(shù)列表
"Remark":"XXX" ∥模型具體信息備注
},
"ModelResult":"XXX", ∥模型計算結(jié)果
"Time":"XXX" ∥模型調(diào)用時間戳
}
2) 方法調(diào)用過程中數(shù)據(jù)傳輸格式 調(diào)用方法庫中的方法時,數(shù)據(jù)傳輸格式采用采用符號化方法對方法進行表達,格式如下:
ForestryAlgorithm=(AlgorithmDic,AlgorithmDes,AlgorithmResult,Time)。
式中:AlgorithmDic是方法基本描述信息; AlgorithmDes是方法具體信息; AlgorithmResult是方法計算結(jié)果; Time是方法調(diào)用時間。
AlgorithmDic=(AlgorithmId,AlgorithmName,AlgorithmExplain,AlgorithmParams,AlgorithmOutputType,IsGroup,GroupType,Remark)。
式中:AlgorithmId∈Int是系統(tǒng)內(nèi)部定義的方法編號;AlgorithmName∈String是方法名稱;AlgorithmExplain∈String是對方法的解釋說明;AlgorithmParams∈String是方法輸入?yún)?shù)列表;AlgorithmOutputType∈String是方法輸出結(jié)果說明(數(shù)值型/代數(shù)表達式型);IsGroup∈String說明方法是以組合形式運行還以單個方法運行;GroupType∈String代表方法的組合方式[串聯(lián): N1,N2…Nn/并聯(lián): N1,N2…Nn/(Ni代表方法編號)];Remark∈String是方法表述的備注信息。
AlgorithmDes=(AlgorithmId,Remark)。
式中:AlgorithmId∈Int是系統(tǒng)內(nèi)部定義的方法編號;Remark∈String是方法表述的備注信息。
AlgorithmResult∈String,是方法調(diào)用后的結(jié)果。
Time∈Date,是方法調(diào)用時的時間戳。
方法庫調(diào)用的數(shù)據(jù)傳輸格式參照模型調(diào)用的數(shù)據(jù)傳輸格式生成,具體如下:
{"ForestryAlgorithm":
"AlgorithmDic":{ ∥方法基本描述信息
"AlgorithmId":"XXX", ∥方法編號
"AlgorithmName":"XXX", ∥方法名稱
"AlgorithmExplain":"XXX", ∥方法解釋說明
"AlgorithmParams":"XXX", ∥方法參數(shù)說明
"AlgorithmOutputType":"XXX", ∥方法輸出結(jié)果說明
"IsGroup":"XXX", ∥是否為組合方法
"GroupType":"XXX" ∥組合方式
"Remark":"XXX" ∥方法備注信息
},
"AlgorithmDes":{ ∥方法具體信息
"AlgorithmId":"XXX", ∥方法編號
"AlgorithmURL":"XXX", ∥方法程序包存放地址
"Remark":"XXX" ∥方法具體備注信息
},
"AlgorithmResult":"XXX", ∥方法運算結(jié)果
"Time":"XXX" ∥方法調(diào)用時間戳
}
當模型和方法庫平臺與其他應用系統(tǒng)或平臺界面進行數(shù)據(jù)交互時,使用以上定義好的數(shù)據(jù)交互格式可以提高調(diào)用的規(guī)范化和便捷性。
平臺使用SQLServer2008數(shù)據(jù)庫實現(xiàn)模型(圖9)與方法(圖10)的存儲,目前存儲了廣西、福建等在內(nèi)的人工林胸徑、斷面積、樹高、蓄積、地位指數(shù)、林分密度指數(shù)等生長收獲模型以及各種線性與非線性擬合方法等。平臺可提供API調(diào)用和友好的用戶使用界面功能2種服務方式: API接口是為人工林經(jīng)營輔助決策等業(yè)務系統(tǒng)提供模型、方法調(diào)用服務的,業(yè)務系統(tǒng)通過HTTP請求的方式,用GET或POST方法向平臺發(fā)送請求,平臺計算出結(jié)果后將其轉(zhuǎn)換為統(tǒng)一數(shù)據(jù)交互結(jié)構(gòu)返回給業(yè)務系統(tǒng); 友好的用戶使用界面為用戶提供模型、方法基本信息的查詢、調(diào)用說明以及模型計算等功能。本研究以福建某國有林場人工林林分收獲模擬過程為應用場景,說明模型的計算調(diào)用運行過程; 以地位指數(shù)方程的擬合構(gòu)建為例,說明非線性擬合方法的計算調(diào)用運行過程。
以福建杉木(Cunninghamialanceolata)全林分平均胸徑模型調(diào)用計算為例,分別通過API和頁面2種調(diào)用方式給出模型庫調(diào)用實例。
1) API調(diào)用 調(diào)用福建杉木全林分平均胸徑模型,地位指數(shù)為18,林分密度為2 000株·hm-2,預估10、15、20、25、30林齡的林分平均胸徑,模型調(diào)用說明如表4所示,整理計算機結(jié)果如表5所示。
圖9 模型表存儲實例Fig.9 Model table storage
表4 模型API調(diào)用說明Tab.4 Model API call description
表5 杉木人工林林分平均胸徑模擬(SI=18)Tab.5 Simulation of mean BDH of Chinese fir plantation(SI=18)
2) 頁面調(diào)用 與API調(diào)用對應,使用頁面調(diào)用福建杉木人工林全林分平均胸徑模型,地位指數(shù)為18,林分密度為2 000株·hm-2,預估10、15、20、25、30林齡的林分平均胸徑。調(diào)用時,進入如圖11所示福建杉木人工林全林分平均胸徑模型計算交互頁面,在模型計算對話框中輸入地位指數(shù): 18,密度: 2 000,林齡: 10、15、20、25、30,點擊“調(diào)用計算”按鈕即可得到計算結(jié)果。
以福建杉木地位指數(shù)方程擬合為例,使用Richards理論生長方程作為原型,采用代數(shù)差分法構(gòu)建地位指數(shù)方程。
1) API調(diào)用 選擇以a為自由參數(shù)對Richards理論生長方程進行變換得到公式: HT2~HT1*{{[1-exp(-b*T2)]/[1-exp(-b*T1)]}^c},使用來自福建省兩期固定復測樣地(212塊)數(shù)據(jù)對以上公式進行擬合,其中,T1為第1期的林齡,HT1為第1期的優(yōu)勢木高,T2為第2期的林齡,HT2為第2期的優(yōu)勢木高。數(shù)據(jù)示例如表6所示。
表6 固定復測樣地林齡與優(yōu)勢木高數(shù)據(jù)示例Tab.6 Fixed re-test sample forest age and superior wood height data
調(diào)用非線性回歸方法,參數(shù)分別為擬合公式formula=‘HT2~HT1*{{[1-exp(-b*T2)]/[1-exp(-b*T1)]}^c}’;b=0.105 636,c=1.139 241 (初始參數(shù)值);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,…; 不同參數(shù)之間以&符號隔開; 平臺擬合后將結(jié)果返回。具體調(diào)用說明如表7所示。
表7 方法API調(diào)用說明Tab.7 Method API call description
其他非線性擬合方法調(diào)用與表7中的調(diào)用方式類似,用戶可根據(jù)擬合的返回結(jié)果判斷擬合效果,選擇擬合效果好的模型補充到模型表中。
2) 頁面調(diào)用 采用與API調(diào)用同樣的應用場景,使用頁面的方式調(diào)用非線性回歸方法。 在方法庫頁面中選擇非線性回歸方法,將數(shù)據(jù)寫入如圖12所示的擬合數(shù)據(jù)文件(文件為Excel類型),然后點擊“上傳數(shù)據(jù)文件”按鈕,將填寫好的數(shù)據(jù)文件上傳; 在圖13的參數(shù)對話框中分別填寫擬合公式和初始參數(shù)值。平臺進行擬合,擬合結(jié)果返回,如圖13的頁面顯示。
圖12 方法調(diào)用擬合數(shù)據(jù)模板Fig.12 Method call fitting data template
圖13 方法調(diào)用接口說明界面Fig.13 Method call interface description interface
本研究應用關(guān)系型數(shù)據(jù)庫結(jié)合R語言程序封裝方法構(gòu)建了通用性強的模型庫和方法庫,采用數(shù)據(jù)表示法和程序表示法分別表達人工林經(jīng)營中數(shù)學公式型模型和程序塊型模型,針對數(shù)據(jù)表達的模型,使用詞法分析、語法分析、語義分析等方法實現(xiàn)模型的解析計算,針對程序表達的模型,利用Rsession實現(xiàn)程序模型的調(diào)用計算,同時利用Rsession實現(xiàn)對方法庫中方法的管理和調(diào)用,實現(xiàn)了模型、方法的管理更新與業(yè)務代碼的分離,降低了模型、方法的管理和使用復雜度。通過構(gòu)建數(shù)據(jù)交互結(jié)構(gòu),為實現(xiàn)模型庫與方法庫的API調(diào)用奠定了基礎(chǔ),使模型庫與方法庫具備了面向用戶的界面使用服務與程序級調(diào)用服務功能。