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