專利名稱:一種作物生長模型描述與解釋方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種基于PC的虛擬作物生長系統(tǒng),特別涉及虛擬作物生長系統(tǒng)中作物生長模型的描述與解釋方法。
背景技術(shù):
作物生長模型作為一種農(nóng)學(xué)知識,是農(nóng)學(xué)專家在田間試驗等基礎(chǔ)上經(jīng)過經(jīng)驗總結(jié)、歸納演繹得到的。其基本表現(xiàn)形式是描述作物生長形態(tài)變化與作物先天因素以及環(huán)境因素規(guī)律的農(nóng)學(xué)公式、過程描述和邏輯說明。這些知識的組織和表達(dá)是建立在研究人員交流、學(xué)習(xí)和研究的基礎(chǔ)上的,無法被計算機直接處理。
在構(gòu)建虛擬作物生長系統(tǒng)中,作物生長模型是系統(tǒng)的知識基礎(chǔ)。這就要求有一種方法將作物生長模型輸入到計算機中,并對其做出相應(yīng)的處理,成為系統(tǒng)的組成部分。傳統(tǒng)的做法是,根據(jù)作物生長模型知識編制相應(yīng)的程序模塊,作為系統(tǒng)一個不可分割的部分。其基本構(gòu)建步驟如圖1所示,主要工作包括1、農(nóng)學(xué)專家提供農(nóng)學(xué)知識;2、軟件開發(fā)人員理解農(nóng)學(xué)知識;3、軟件人員建立作物器官的形態(tài)模型、行為模型;4、在理解農(nóng)學(xué)知識的基礎(chǔ)上,軟件人員將這些知識以程序模塊的形式置入系統(tǒng)以驅(qū)動虛擬作物生長;5、軟件人員集成各個模塊形成虛擬作物生長系統(tǒng)。
這一構(gòu)建方式主要有兩個方面的問題第一、農(nóng)學(xué)知識對于計算機人員來說,復(fù)雜難于理解,但又不得不花費大量的精力理解這些知識,因為這些知識是構(gòu)建虛擬作物生長系統(tǒng)的基礎(chǔ)。第二、由于農(nóng)學(xué)知識已經(jīng)作為一個模塊集成到系統(tǒng)中了,當(dāng)農(nóng)學(xué)知識發(fā)生變化時,必須對系統(tǒng)進(jìn)行修改或重構(gòu)以適應(yīng)變化,如修改則存在許多重復(fù)性工作。
發(fā)明內(nèi)容
鑒于以上構(gòu)建虛擬作物生長系統(tǒng)中出現(xiàn)的不足,本發(fā)明的目的在于提出一種基于PC的虛擬作物生長系統(tǒng)中的作物生長模型描述與解釋方法,即用XML描述作物生長模型,并構(gòu)建出基于該描述的解釋系統(tǒng)。
本發(fā)明虛擬作物生長系統(tǒng)中的作物生長模型描述與解釋方法包括以下基本步驟1)用可擴展標(biāo)記語言XML描述農(nóng)作物生長模型,以如下方式進(jìn)行(1)以普通變量的方式,描述農(nóng)作物生長模型所引用的數(shù)據(jù),即①采用XML標(biāo)記VarDeclare標(biāo)示出普通變量申明區(qū)域;②采用XML標(biāo)記Var,結(jié)合標(biāo)記屬性Name、Type,描述一個申明的普通變量;③采用XML標(biāo)記VarArray,結(jié)合子標(biāo)記Name、Size以及屬性Type,描述一個申明的數(shù)組變量。
(2)以數(shù)據(jù)庫變量的方式,包括簡單數(shù)據(jù)庫變量和復(fù)雜數(shù)據(jù)庫變量兩種方式,描述作物生長模型中所引用的存放于數(shù)據(jù)庫的數(shù)據(jù),即①采用XML標(biāo)記SimpleDBVarDeclare標(biāo)示出簡單數(shù)據(jù)庫變量申明區(qū)域;②采用XML標(biāo)記ComplexDBVarDeclareType標(biāo)示出復(fù)雜數(shù)據(jù)庫變量申明區(qū)域
③采用XML標(biāo)記DBTable,結(jié)合標(biāo)記屬性DBName、AcquireValueBy,描述數(shù)據(jù)庫變量與關(guān)系數(shù)據(jù)庫中相應(yīng)關(guān)系之間的聯(lián)系;④采用XML標(biāo)記DBVar,結(jié)合標(biāo)記屬性DBName、Type,描述一個申明的數(shù)據(jù)庫變量;(3)采用三種運算結(jié)構(gòu)描述生長模型中所包含的數(shù)學(xué)公式,即①采用初等解析函數(shù)及初等運算的運算結(jié)構(gòu),使用XML標(biāo)記Express,描述簡單解析表達(dá)式;②采用選擇運算的運算結(jié)構(gòu),使用XML標(biāo)記If,結(jié)合標(biāo)記屬性bexpress以及子標(biāo)記Then、Else,組合Express描述的簡單表達(dá)式,描述分段式解析表達(dá)式;③采用迭代運算的運算結(jié)構(gòu),使用XML標(biāo)記While,結(jié)合標(biāo)記屬性bexpress,組合Express描述的簡單表達(dá)式,描述迭代式解析表達(dá)式;(4)采用器官類型定義腳本描述作物器官形態(tài),即①采用XML標(biāo)記Org標(biāo)示出一個作物器官類型;②采用XML標(biāo)記Properties標(biāo)示出作物器官類型屬性定義區(qū)域;③采用XML標(biāo)記Proper描述該類型作物器官所包含的屬性;④采用XML標(biāo)記Register_event標(biāo)示出作物器官類型事件定義區(qū)域;⑤采用XML標(biāo)記Event描述該類型作物器官所支持的事件;⑥采用XML標(biāo)記Register_properties標(biāo)示出事件驅(qū)動變量定義區(qū)域;⑦采用XML標(biāo)記Proper,結(jié)合子標(biāo)記Seq、Event_code和Proper_value,描述一個申明的事件驅(qū)動變量。
(5)采用循環(huán)過程描述生長模型中的生長過程部分,即①采用XML標(biāo)記GrowProcess標(biāo)示出作物生長過程描述部分;
②采用XML標(biāo)記While描述表征作物生長過程的循環(huán)過程;2)構(gòu)建基于生長模型XML描述腳本的解釋系統(tǒng),在讀取了生長模型描述腳本、在計算機內(nèi)存中建立文檔模型樹并開始對其做遍歷處理之后,以如下方式進(jìn)行(1)利用觀察者模式,使用不同類型的處理器對象,處理生長模型XML描述腳本的不同部分,即①用數(shù)據(jù)庫信息節(jié)點處理器(VDatabase)處理數(shù)據(jù)庫信息節(jié)點,在獲取信息節(jié)點中包含的數(shù)據(jù)庫驅(qū)動程序信息、數(shù)據(jù)庫位置信息、數(shù)據(jù)庫訪問賬號信息之后,使用這些信息建立到數(shù)據(jù)庫的連接;②用變量定義信息節(jié)點處理器(VVariableProcess)處理變量定義信息節(jié)點,從中提取出與變量定義相關(guān)的信息,如變量標(biāo)示、變量名、變量初值等,利用這些信息建立變量對象,然后將變量對象存儲于變量緩沖區(qū)中;③用變量定義信息節(jié)點處理器(VVariableProcess)處理對象型變量定義信息節(jié)點,從中提取與對象型變量定義相關(guān)的信息,如變量標(biāo)示、對象類型、變量名等,然后查詢器官類型定義腳本確認(rèn)存在該對象類型,最后用這些信息利用VOrg類建立器官變量對象存儲與變量緩沖區(qū)中;④用器官依賴關(guān)系信息節(jié)點處理器(VOrgProcess)處理器官依賴關(guān)系信息節(jié)點;⑤用生長過程信息節(jié)點處理器(VGrowProcess)處理生長過程描述信息節(jié)點。
(2)檢測事件驅(qū)動變量的改變,產(chǎn)生作物生長序列碼,即①按照{(diào)事件碼,針對的器官id,參數(shù)個數(shù),參數(shù)...}的格式用序列碼表征虛擬作物生長系統(tǒng)中的對象方法調(diào)用;
②用觀察者模式檢測事件驅(qū)動變量的變化,在該類型變量的值發(fā)生變化時結(jié)合器官類型定義腳本產(chǎn)生表達(dá)該變化的序列碼。
從以上構(gòu)建步驟可以看出,這種改進(jìn)的構(gòu)建方式可以帶來以下好處1、免除軟件人員學(xué)習(xí)理解農(nóng)學(xué)知識的負(fù)擔(dān),使其專注于作物器官組件的開發(fā)。
2、當(dāng)農(nóng)學(xué)知識發(fā)生變化時,只需要對表示這些知識的腳本進(jìn)行修改,對生長模型重新進(jìn)行解釋,系統(tǒng)可以自動展現(xiàn)出新的虛擬作物生長過程,不會給開發(fā)人員帶來任何額外負(fù)擔(dān)。
3、農(nóng)學(xué)知識不會對農(nóng)學(xué)專家以外的人員暴露,有利于農(nóng)學(xué)知識的產(chǎn)權(quán)保護(hù)。
4、大大減少了開發(fā)過程中農(nóng)學(xué)專家和軟件開發(fā)人員的交流代價。
采用本發(fā)明進(jìn)行虛擬作物生長系統(tǒng)構(gòu)建,要求農(nóng)學(xué)專家能夠按照生長模型描述XML腳本大綱,對農(nóng)學(xué)知識進(jìn)行類似程序的組織。這種方式的描述比編制程序簡單的多,而且由于組件開發(fā)工作由軟件開發(fā)人員完成,使得農(nóng)學(xué)專家不需要掌握計算機圖形學(xué)、虛擬現(xiàn)實技術(shù)及面向?qū)ο缶幊谭椒ǖ葟?fù)雜的計算機技術(shù)即可自行利用該系統(tǒng)完成一個虛擬作物生長過程的展示。
圖1為虛擬作物生長系統(tǒng)的傳統(tǒng)構(gòu)建方式;圖2為本發(fā)明構(gòu)建虛擬作物生長系統(tǒng)的方式;圖3為作物生長模型描述XML大綱基本結(jié)構(gòu);圖4為普通變量及數(shù)據(jù)庫變量申明描述XML大綱;圖5為語句類型申明描述XML大綱;圖6為器官類型定義XML大綱基本結(jié)構(gòu);
圖7為作物生長模型解釋系統(tǒng)基本結(jié)構(gòu);圖8為解釋處理對象的觀察者結(jié)構(gòu);圖9為器官對象在解釋系統(tǒng)中的創(chuàng)建過程圖;圖10為解釋系統(tǒng)序列碼產(chǎn)生過程。
具體實施例方式
以下結(jié)合附圖對本發(fā)明作更詳細(xì)的說明。
參見圖2,本發(fā)明改進(jìn)了虛擬作物生長系統(tǒng)的構(gòu)建方式。采用本發(fā)明構(gòu)建虛擬作物生長系統(tǒng)的基本步驟為1、計算機人員開發(fā)作物器官組件,形成作物器官組件庫,同時產(chǎn)生器官類型定義腳本;2、農(nóng)學(xué)人員按照生長模型描述XML腳本大綱,采用XML以及使用相應(yīng)的器官類型對象,描述出虛擬作物的生長模型;3、解釋系統(tǒng)解釋生長模型腳本產(chǎn)生一系列系統(tǒng)序列碼;4、系統(tǒng)將序列碼映射為作物器官組件對象的方法調(diào)用,使該對象發(fā)生形態(tài)變化,從而形成虛擬作物生長過程。
一、利用XML腳本描述作物生長模型方法的具體實施參見圖3所示,本發(fā)明采用XML腳本來對作物生長模型進(jìn)行描述。本發(fā)明將作物生長模型的XML描述腳本結(jié)構(gòu)上分為五個部分作物全局信息描述(Description)、對所需的數(shù)據(jù)庫的配置信息描述(DBSettings)、變量申明描述(SimpleDBVarDeclare、ComplexDBVarDeclare以及VarDelcare)、器官鏈接描述(OrgLink)、生長過程描述(GrowProcess),通過這幾個部分構(gòu)成對一個作物植株生長模型的完整XML腳本描述大綱。農(nóng)學(xué)專家根據(jù)該大綱即可用XML對作物生長模型進(jìn)行描述,得到作物生長模型的XML描述腳本。
為了得到該XML腳本大綱,本發(fā)明提出了一種用XML描述作物生長模型的方法,包括用XML描述作物生長模型方法的定義技術(shù)和用XML描述作物生長模型方法中的運算描述技術(shù)兩部分。
1、用XML描述作物生長模型方法的定義技術(shù)針對作物生長模型描述腳本的各個部分及作物生長模型的特征,本發(fā)明提出了一種具體的利用XML腳本來描述作物生長模型中使用的數(shù)據(jù)、對象和基本過程的定義方法。該方法主要由三個部分組成變量申明定義、語句類型定義、器官類型定義。農(nóng)學(xué)專家利用這三個部分所提供的描述方法就可實現(xiàn)對具體的作物生長模型的基本描述。
1)變量申明定義變量申明的XML大綱如圖4所示。
本發(fā)明提出了一種變量符號描述及申明機制,使得農(nóng)學(xué)專家可以自己使用計算機進(jìn)行符號定義,從而避免了計算機人員對農(nóng)業(yè)中專業(yè)術(shù)語的理解工作。
本發(fā)明將變量分為普通變量和數(shù)據(jù)庫變量兩類。普通變量類似于計算機編程語言中的變量定義,本發(fā)明將其類型分為int、double、string三種類型。數(shù)據(jù)庫變量是用來獲取數(shù)據(jù)庫中數(shù)據(jù)的變量,通過采用數(shù)據(jù)庫變量就使農(nóng)學(xué)專家能像使用普通變量一樣使用數(shù)據(jù)庫中的數(shù)據(jù),使數(shù)據(jù)庫的訪問對農(nóng)學(xué)專家透明。數(shù)據(jù)庫變量又分為簡單數(shù)據(jù)庫變量和復(fù)雜數(shù)據(jù)庫變量。對于簡單數(shù)據(jù)庫變量,數(shù)據(jù)庫對應(yīng)于該變量只含有單一數(shù)據(jù);對于復(fù)雜數(shù)據(jù)庫變量,數(shù)據(jù)庫對應(yīng)于該變量含有一組數(shù)據(jù)即一個數(shù)據(jù)集合。簡單數(shù)據(jù)庫變量與復(fù)雜數(shù)據(jù)庫變量在變量的描述結(jié)構(gòu)上完全相同,只在變量申明時采用不同的符號對其進(jìn)行描述。
普通變量的申明包括單個變量與變量數(shù)組申明,具體地可采用一套XML標(biāo)記如VarDeclare、Var、Name、Type等來對普通變量進(jìn)行申明,對變量數(shù)組的申明時要提供數(shù)組名、數(shù)組的大小。利用這一套XML標(biāo)記,一個具體的普通變量申明可如下例所示<VarDeclare>
<Var Type=″double″>ts</Var>
<VarArray type=″double″>
<Name>Temp</Name>
<Size>
<Express>8</Express>
</Size>
</VarArray>
</VarDeclare>
即申明了一個名為“ts”的double型變量和一個名為“Temp”的double型的變量數(shù)組,數(shù)組大小為8即該數(shù)組包含8個數(shù)據(jù)元素。
對于簡單數(shù)據(jù)庫變量,具體地可采用一套XML標(biāo)記如SimpleDBVarDeclare、DBTable、DBVar等來申明,利用這一套XML標(biāo)記,一組具體的簡單數(shù)據(jù)庫變量申明可如下例所示<pre listing-type="program-listing"> <SimpleDBVarDeclare> ?。糄BTable DBName=″品種″AcquireValueBy=″where Name=’揚麥5號’″> <DBVar DBName=″ts″Type=″double″>ts</DBVar> <DBVar DBName=″PVT″Type=″int″>PVT</DBVar> <DBVar DBName=″IE″Type=″double″>IE</DBVar> <DBVar DBName=″MAXPHYLL″Type=″int″>MAXPHYLL</DBVar><dp n="d8"/> ?。糄BVar DBName=″n″Type=″int″>n</DBVar> <DBVar DBName=″PHT″Type=″int″>PHT</DBVar> ?。?!--品種特征葉齡--> ?。糄BVar DBName=″CHALN″Type=″int″>CHALN</DBVar> </DBTable> ?。?SimpleDBVarDeclare></pre>本組數(shù)據(jù)庫變量從數(shù)據(jù)庫中名為“品種″的表中獲取符合“where Name=’揚麥5號’”的一組數(shù)據(jù),該組數(shù)據(jù)根據(jù)每個數(shù)據(jù)庫變量定義的字段名(即DBName)對其進(jìn)行賦值。如本組數(shù)據(jù)庫變量中的double型變量IE即被賦予品種表中滿足“where Name=’揚麥5號’”條件的IE列的值。
對于復(fù)雜數(shù)據(jù)庫變量,具體地可采用一套XML標(biāo)記如ComplexDBVarDeclareType、DBTable、DBVar等來申明復(fù)雜數(shù)據(jù)庫變量,利用這一套XML標(biāo)記,一組具體的復(fù)雜數(shù)據(jù)庫變量申明可如下例所示<pre listing-type="program-listing"> ?。糃omplexDBVarDeclare> <!--復(fù)雜數(shù)據(jù)庫變量申明,訪問時用加上{pi}進(jìn)行訪問, 該變量本身并無值必須使用某種訪問方式來獲取值--> <DBTable DBName=″氣象″AcquireValueBy=″whereDate_Day=#pl#″> <!--取得指定天的最高氣溫--> <DBVar DBName=″Tmax″Type=″double″>CDB_Tmax</DBVar> <!--指定天的最低氣溫--> <DBVar DBName=″Tmin″Type=″double″>CDB_Tmin</DBVar> </DBTable> </ComplexDBVarDeclare></pre>
本組數(shù)據(jù)庫變量表示了從數(shù)據(jù)庫中名為“氣象”的表中獲取符合“whereDate_Day=#pl#”形式所有條件的一個數(shù)據(jù)集合。double型復(fù)雜數(shù)據(jù)庫變量CDB_Tmax根據(jù)條件獲取“氣象”表中Tmax列的值,但條件中含有形參,所以在生長模型描述過程中使用該變量時,需要提供形參pl(即哪一天)的值,即可用CDB_Tmax{i}來表示日期為i這一天的最高氣溫。
2)語句類型定義本發(fā)明語句類型的定義如圖5所示。本發(fā)明采用了表達(dá)式計算、邏輯選擇以及循環(huán)處理三種語句類型,用來實現(xiàn)器官鏈接和生長過程描述。
一個具體的語句類型定義(圖中XML標(biāo)記節(jié)點StatementType)可由描述表達(dá)式計算的普通表達(dá)式(圖中XML標(biāo)記節(jié)點Express)、描述邏輯選擇的If語句(圖中XML標(biāo)記節(jié)點If)或描述循環(huán)處理的While語句(圖中XML標(biāo)記節(jié)點While)組成。If語句是一個分支結(jié)構(gòu),它又可以嵌套各種語句類型(圖中XML標(biāo)記引用節(jié)點StatementType),While語句處理的是循環(huán),循環(huán)體內(nèi)也可以嵌套各種語句類型(圖中XML標(biāo)記引用節(jié)點StatementType)。
3)器官類型的定義參見圖6,本發(fā)明定義了一個器官類型定義腳本來描述作物器官形態(tài)知識。
本發(fā)明使用XML腳本來描述各類作物器官類型的定義,形成器官類型定義腳本。針對虛擬作物生長系統(tǒng),對作物生長模型的描述必定要涉及到作物的器官屬性改變的描述,在生長模型描述腳本中可直接將在器官類型定義腳本里定義過的器官類型作為變量類型進(jìn)行使用。
生長模型描述腳本通過訪問器官對象的屬性數(shù)據(jù)和更改器官對象的屬性數(shù)據(jù)來使用作物器官對象。本發(fā)明通過在器官類型定義腳本中提供對器官類型中包含的屬性數(shù)據(jù)的定義方法來實現(xiàn)器官對象屬性數(shù)據(jù)訪問。如圖6所示的,本發(fā)明在org節(jié)點下定義了properties節(jié)點。properties節(jié)點包含了數(shù)個Proper節(jié)點,每一個Proper節(jié)點代表了該器官類型的一個屬性,即可根據(jù)定義直接訪問各個屬性。生長模型描述腳本更改器官對象的屬性數(shù)據(jù)有兩種情況,一種情況是僅僅簡單的更改了器官對象屬性數(shù)據(jù)的值,對這種情況本發(fā)明按照賦值表達(dá)式的處理方式進(jìn)行器官對象屬性數(shù)據(jù)值的更改;另一種情況是系統(tǒng)器官對象屬性的改變并不是簡單的值的改變,還伴隨著虛擬作物生長系統(tǒng)的某一具體動作的發(fā)生,對這種情況本發(fā)明采用在器官類型定義腳本中提供能驅(qū)動事件的屬性,如圖6所示,定義了register_event和register_properties兩個節(jié)點,在器官腳本中使用register_event定義讓系統(tǒng)產(chǎn)生動作的事件,然后再使用register_properties定義產(chǎn)生該事件的驅(qū)動屬性。而seq節(jié)點則向系統(tǒng)描述了事件的發(fā)生方式以及參與事件的別的屬性。
一個具體的器官描述腳本可如下例所示<pre listing-type="program-listing"> <o(jì)rglib> ?。紀(jì)rg utID=″WHEAT_ROOT″> <description> ?。糿ame>小麥的根</name> ?。?description> <properties> <proper name=″parent″type=″int″value=″-1″/> </properties> ?。紃egister_event><dp n="d11"/> <event name=″assign_parent″/> </register_event> <register_properties> <!--指定父器官--> <proper name=″parent″> <seq> ?。糴vent_code>assign_parent</event_code> ?。紁roper_value>parent</proper_value> </seq> ?。?proper> ?。?register_properties> ?。?org> </orglib></pre>當(dāng)描述新的作物生長模型時,先在器官類型定義腳本中對其器官類型進(jìn)行定義,從而實現(xiàn)器官類型的動態(tài)可擴展,然后在生長模型描述腳本中描述生長知識對作物屬性改變的作用。
2、用XML描述作物生長模型方法中的運算描述技術(shù)1)采用三種運算結(jié)構(gòu)描述生長模型知識中所包含的數(shù)學(xué)公式本發(fā)明利用三種運算結(jié)構(gòu)來描述生長模型知識中所包含的數(shù)學(xué)公式,即初等解析函數(shù)及初等運算的運算結(jié)構(gòu)、選擇運算的運算結(jié)構(gòu)、迭代運算的運算結(jié)構(gòu),使用這三種運算結(jié)構(gòu)即可描述所有的作物生長模型公式。
1>初等解析函數(shù)及初等運算的運算結(jié)構(gòu)該運算結(jié)構(gòu)具有一次計算的特點,通過對該類表達(dá)式進(jìn)行簡單的變量分析以及基于運算符優(yōu)先關(guān)系的運算過程,即可以完成對該類公式的計算。如公式DEC=0.4093*SIN(0.0172*(DOY-82.2))。
上述公式的具體XML腳本描述可如下例所示<Express>DEC=0.4093*SIN(0.0172*(DOY-82.2))</Express>
2>選擇運算的運算結(jié)構(gòu)分段式解析表達(dá)式的運算將根據(jù)參數(shù)條件進(jìn)行選擇性運算,本發(fā)明采用If語句形式的選擇結(jié)構(gòu)。如公式 上述公式的具體XML腳本描述可如下例所示<If bexpress=″PVT≠0″>
<Then>
<Express>VP=(VD1+VD2)/PVT</Express>
</Then>
<Else>
<Express>VP=1</Express>
</Else>
</If>
3>迭代運算的運算結(jié)構(gòu)迭代式解析表達(dá)式將根據(jù)參數(shù)的條件進(jìn)行反復(fù)性的運算,本發(fā)明采用While語句形式的循環(huán)結(jié)構(gòu)。如公式DEVE(I)=[TEMP(I)-27]×0.5(Temp>27)N≤I≤M上述公式的具體XML腳本描述可如下例所示
<While bexpress=″I<=M & I>=N″>
<Express>DEVE[I]=(TEMP[I]-27)*0.5</Express>
<Express>I=I+1</Express>
</While>
2)采用循環(huán)過程描述生長模型知識中的作物生長過程部分針對虛擬作物生長系統(tǒng)中使用的生長模型特征,本發(fā)明把整個作物的生長過程看作是一個以單位時間為步長、以作物成熟或死亡為結(jié)束的循環(huán)過程,生長階段則通過邏輯條件判斷來進(jìn)行。一個具體的描述作物生長過程的腳本結(jié)構(gòu)可如下例所示<pre listing-type="program-listing"> <GrowProcess> ?。糤hile bexpress=″作物是否成熟或死亡″> <If bexpress=″進(jìn)入階段一的條件″> ?。糡hen> <!--生長階段一--> …… ?。?Then> </If> <If bexpress=″進(jìn)入階段二的條件″> <Then> <!--生長階段二--> …… ?。?Then> </If><dp n="d14"/> …… </While> </GrowProcess></pre>3、農(nóng)學(xué)專家根據(jù)本發(fā)明產(chǎn)生的XML腳本大綱來描述作物生長模型的過程根據(jù)以上1中所述用XML描述作物生長模型方法的定義技術(shù)和2中用XML描述作物生長模型方法中的運算描述技術(shù)即可以產(chǎn)生出一個具體XML腳本大綱,農(nóng)學(xué)專家即可根據(jù)該大綱來描述作物生長模型。
1)作物全局信息的描述作物全局信息的描述即對作物的總體的如名稱、種類信息的描述。一個具體作物全局信息的描述可如下例所示<!--作物全局描述信息-->
<Description>
<Name>揚麥5號</Name>
<Type>小麥</Type>
</Description>
2)對所需的數(shù)據(jù)庫的配置信息描述即對所需的數(shù)據(jù)庫的配置信息如所用數(shù)據(jù)庫驅(qū)動程序、數(shù)據(jù)源名稱、用戶名等信息進(jìn)行描述。一個具體的數(shù)據(jù)庫的配置信息描述可如下例所示<pre listing-type="program-listing"> ?。?!--數(shù)據(jù)庫配置信息描述--> ?。糄BSettings> <!--數(shù)據(jù)庫驅(qū)動程序--> <DBDriver>sun.jdbc.odbc.JdbcOdbcDriver</DBDriver> <!--數(shù)據(jù)源--><dp n="d15"/> <DBSource>VPDB</DBSource> <!--訪問賬號--> <DBUserName>xxx</DBUserName> <DBUserPWD>xxxxxx</DBUserPWD> ?。?DBSettings></pre>3)變量申明描述采用本發(fā)明所定義的變量申明方法,可申明普通變量、簡單數(shù)據(jù)庫變量、復(fù)雜數(shù)據(jù)庫變量以及器官類型對象。
一個具體的器官類型對象的申明可如下例所示<VarDeclare>
<Var type=″WHEAT_ROOT″>root</Var>
</VarDeclare>
4)器官鏈接描述即用XML腳本描述各個器官對象之間的關(guān)系,將各個器官對象聯(lián)系起來。
<!--描述各個器官之間的依賴關(guān)系(主要是父子關(guān)系)-->
<pre listing-type="program-listing"> ?。糘rgLink> <Express>100</Express> <!--根長在種子上--> <Express>root.parent=seed.id</Express> <!--第一個桿長在種子上--> <Express>stem[O].parent=seed.id</Express> <!--描述各個桿之間的依賴關(guān)系--> <Express>i=1</Express><dp n="d16"/> <While bexpress=″i<CHALN″> <Express>stem[i].parent=stem[i-1].id</Express> <Express>i=i+l</Express> </While> …………… ?。?OrgLink></pre>5)生長過程描述根據(jù)生長過程的特點,可采用本發(fā)明中提出的循環(huán)式過程,利用本發(fā)明中提出的三種運算結(jié)構(gòu)對生長模型中的數(shù)學(xué)公式進(jìn)行描述,利用本發(fā)明中定義的各種語句對生長過程進(jìn)行描述。
一個生長過程描述可如下例所示<生長過程開始>
初始化工作循環(huán)生長過程<生長過程結(jié)束>
二、基于本發(fā)明解釋方法的解釋系統(tǒng)的建立解釋系統(tǒng)用來分析描述作物生長模型的XML腳本,處理其中包含的農(nóng)學(xué)知識,然后將根據(jù)這些知識產(chǎn)生的結(jié)果以計算機可以理解的形式輸出到虛擬作物生長系統(tǒng)。
1、解釋系統(tǒng)的基本工作步驟如圖7所示,根據(jù)本發(fā)明所提出的生長模型描述腳本解釋方法,本解釋系統(tǒng)的解釋工作分為把XML腳本處理成DOM樹、數(shù)據(jù)庫配置信息讀取、變量定義處理(含器官對象定義的處理)、器官對象依賴關(guān)系運算和生長過程運算五部分。
1)對XML文檔解析在計算機內(nèi)存中形成表征了xml文檔的DOM樹,然后對DOM樹進(jìn)行遍歷訪問xml文檔中所有的信息節(jié)點。
2)數(shù)據(jù)庫配置信息讀取是指處理包含數(shù)據(jù)庫系統(tǒng)配置信息的XML節(jié)點中的信息,以獲取操作數(shù)據(jù)庫所必須的信息。
3)變量定義處理是通過處理包含變量定義信息的XML節(jié)點以獲取變量定義的信息,如變量標(biāo)識、變量類型、變量初值等信息,然后在解釋系統(tǒng)的變量池中建立相應(yīng)的變量以備運算使用。
4)器官對象依賴關(guān)系運算是指分析包含整個作物器官之間依賴關(guān)系信息的節(jié)點,執(zhí)行節(jié)點代表的運算得到設(shè)定各個器官對象關(guān)系的序列碼。
5)生長過程運算是通過對描述作物生長過程數(shù)據(jù)形態(tài)變化的運算、語句節(jié)點的執(zhí)行最終得到表征作物生長過程的序列碼。
2、采用序列碼實現(xiàn)解釋系統(tǒng)和虛擬作物生長系統(tǒng)的有機結(jié)合解釋系統(tǒng)要遵從它與虛擬作物生長系統(tǒng)之間定義的規(guī)范。該規(guī)范定義了解釋系統(tǒng)輸出的序列碼的格式,并定義了序列碼的各元素的意義。描述作物生長模型的腳本文件描述了環(huán)境、作物先天因素等數(shù)據(jù)與作物生長形態(tài)變化(時間與幾何)之間的關(guān)系,解釋系統(tǒng)則要把這種關(guān)系變成一系列的隨作物生長演化而順序執(zhí)行的虛擬作物生長系統(tǒng)器官對象的函數(shù)調(diào)用。而這些函數(shù)調(diào)用信息被組織成了一行行的調(diào)用序列碼{事件碼,針對的器官id,參數(shù)個數(shù),參數(shù)...}該序列碼是表征對象函數(shù)調(diào)用的一種形式。其中,針對的器官id表示了虛擬作物生長系統(tǒng)中的某一具體對象,事件碼表示了該對象下的某一成員方法,參數(shù)個數(shù)和參數(shù)則表示了傳入方法的實際參數(shù)。由于序列碼與虛擬作物生長系統(tǒng)中的具體對象有關(guān),而腳本中唯一與虛擬作物生長系統(tǒng)相關(guān)的是器官類型定義腳本,因此在序列碼格式確定的情況下,解釋系統(tǒng)結(jié)合器官類型定義腳本進(jìn)行序列碼生成,而虛擬作物生長系統(tǒng)要結(jié)合器官類型定義腳本進(jìn)行序列碼到函數(shù)調(diào)用之間的轉(zhuǎn)換。如序列碼{0,1,1,1}表示調(diào)用虛擬作物生長系統(tǒng)中ID為1的對象的標(biāo)示為0的函數(shù),調(diào)用時傳入一個參數(shù),該參數(shù)為1。ID為1的對象是什么類型的具體的哪個對象以及表示為0的函數(shù)具有什么實際意義,虛擬作物生長系統(tǒng)要結(jié)合器官類型定義腳本進(jìn)行判斷。結(jié)合器官類型定義腳本使用解釋器系統(tǒng)產(chǎn)生的序列碼完整的描述了虛擬作物生長系統(tǒng)中某類作物的虛擬生長過程。
3、建立解釋系統(tǒng)的基本步驟按照解釋系統(tǒng)的基本工作流程,建立一個生長模型描述腳本解釋系統(tǒng)的基本步驟為建立XML腳本文件解釋模塊;建立變量處理模塊;;建立作物器官對象處理模塊;建立表達(dá)式和語句和處理模塊。
1)XML腳本文件解釋模塊對生長模型描述腳本的處理步驟本解釋系統(tǒng)采用MSXML4.0進(jìn)行XML腳本文件的解析。經(jīng)過對XML文檔的解析在計算機內(nèi)存中形成表征了XML文檔的DOM樹,然后對DOM樹進(jìn)行遍歷便可訪問到XML文檔中所有的信息節(jié)點。
在本系統(tǒng)中,采用觀察者模式,將在腳本解釋的過程中遍歷DOM樹進(jìn)行XML文檔解析的對象看作是目標(biāo),把對具體的信息節(jié)點進(jìn)行具體處理的對象看作是觀察者。解析對象對DOM樹的遍歷看作是目標(biāo)狀態(tài)的改變,每當(dāng)解析對象遍歷到一個新的節(jié)點,解析對象就將這個節(jié)點作為一個狀態(tài)改變事件發(fā)送給各個觀察者。然后各個觀察者在收到這樣的節(jié)點后再進(jìn)行節(jié)點信息判斷以做出相應(yīng)的處理。類結(jié)構(gòu)如圖8所示。
圖8中的VDatabase、VGrowProcess、VOrgProcess以及VVariableProcess類代表了解釋處理過程中處理不同信息節(jié)點的處理器對象,它們都從VNodeListener中繼承。文檔解析對象在自身內(nèi)部維持一個VNodeListener列表的數(shù)據(jù)結(jié)構(gòu),在系統(tǒng)需要的時候?qū)⑦@些對象加入VNodeListener列表。在解析對象對DOM樹的遍歷過程中,一旦它遍歷到新的信息節(jié)點,它就會調(diào)用VNodeListener列表中所有對象的processNode(…)方法,并把新的信息節(jié)點傳入該方法。這幾類處理器根據(jù)自身的需求對收到的信息節(jié)點進(jìn)行判斷,如果是自身感興趣的節(jié)點則進(jìn)行處理,否則就返回。
2)變量處理模塊對變量的處理步驟在解釋過程中,系統(tǒng)對變量的處理有如下幾個步驟首先是對變量定義的處理。系統(tǒng)在遇到包含變量定義信息的節(jié)點時,從中提取出與變量定義相關(guān)的信息,如變量標(biāo)示、變量名、變量初值等,然后將變量存儲于變量緩沖區(qū)中。
其次是變量的使用。系統(tǒng)處理語句遇到某個變量標(biāo)示符時,到變量緩沖區(qū)進(jìn)行基于標(biāo)示符的變量查找。如果找到了相應(yīng)的變量就從中取值使用,否則就拋出變量未定義的錯誤。本系統(tǒng)提供一個具備存放變量、查找變量和獲取變量的數(shù)據(jù)結(jié)構(gòu)。在不考慮查找、插入效率的情況下,使用鏈表結(jié)構(gòu)作為系統(tǒng)變量緩存區(qū)——系統(tǒng)變量池的基本結(jié)構(gòu)。
3)作物器官對象處理模塊對作物器官對象的處理生長模型描述腳本用到了作物器官對象。在生長模型描述的過程中,如果說變量是為了描述農(nóng)學(xué)知識而使用的,那么作物器官對象則是為了描述這些知識與虛擬作物生長系統(tǒng)中的虛擬器官對象形態(tài)變化的關(guān)系而設(shè)計的。
1>作物器官對象定義的處理腳本定義器官對象的方式與定義一個普通變量相同,系統(tǒng)處理器官對象定義信息節(jié)點的基本過程與普通變量定義處理類似。具體過程如圖9所示,解釋系統(tǒng)首先根據(jù)器官對象申明腳本創(chuàng)建了器官對象后,然后通過查詢器官類型定義腳本判斷該器官類型是否存在。如果存在這樣的器官類型,解釋系統(tǒng)就從器官類型定義腳本獲取此類型器官的特殊的初始化信息(如該類型器官特有的屬性)對已創(chuàng)建的器官對象進(jìn)行初始化。初始化完畢,再對器官對象添加系統(tǒng)默認(rèn)屬性(如系統(tǒng)為該器官對象分配的唯一標(biāo)示符),同時產(chǎn)生系統(tǒng)內(nèi)置序列碼(如指示虛擬作物生長系統(tǒng)創(chuàng)建該器官對象的序列碼)。最后將這個器官(VOrg)對象放入系統(tǒng)變量池。如果不存在這樣的對象類型,解釋系統(tǒng)簡單的拋出一個異常,然后停止解釋。
2>器官對象的復(fù)合數(shù)據(jù)結(jié)構(gòu)的實現(xiàn)器官對象自身還包含了一些數(shù)據(jù)屬性,這些數(shù)據(jù)屬性看作是普通變量。它們具有標(biāo)示符、變量類型、變量初始值等特性。與普通變量不同的是,它們不能直接通過自身的標(biāo)示符進(jìn)行訪問,而是要結(jié)合所屬對象進(jìn)行訪問。將對象數(shù)據(jù)屬性的標(biāo)示符與該對象的標(biāo)示符結(jié)合起來形成一個全局唯一的系統(tǒng)標(biāo)示符,從而將對象中的數(shù)據(jù)屬性當(dāng)作系統(tǒng)全局普通變量來看待。
本系統(tǒng)采用了內(nèi)置的對象描述符“_”進(jìn)行這種組合。同時,系統(tǒng)規(guī)定用戶變量定義使用的變量標(biāo)示符不能包含“_”這樣的規(guī)則。例如對于對象wheatStem的length屬性來說,最終系統(tǒng)產(chǎn)生的對應(yīng)該屬性的普通變量為_wheatStem_length,而用戶定義不了這樣的變量。
3>事件驅(qū)動變量的實現(xiàn)事件驅(qū)動變量是一種特殊的器官對象數(shù)據(jù)屬性,當(dāng)該變量的值發(fā)生變化時,需要相應(yīng)的對象產(chǎn)生序列碼以表征該變量驅(qū)動的事件的產(chǎn)生。即當(dāng)驅(qū)動變量發(fā)生值的變動時能夠通知虛擬作物生長系統(tǒng)中對應(yīng)的對象做出動作。在本系統(tǒng)中,采用觀察者模式,把器官對象作為變量值改變的聽眾,變量池作為目標(biāo)對象,器官對象在初始化時把自身加入到變量池的變量改變事件聽眾列表中,變量池一旦檢測到任何變量值的改變就將該變量包裝成變量改變事件發(fā)送給所有的聽眾。這樣,對象在收到這樣的事件后做出判斷,如果是自已注冊的驅(qū)動變量就產(chǎn)生相應(yīng)的序列碼,如果不是就簡單的忽略。具體處理過程如圖10所示每當(dāng)系統(tǒng)變量值發(fā)生變化,器官對象會對發(fā)生變化的變量進(jìn)行判斷,看它是否為自己注冊的事件驅(qū)動變量。如果是,器官對象查詢器官類型定義腳本得到該事件驅(qū)動變量對應(yīng)的序列碼產(chǎn)生格式。然后,根據(jù)該格式產(chǎn)生相應(yīng)的序列碼并將其寫入系統(tǒng)序列碼緩存中。如果發(fā)生變化的變量不是自己注冊的事件驅(qū)動變量,器官對象就簡單的返回不做任何處理。
4)表達(dá)式和語句處理模塊對表達(dá)式和語句的處理對生長模型描述腳本的器官鏈接和生長過程部分的處理是通過對描述作物生長過程數(shù)據(jù)形態(tài)變化的表達(dá)式、語句的處理進(jìn)行的。
1>表達(dá)式的處理生長模型描述腳本包含了大量的表達(dá)式,解釋系統(tǒng)按照算符優(yōu)先算法進(jìn)行處理。
2>語句的處理生長模型描述腳本中設(shè)計了三種類型的語句順序語句、選擇語句和循環(huán)語句。順序語句按照腳本的XML信息節(jié)點遍歷的過程進(jìn)行語句處理。對于選擇語句和循環(huán)語句,雖然表示這兩類語句的XML節(jié)點只有一個(當(dāng)然這一節(jié)點下還包含了完整描述一個這樣的語句所必需具備的子節(jié)點),對這一節(jié)點的處理過程卻是按條件迭代處理的。本系統(tǒng)根據(jù)不同的語句節(jié)點做出不同的程序動作。對于順序語句,執(zhí)行一次處理即可;對于選擇和循環(huán)語句,從中提取出條件判斷語句然后根據(jù)條件進(jìn)行遞歸處理。
權(quán)利要求
1.一種用于基于PC的虛擬作物生長系統(tǒng)中的作物生長模型描述與解釋方法,其特征在于該方法包括以下步驟1)用可擴展標(biāo)記語言XML描述農(nóng)作物生長模型,以如下方式進(jìn)行(1)以普通變量的方式,描述農(nóng)作物生長模型所引用的數(shù)據(jù),即①采用XML標(biāo)記VarDeclare標(biāo)示出普通變量申明區(qū)域;②采用XML標(biāo)記Var,結(jié)合標(biāo)記屬性Name、Type,描述一個申明的普通變量;③采用XML標(biāo)記VarArray,結(jié)合子標(biāo)記Name、Size以及屬性Type,描述一個申明的數(shù)組變量。(2)以數(shù)據(jù)庫變量的方式,包括簡單數(shù)據(jù)庫變量和復(fù)雜數(shù)據(jù)庫變量兩種方式,描述作物生長模型中所引用的存放于數(shù)據(jù)庫的數(shù)據(jù),即①采用XML標(biāo)記SimpleDBVarDeclare標(biāo)示出簡單數(shù)據(jù)庫變量申明區(qū)域;②采用XML標(biāo)記ComplexDBVarDeclareType標(biāo)示出復(fù)雜數(shù)據(jù)庫變量申明區(qū)域;③采用XML標(biāo)記DBTable,結(jié)合標(biāo)記屬性DBName、AcquireValueBy,描述數(shù)據(jù)庫變量與關(guān)系數(shù)據(jù)庫中相應(yīng)關(guān)系之間的聯(lián)系;④采用XML標(biāo)記DBVar,結(jié)合標(biāo)記屬性DBName、Type,描述一個申明的數(shù)據(jù)庫變量;(3)采用三種運算結(jié)構(gòu)描述生長模型中所包含的數(shù)學(xué)公式,即①采用初等解析函數(shù)及初等運算的運算結(jié)構(gòu),使用XML標(biāo)記Express,描述簡單解析表達(dá)式;②采用選擇運算的運算結(jié)構(gòu),使用XML標(biāo)記If,結(jié)合標(biāo)記屬性bexpress以及子標(biāo)記Then、Else,組合Express描述的簡單表達(dá)式,描述分段式解析表達(dá)式;③采用迭代運算的運算結(jié)構(gòu),使用XML標(biāo)記While,結(jié)合標(biāo)記屬性bexpress,組合Express描述的簡單表達(dá)式,描述迭代式解析表達(dá)式;(4)采用器官類型定義腳本描述作物器官形態(tài),即①采用XML標(biāo)記Org標(biāo)示出一個作物器官類型;②采用XML標(biāo)記Properties標(biāo)示出作物器官類型屬性定義區(qū)域;③采用XML標(biāo)記Proper描述該類型作物器官所包含的屬性;④采用XML標(biāo)記Register_event標(biāo)示出作物器官類型事件定義區(qū)域;⑤采用XML標(biāo)記Event描述該類型作物器官所支持的事件;⑥采用XML標(biāo)記Register_properties標(biāo)示出事件驅(qū)動變量定義區(qū)域;⑦采用XML標(biāo)記Proper,結(jié)合子標(biāo)記Seq、Event_code和Proper_value,描述一個申明的事件驅(qū)動變量。(5)采用循環(huán)過程描述生長模型中的生長過程部分,即①采用XML標(biāo)記GrowProcess標(biāo)示出作物生長過程描述部分;②采用XML標(biāo)記While描述表征作物生長過程的循環(huán)過程;2)構(gòu)建基于生長模型XML描述腳本的解釋系統(tǒng),在讀取了生長模型描述腳本、在計算機內(nèi)存中建立文檔模型樹并開始對其做遍歷處理之后,以如下方式進(jìn)行(1)利用觀察者模式,使用不同類型的處理器對象,處理生長模型XML描述腳本的不同部分,即①用數(shù)據(jù)庫信息節(jié)點處理器(VDatabase)處理數(shù)據(jù)庫信息節(jié)點,在獲取信息節(jié)點中包含的數(shù)據(jù)庫驅(qū)動程序信息、數(shù)據(jù)庫位置信息、數(shù)據(jù)庫訪問賬號信息之后,使用這些信息建立到數(shù)據(jù)庫的連接;②用變量定義信息節(jié)點處理器(VVariableProcess)處理變量定義信息節(jié)點,從中提取出與變量定義相關(guān)的信息,如變量標(biāo)示、變量名、變量初值等,利用這些信息建立變量對象,然后將變量對象存儲于變量緩沖區(qū)中;③用變量定義信息節(jié)點處理器(VVariableProcess)處理對象型變量定義信息節(jié)點,從中提取與對象型變量定義相關(guān)的信息,如變量標(biāo)示、對象類型、變量名等,然后查詢器官類型定義腳本確認(rèn)存在該對象類型,最后用這些信息利用VOrg類建立器官變量對象存儲與變量緩沖區(qū)中;④用器官依賴關(guān)系信息節(jié)點處理器(VOrgProcess)處理器官依賴關(guān)系信息節(jié)點;⑤用生長過程信息節(jié)點處理器(VGrowProcess)處理生長過程描述信息節(jié)點。(2)檢測事件驅(qū)動變量的改變,產(chǎn)生作物生長序列碼,即①按照{(diào)事件碼,針對的器官id,參數(shù)個數(shù),參數(shù)...}的格式用序列碼表征虛擬作物生長系統(tǒng)中的對象方法調(diào)用;②用觀察者模式檢測事件驅(qū)動變量的變化,在該類型變量的值發(fā)生變化時結(jié)合器官類型定義腳本產(chǎn)生表達(dá)該變化的序列碼。
2.根據(jù)權(quán)利要求1所述的用于基于PC的虛擬作物生長系統(tǒng)中的作物生長模型描述與解釋方法,其特征在于所說的普通變量類型分為int、double、string三種類型。
3.根據(jù)權(quán)利要求1所述的用于基于PC的虛擬作物生長系統(tǒng)中的作物生長模型描述與解釋方法,其特征在于所說的簡單數(shù)據(jù)庫變量的數(shù)據(jù)庫對應(yīng)于該變量只含有單一數(shù)據(jù);復(fù)雜數(shù)據(jù)庫變量的數(shù)據(jù)庫對應(yīng)于該變量含有一組數(shù)據(jù)即一個數(shù)據(jù)集合。
全文摘要
本發(fā)明公開了一種用于基于PC的虛擬作物生長系統(tǒng)的作物生長模型描述與解釋方法,該方法包括以下步驟1.用可擴展標(biāo)記語言XML描述農(nóng)作物生長模型;2.構(gòu)建基于生長模型XML描述腳本的解釋系統(tǒng)。采用本發(fā)明進(jìn)行虛擬作物生長系統(tǒng)構(gòu)建,使農(nóng)學(xué)專家能夠按照生長模型描述XML腳本大綱對農(nóng)學(xué)知識進(jìn)行類似程序的組織,這種方式的描述比編制程序簡單,而且由于組件開發(fā)工作由軟件開發(fā)人員完成,使得農(nóng)學(xué)專家不需要掌握計算機圖形學(xué)、虛擬現(xiàn)實技術(shù)、面向?qū)ο缶幊谭椒ǖ葟?fù)雜的計算機技術(shù)即可自行利用該系統(tǒng)完成一個虛擬作物生長過程的展示。
文檔編號G06F17/30GK1570924SQ20041002611
公開日2005年1月26日 申請日期2004年5月13日 優(yōu)先權(quán)日2004年5月13日
發(fā)明者劉曉東, 朱林, 劉國榮, 鮑軍鵬, 羅軼先, 李惠, 曹云飛, 席延軍 申請人:西安交通大學(xué)