張 琪,王 瑜,徐 圓,朱群雄
(北京化工大學(xué) 信息科學(xué)與技術(shù)學(xué)院,北京100029)
傳統(tǒng)的應(yīng)急救援[1,2]推理一般采取兩種方式:①案例推理[3-5],系統(tǒng)通過對(duì)輸入數(shù)據(jù)進(jìn)行決策分析,得出最優(yōu)解決方案,此類系統(tǒng)必須花費(fèi)大量時(shí)間更新和維護(hù)知識(shí)庫[6];②既定流程推理方式,系統(tǒng)通過對(duì)文本預(yù)案進(jìn)行剖析組合,形成固定流程的節(jié)點(diǎn)序列,利用虛擬現(xiàn)實(shí)技術(shù)重現(xiàn)演練流程[7,8],此類系統(tǒng)的演練流程固定不變,且必須由指定的員工執(zhí)行唯一正確操作,否則系統(tǒng)無法完成所有演練任務(wù)推演。
針對(duì)以上問題,本文提出了一種以物理實(shí)體為對(duì)象的客觀推理系統(tǒng)。系統(tǒng)采用XML配置文件[9]來構(gòu)建客觀對(duì)象的推理狀態(tài)關(guān)系集合,客觀推理機(jī)通過讀取配置文件來構(gòu)建具有多種狀態(tài)映射關(guān)系的推理關(guān)系樹,而一個(gè)狀態(tài)內(nèi)具體包含的執(zhí)行語句序列則由狀態(tài)對(duì)應(yīng)的腳本文件控制。最終,根據(jù)初始條件,客觀推理機(jī)重復(fù)輪詢已經(jīng)滿足要求的狀態(tài)節(jié)點(diǎn),通過消息通信模塊使之與對(duì)應(yīng)腳本關(guān)聯(lián)[10],從而調(diào)用相應(yīng)函數(shù)接口,改變虛擬人物或設(shè)備的狀態(tài)。實(shí)驗(yàn)結(jié)果表明,化工廠的虛擬現(xiàn)實(shí)救援演練中,系統(tǒng)可以根據(jù)客觀對(duì)象狀態(tài)的改變來執(zhí)行不同的演練流程分支,提高了虛擬應(yīng)急演練的多樣性和適應(yīng)性。
圖1描述了客觀推理仿真系統(tǒng)的系統(tǒng)模塊結(jié)構(gòu)。本系統(tǒng)總體分為4大功能模塊:狀態(tài)配置模塊、通信模塊、客觀推理模塊、應(yīng)急預(yù)案腳本模塊。狀態(tài)配置模塊負(fù)責(zé)用文本預(yù)案中的抽象邏輯管理構(gòu)建客觀推理的邏輯關(guān)系樹;通信模塊負(fù)責(zé)消息發(fā)送、接收和處理,是客觀推理模塊和三維仿真部分的重要連接樞紐;客觀推理模塊負(fù)責(zé)遍歷邏輯關(guān)系樹,從而查找滿足條件的狀態(tài)和表達(dá)式,并通過luabind將推理機(jī)和腳本預(yù)案連接,達(dá)到執(zhí)行客觀推理仿真的目標(biāo)。
圖1 系統(tǒng)模塊結(jié)構(gòu)
配置文件是以XML數(shù)據(jù)庫形式存儲(chǔ)的應(yīng)急演練邏輯關(guān)系,客觀推理機(jī)通過解析特定的文本格式,將客觀對(duì)象的狀態(tài)集合、表達(dá)式集合以及對(duì)應(yīng)的推導(dǎo)關(guān)系集合存入樹形邏輯關(guān)系結(jié)構(gòu),方便演練過程中對(duì)任務(wù)的執(zhí)行邏輯進(jìn)行推導(dǎo)。
(1)狀態(tài)集合
<state id="0"funcName="smog1"branch="br1_1">smog_state1</state>
狀態(tài)是客觀推理過程的基本單位,一個(gè)客觀對(duì)象可以擁有多個(gè)狀態(tài),但每個(gè)狀態(tài)只屬于一個(gè)客觀對(duì)象??陀^推理機(jī)的每一個(gè)對(duì)象及其狀態(tài)都與一個(gè)預(yù)案腳本唯一對(duì)應(yīng),腳本內(nèi)的一個(gè)狀態(tài)又可以包含若干不可分割的元操作序列。id是狀態(tài)的唯一標(biāo)識(shí)碼,funcName是該狀態(tài)所屬的預(yù)案腳本名稱,branch是狀態(tài)的分支標(biāo)簽,smog_state1 是狀態(tài)的名稱。
(2)狀態(tài)轉(zhuǎn)移集合
<transition backward="0"forward="1"/>
通過狀態(tài)的唯一標(biāo)識(shí)碼id來構(gòu)建狀態(tài)間的邏輯推導(dǎo)關(guān)系,包括一對(duì)一、一對(duì)多、多對(duì)一的狀態(tài)關(guān)系映射。backward表示推導(dǎo)的前件,forward表示推導(dǎo)的后件,經(jīng)由客觀推理機(jī)解析后,上述XML 語句會(huì)構(gòu)建一條狀態(tài)id=0到狀態(tài)id=1的推導(dǎo)關(guān)系,要執(zhí)行狀態(tài)id=1,則至少要保證狀態(tài)id=0已經(jīng)執(zhí)行完畢。
(3)表達(dá)式集合
<expression id="0"type="no_op"fact="a">expr1 </expression>
表達(dá)式可以理解為狀態(tài)執(zhí)行所必須滿足的條件,不同的type產(chǎn)生結(jié)果的方式不同,而只有當(dāng)結(jié)果為true,才說明該表達(dá)式已經(jīng)完成。id 是表達(dá)式唯一標(biāo)識(shí)碼,表達(dá)式type具有4種類型,分別是no_op (無操作)、not(非)、and (與)、or(或),fact作為標(biāo)準(zhǔn)事實(shí),作用是根據(jù)不同的type和表達(dá)式產(chǎn)生bool值,從而決定該表達(dá)式的完成狀態(tài)。
(4)表達(dá)式轉(zhuǎn)移集合
<extransition type="bro-bro"backward="0"forward="1"/>
表達(dá)式轉(zhuǎn)移集合的作用就是根據(jù)type類型,將表達(dá)式的前后件以對(duì)應(yīng)關(guān)系存儲(chǔ)。表達(dá)式轉(zhuǎn)移的type具有2種類型:parent-child(父子節(jié)點(diǎn))、bro-bro(兄弟節(jié)點(diǎn))。
(5)狀態(tài)—表達(dá)式轉(zhuǎn)移集合
<exstate type="ex-state"backward="0"forward="58"/>
該集合的作用是完善推理邏輯關(guān)系樹,當(dāng)表達(dá)式的運(yùn)算結(jié)果為true時(shí),客觀推理機(jī)通過該轉(zhuǎn)移集合完成表達(dá)式到狀態(tài)的遷移推演。作為現(xiàn)實(shí)世界的抽象,遷移關(guān)系只能由表達(dá)式到狀態(tài),反之則不行。
作為客觀推理系統(tǒng)和虛擬現(xiàn)實(shí)三維仿真部分的連接紐帶,利用先進(jìn)先出的消息隊(duì)列來存儲(chǔ)待處理的原始消息內(nèi)容,所有消息都以字符串形式存儲(chǔ),再通過對(duì)字符串分段解析,得到對(duì)應(yīng)的傳遞參數(shù),從而完成消息的格式轉(zhuǎn)換和發(fā)送。通信模塊從三維仿真部分接收消息并提取待恢復(fù)執(zhí)行的腳本文件名和腳本執(zhí)行狀態(tài)標(biāo)簽,然后由客觀推理機(jī)在內(nèi)部輪詢查找待恢復(fù)腳本文件中滿足條件的文件,最后恢復(fù)相應(yīng)的腳本,將執(zhí)行指令經(jīng)由通信模塊傳遞給三維仿真部分進(jìn)行操作,同時(shí)實(shí)時(shí)監(jiān)聽指令執(zhí)行的反饋結(jié)果。
客觀推理系統(tǒng)用C++設(shè)計(jì)編寫,腳本預(yù)案用lua腳本語言設(shè)計(jì)編寫,二者通過luabind實(shí)現(xiàn)通信。
(1)lua腳本調(diào)用C++函數(shù)
luabind提供了將C++類對(duì)象注冊(cè)給lua腳本調(diào)用的方法,可以讓lua腳本調(diào)用C++數(shù)據(jù)成員、重載操作符和成員函數(shù)。
luabind采用module方式將C++類對(duì)象的內(nèi)容提供給lua腳本調(diào)用。比如要注冊(cè)vector3類,那么首先要申明類名vector3,并注冊(cè)具有3個(gè)形參的構(gòu)造函數(shù)constructor<double,double,double> (),這相當(dāng)于在lua和vector3之間建立起一個(gè)連接。然后可以使用.def_readwrite("x",&vector3::x)方法注冊(cè)vector3 類的數(shù)據(jù)成員x,使用.def(self==vector3())方法注冊(cè)vector3 的==操作符,從而讓lua腳本能使用此操作符進(jìn)行vector3類對(duì)象的不同數(shù)據(jù)成員的比較。也可以使用.def("register",&vector3::register)方法注冊(cè)vector3 的成員函數(shù)regiseter(),實(shí)現(xiàn)lua腳本調(diào)用C++類的成員函數(shù)。
(2)C++函數(shù)讀寫lua腳本變量
luabind::object table=luabind::globals(Lua);table["person"]="true";
通過luabind庫的globals函數(shù)可以得到lua腳本全局變量列表,然后以待修改變量名為參數(shù),可以讓C++通過luabind修改lua腳本對(duì)應(yīng)全局變量的值。
(3)lua協(xié)程和虛擬機(jī)
客觀推理機(jī)只是負(fù)責(zé)狀態(tài)和表達(dá)式的推導(dǎo),但它們所對(duì)應(yīng)腳本文件恢復(fù) (resume)和掛起 (yield)需要lua的協(xié)程機(jī)制完成,腳本文件語句的執(zhí)行狀態(tài)需要lua 虛擬機(jī)控制。
lua協(xié)程是多任務(wù)處理的一種機(jī)制,協(xié)程的執(zhí)行控制權(quán)是由程序顯示告知的,可以對(duì)協(xié)程進(jìn)行resume和yield操作,由此控制應(yīng)急演練的多任務(wù)。每一次yield之前都必須調(diào)用register()函數(shù)來告訴推理機(jī)下次應(yīng)當(dāng)恢復(fù)的腳本名稱。
lua虛擬機(jī)創(chuàng)建成功后會(huì)生成一個(gè)棧,將對(duì)應(yīng)lua腳本的待執(zhí)行語句順序存入棧,配合lua協(xié)程,將執(zhí)行完畢的語句出棧,使得棧中永遠(yuǎn)保存未執(zhí)行語句序列,保證順序流程下的lua語句不會(huì)重復(fù)執(zhí)行。
客觀推理機(jī)以狀態(tài)和表達(dá)式為基礎(chǔ)節(jié)點(diǎn),以設(shè)備為對(duì)象對(duì)應(yīng)急演練流程進(jìn)行推理,推理機(jī)制的建立并非依托于指定的參演真人角色的特定任務(wù),而是由客觀對(duì)象間關(guān)聯(lián)屬性決定。如石化工廠物料罐起火事件會(huì)推演出消防員噴水救火事件,火勢的減少乃至熄滅過程并不必須由特定消防員在特定時(shí)刻進(jìn)行特殊類型噴水來完成,在客觀推理機(jī)制下,對(duì)火焰和水等粒子對(duì)象都賦予相關(guān)屬性,火焰熄滅的必要條件是一定數(shù)量的水粒子與其發(fā)生作用,抑制火焰粒子自生長。本文提及的客觀推理機(jī)制涉及以下4個(gè)方面的推理:
(1)正向推理
應(yīng)急救援演練設(shè)備之間的關(guān)聯(lián)性大多都可以由正向推理來完成。當(dāng)待執(zhí)行狀態(tài)的所有前件都執(zhí)行完畢,且沒有表達(dá)式約束或者約束結(jié)果為true,那么推理機(jī)就會(huì)恢復(fù)狀態(tài)所對(duì)應(yīng)的lua腳本文件,執(zhí)行l(wèi)ua文件內(nèi)的相關(guān)語句序列,直到第一次遇到coroutine.yield()才將lua腳本的協(xié)程掛起,實(shí)時(shí)監(jiān)聽客觀推理機(jī)對(duì)腳本的resume操作。正向推理一般用于對(duì)應(yīng)急救援演練具有決定性質(zhì)的設(shè)備災(zāi)害的推演,因?yàn)檫@樣的節(jié)點(diǎn)事件一旦發(fā)生就具有不可挽回性,更加符合演練真實(shí)情況。
(2)表達(dá)式推理
表達(dá)式作為狀態(tài)執(zhí)行的必要條件,其自身擁有單體或倒序多叉樹結(jié)構(gòu),能夠滿足條件之間的與、或、非組合。no_op是判斷演練過程的fact與標(biāo)準(zhǔn)fact的一致性,not可以看做no_op的取非操作,以上二者都是針對(duì)單體表達(dá)式;而and和or分別表示將當(dāng)前父節(jié)點(diǎn)的fact值與其所有孩子節(jié)點(diǎn)做與、或操作,是針對(duì)倒序多叉樹結(jié)構(gòu)的表達(dá)式集合。只有當(dāng)應(yīng)急演練過程中某一表達(dá)式經(jīng)過type運(yùn)算后,得到的fact結(jié)果為true,才能繼續(xù)流程的推導(dǎo)。
(3)可逆推理
狀態(tài)是客觀推理系統(tǒng)的基礎(chǔ)不可分割節(jié)點(diǎn),但狀態(tài)同時(shí)也對(duì)應(yīng)這lua腳本內(nèi)的一段語句序列。當(dāng)客觀推理機(jī)將執(zhí)行主動(dòng)權(quán)交給腳本系統(tǒng)時(shí),所有滿足條件的lua腳本文件都會(huì)自動(dòng)執(zhí)行,直到遇到y(tǒng)ield。利用這一特性,本系統(tǒng)實(shí)現(xiàn)了應(yīng)急救援演練的非決定性可逆流程的關(guān)聯(lián)操作。
以閥門valve為推理對(duì)象,根據(jù)valve的狀態(tài)來控制water粒子的產(chǎn)生和消失。在每次的yield 之前必須通過register()函數(shù)來通知客觀推理機(jī),下次恢復(fù)的Script-Name。當(dāng)真人操作valve對(duì)象,客觀推理機(jī)會(huì)將執(zhí)行主動(dòng)權(quán)交給腳本,腳本進(jìn)入while循環(huán)嘗試判斷water粒子的狀態(tài)。這樣的推理一直持續(xù)到真人提交done 操作,此時(shí)break跳出循環(huán),同樣會(huì)跳過下一次yield,這樣便可以執(zhí)行到state_work_done("water_state1")通知推理機(jī)產(chǎn)生water粒子的狀態(tài)已經(jīng)完成。
(4)多分支推理
多分支推理是根據(jù)關(guān)鍵事件結(jié)果的不一致性來推演出不同演練流程。系統(tǒng)通過配置文件來設(shè)置分支變量值,再通過lua腳本的goto跳轉(zhuǎn)語句實(shí)現(xiàn)分支的遷移,每一個(gè)分支對(duì)應(yīng)一個(gè)客觀對(duì)象的基本狀態(tài)。
圖2為客觀推理機(jī)4種推理機(jī)制的混合結(jié)構(gòu),每一個(gè)圓圈序號(hào)表示一個(gè)狀態(tài)或表達(dá)式,每一個(gè)狀態(tài)都至少對(duì)應(yīng)一個(gè)lua腳本文件,支持若干可逆推理流程。圖2以石化廠區(qū)罐體起火的應(yīng)急救援流程為例,不同標(biāo)簽對(duì)應(yīng)含義如下:0表示物料罐起火,1表示打電話給消防部門,2表示開噴淋閥門給罐體降溫,3表示出現(xiàn)黑色濃煙,4表示根據(jù)火勢對(duì)周圍的影響來選擇不同的分支流程,branch_1表示火焰引發(fā)左側(cè)罐體著火的應(yīng)急救援流程,branch_2表示火焰熄滅的應(yīng)急救援流程。
圖2 推理流程結(jié)構(gòu)
客觀推理機(jī)執(zhí)行后便輪詢可執(zhí)行狀態(tài),此時(shí)物料罐起火并伴有黑煙。此時(shí)系統(tǒng)推演出應(yīng)當(dāng)打電話并給罐體降溫,接著根據(jù)火勢的影響推演出不同的分支流程。由于救火不利可能導(dǎo)致次生災(zāi)害,引燃左側(cè)物料罐,若恰好火焰燃點(diǎn)滿足表達(dá)式e6條件,客觀推理機(jī)便恢復(fù)branch_1的狀態(tài)5對(duì)應(yīng)腳本的執(zhí)行主動(dòng)權(quán)。也可能由于噴水及時(shí),火勢得到控制,則客觀推理機(jī)會(huì)恢復(fù)branch_2的狀態(tài)9對(duì)應(yīng)腳本的執(zhí)行主動(dòng)權(quán)。
本文提出的基于虛擬現(xiàn)實(shí)的化工廠救援客觀仿真推理系統(tǒng)在某石化企業(yè)罐區(qū)應(yīng)用并取得顯著效果。
圖3所示為巡檢人員吸入硫化氫氣體中毒倒地后觸發(fā)報(bào)警,救援人員用擔(dān)架逆風(fēng)向?qū)⑵渌椭涟踩恢玫姆抡孢^程,涉及正向和多分支推理。人員中毒倒地正向地觸發(fā)報(bào)警救人狀態(tài),但人員救治是否及時(shí)則會(huì)產(chǎn)生不同的分支,救治成功則可繼續(xù)進(jìn)行隔離毒氣的流程推演,救治失敗則應(yīng)急救援演練失敗。
圖4所示為物料罐起火后,消防人員開噴淋罐閥給罐體降溫避免罐體爆炸的仿真過程,過程涉及可逆和表達(dá)式推理。當(dāng)物料罐起火,人員開啟噴淋罐閥則環(huán)繞罐體的水環(huán)出現(xiàn),關(guān)閉閥門則水環(huán)消失,這一過程可以反復(fù)操作查看效果,直到最終確認(rèn)提交才判定狀態(tài)是否完成。而火焰熄滅的前提表達(dá)式條件則是足夠的水粒子和火焰粒子發(fā)生作用,導(dǎo)致火焰熄滅。
圖3 應(yīng)急救援案例的傷員救治仿真
圖4 應(yīng)急救援案例的起火救援仿真
本文針對(duì)傳統(tǒng)應(yīng)急演練的不足,以客觀設(shè)備為推理對(duì)象,仿真實(shí)現(xiàn)了面向化工安全的應(yīng)急救援流程。本系統(tǒng)以客觀設(shè)備為對(duì)象抽取并建立設(shè)備之間的邏輯關(guān)系,混合使用了正向、可逆、表達(dá)式和多分支這4種推理方式,利用客觀推理機(jī)驅(qū)動(dòng)應(yīng)急演練腳本,所構(gòu)建的推理邏輯關(guān)系樹中狀態(tài)的完成度只和客觀對(duì)象自身相關(guān),而無需指定特定人員完成該狀態(tài)。本文所提出的客觀推理系統(tǒng)能夠快速適應(yīng)石化廠區(qū)應(yīng)急演練需求的變化,且在仿真演練過程中,會(huì)根據(jù)操作人員的不同操作產(chǎn)生不同的演練流程,增加了演練的多樣性,有助于提高受訓(xùn)人員的反應(yīng)能力。
[1]GAO Zhiying,ZHU Qunxiong.Simulation of wavy dynamic effect of wheat fields based on VRML [J].Journal of Computer Applications,2009,29 (6):332-334 (in Chinese).[郜智英,朱群雄.基于VRML 的風(fēng)中麥浪波動(dòng)效果模擬 [J].計(jì)算機(jī)應(yīng)用,2009,29 (6):332-334.]
[2]FENG Xianfu,ZHANG Zaoping.Analysis on chemical industry park emergency drill escape paths based on WebGIS [J].Procedia Engineering,2012,45:722-726.
[3]WANG Junjie,CAI Zhicong,ZHU Qunxiong.Design and development of virtual plant system of simulation for security[J].Computers and Applied Chemistry,2011,28 (3):338-342 (in Chinese).[王俊杰,蔡志聰,朱群雄.虛擬工廠安全仿真系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn) [J].計(jì)算機(jī)與應(yīng)用化學(xué),2011,28(3):338-342.]
[4]Liu Wenmao.Emergency resources demand prediction using case-based reasoning [J].Safety Science,2011,50 (3):530-534.
[5]JIANG Zhiying,ZHU Qunxiong,XU Yuan.A mechanism simulation platform of real-time intervention for chemical security based on virtual reality technology [J].Computers and Applied Chemistry,2012,29 (11):1326-1330 (in Chinese).[江志英,朱群雄,徐圓.一種基于虛擬現(xiàn)實(shí)技術(shù)的化工安全實(shí)時(shí)干預(yù)機(jī)理仿真平臺(tái) [J].計(jì)算機(jī)與應(yīng)用化學(xué),2012,29(11):1326-1330.]
[6]Paula Potes Ruiz,Bernard Kamsu Foguem,Bernard Grabot.Generating knowledge in maintenance from experience feedback[J].Knowledge-Based Systems,2014,35 (3):1-17.
[7]LIU Yisong,WANG Lili,LI Qianqian.Automated reasoning of general game playing system based on state calculus [J].Computer Engineering and Design,2012,33 (1):328-331(in Chinese).[劉一松,王莉莉,李倩倩.基于狀態(tài)演算的通用游戲系統(tǒng)的自動(dòng)推理 [J].計(jì)算機(jī)工程與設(shè)計(jì),2012,33(1):328-331.]
[8]Tal Sobol-Shikler.Automatic inference of complex affective states[J].Computer Speech and Language,2010,25 (1):45-62.
[9]Lin Xudong,Wang Ning.XML normalization based on entity segments[J].Information Sciences,2013,239:85-95.
[10]YI Tao,ZHU Qunxiong,LIU Pengtao.An emergency drilling-based fuzzy expert system for chemical safety [J].CIESC Journal,2011,62 (10):2818-2827 (in Chinese). [易濤,朱群雄,劉鵬濤.基于應(yīng)急演練的化工安全模糊專家系統(tǒng)[J].化工學(xué)報(bào),2011,62 (10):2818-2827.]