張 琪,王 瑜,徐 圓,朱群雄
(北京化工大學 信息科學與技術學院,北京100029)
傳統的應急救援[1,2]推理一般采取兩種方式:①案例推理[3-5],系統通過對輸入數據進行決策分析,得出最優解決方案,此類系統必須花費大量時間更新和維護知識庫[6];②既定流程推理方式,系統通過對文本預案進行剖析組合,形成固定流程的節點序列,利用虛擬現實技術重現演練流程[7,8],此類系統的演練流程固定不變,且必須由指定的員工執行唯一正確操作,否則系統無法完成所有演練任務推演。
針對以上問題,本文提出了一種以物理實體為對象的客觀推理系統。系統采用XML配置文件[9]來構建客觀對象的推理狀態關系集合,客觀推理機通過讀取配置文件來構建具有多種狀態映射關系的推理關系樹,而一個狀態內具體包含的執行語句序列則由狀態對應的腳本文件控制。最終,根據初始條件,客觀推理機重復輪詢已經滿足要求的狀態節點,通過消息通信模塊使之與對應腳本關聯[10],從而調用相應函數接口,改變虛擬人物或設備的狀態。實驗結果表明,化工廠的虛擬現實救援演練中,系統可以根據客觀對象狀態的改變來執行不同的演練流程分支,提高了虛擬應急演練的多樣性和適應性。
圖1描述了客觀推理仿真系統的系統模塊結構。本系統總體分為4大功能模塊:狀態配置模塊、通信模塊、客觀推理模塊、應急預案腳本模塊。狀態配置模塊負責用文本預案中的抽象邏輯管理構建客觀推理的邏輯關系樹;通信模塊負責消息發送、接收和處理,是客觀推理模塊和三維仿真部分的重要連接樞紐;客觀推理模塊負責遍歷邏輯關系樹,從而查找滿足條件的狀態和表達式,并通過luabind將推理機和腳本預案連接,達到執行客觀推理仿真的目標。

圖1 系統模塊結構
配置文件是以XML數據庫形式存儲的應急演練邏輯關系,客觀推理機通過解析特定的文本格式,將客觀對象的狀態集合、表達式集合以及對應的推導關系集合存入樹形邏輯關系結構,方便演練過程中對任務的執行邏輯進行推導。
(1)狀態集合
<state id="0"funcName="smog1"branch="br1_1">smog_state1</state>
狀態是客觀推理過程的基本單位,一個客觀對象可以擁有多個狀態,但每個狀態只屬于一個客觀對象??陀^推理機的每一個對象及其狀態都與一個預案腳本唯一對應,腳本內的一個狀態又可以包含若干不可分割的元操作序列。id是狀態的唯一標識碼,funcName是該狀態所屬的預案腳本名稱,branch是狀態的分支標簽,smog_state1 是狀態的名稱。
(2)狀態轉移集合
<transition backward="0"forward="1"/>
通過狀態的唯一標識碼id來構建狀態間的邏輯推導關系,包括一對一、一對多、多對一的狀態關系映射。backward表示推導的前件,forward表示推導的后件,經由客觀推理機解析后,上述XML 語句會構建一條狀態id=0到狀態id=1的推導關系,要執行狀態id=1,則至少要保證狀態id=0已經執行完畢。
(3)表達式集合
<expression id="0"type="no_op"fact="a">expr1 </expression>
表達式可以理解為狀態執行所必須滿足的條件,不同的type產生結果的方式不同,而只有當結果為true,才說明該表達式已經完成。id 是表達式唯一標識碼,表達式type具有4種類型,分別是no_op (無操作)、not(非)、and (與)、or(或),fact作為標準事實,作用是根據不同的type和表達式產生bool值,從而決定該表達式的完成狀態。
(4)表達式轉移集合
<extransition type="bro-bro"backward="0"forward="1"/>
表達式轉移集合的作用就是根據type類型,將表達式的前后件以對應關系存儲。表達式轉移的type具有2種類型:parent-child(父子節點)、bro-bro(兄弟節點)。
(5)狀態—表達式轉移集合
<exstate type="ex-state"backward="0"forward="58"/>
該集合的作用是完善推理邏輯關系樹,當表達式的運算結果為true時,客觀推理機通過該轉移集合完成表達式到狀態的遷移推演。作為現實世界的抽象,遷移關系只能由表達式到狀態,反之則不行。
作為客觀推理系統和虛擬現實三維仿真部分的連接紐帶,利用先進先出的消息隊列來存儲待處理的原始消息內容,所有消息都以字符串形式存儲,再通過對字符串分段解析,得到對應的傳遞參數,從而完成消息的格式轉換和發送。通信模塊從三維仿真部分接收消息并提取待恢復執行的腳本文件名和腳本執行狀態標簽,然后由客觀推理機在內部輪詢查找待恢復腳本文件中滿足條件的文件,最后恢復相應的腳本,將執行指令經由通信模塊傳遞給三維仿真部分進行操作,同時實時監聽指令執行的反饋結果。
客觀推理系統用C++設計編寫,腳本預案用lua腳本語言設計編寫,二者通過luabind實現通信。
(1)lua腳本調用C++函數
luabind提供了將C++類對象注冊給lua腳本調用的方法,可以讓lua腳本調用C++數據成員、重載操作符和成員函數。

luabind采用module方式將C++類對象的內容提供給lua腳本調用。比如要注冊vector3類,那么首先要申明類名vector3,并注冊具有3個形參的構造函數constructor<double,double,double> (),這相當于在lua和vector3之間建立起一個連接。然后可以使用.def_readwrite("x",&vector3::x)方法注冊vector3 類的數據成員x,使用.def(self==vector3())方法注冊vector3 的==操作符,從而讓lua腳本能使用此操作符進行vector3類對象的不同數據成員的比較。也可以使用.def("register",&vector3::register)方法注冊vector3 的成員函數regiseter(),實現lua腳本調用C++類的成員函數。
(2)C++函數讀寫lua腳本變量
luabind::object table=luabind::globals(Lua);table["person"]="true";
通過luabind庫的globals函數可以得到lua腳本全局變量列表,然后以待修改變量名為參數,可以讓C++通過luabind修改lua腳本對應全局變量的值。
(3)lua協程和虛擬機
客觀推理機只是負責狀態和表達式的推導,但它們所對應腳本文件恢復 (resume)和掛起 (yield)需要lua的協程機制完成,腳本文件語句的執行狀態需要lua 虛擬機控制。
lua協程是多任務處理的一種機制,協程的執行控制權是由程序顯示告知的,可以對協程進行resume和yield操作,由此控制應急演練的多任務。每一次yield之前都必須調用register()函數來告訴推理機下次應當恢復的腳本名稱。
lua虛擬機創建成功后會生成一個棧,將對應lua腳本的待執行語句順序存入棧,配合lua協程,將執行完畢的語句出棧,使得棧中永遠保存未執行語句序列,保證順序流程下的lua語句不會重復執行。
客觀推理機以狀態和表達式為基礎節點,以設備為對象對應急演練流程進行推理,推理機制的建立并非依托于指定的參演真人角色的特定任務,而是由客觀對象間關聯屬性決定。如石化工廠物料罐起火事件會推演出消防員噴水救火事件,火勢的減少乃至熄滅過程并不必須由特定消防員在特定時刻進行特殊類型噴水來完成,在客觀推理機制下,對火焰和水等粒子對象都賦予相關屬性,火焰熄滅的必要條件是一定數量的水粒子與其發生作用,抑制火焰粒子自生長。本文提及的客觀推理機制涉及以下4個方面的推理:
(1)正向推理
應急救援演練設備之間的關聯性大多都可以由正向推理來完成。當待執行狀態的所有前件都執行完畢,且沒有表達式約束或者約束結果為true,那么推理機就會恢復狀態所對應的lua腳本文件,執行lua文件內的相關語句序列,直到第一次遇到coroutine.yield()才將lua腳本的協程掛起,實時監聽客觀推理機對腳本的resume操作。正向推理一般用于對應急救援演練具有決定性質的設備災害的推演,因為這樣的節點事件一旦發生就具有不可挽回性,更加符合演練真實情況。
(2)表達式推理
表達式作為狀態執行的必要條件,其自身擁有單體或倒序多叉樹結構,能夠滿足條件之間的與、或、非組合。no_op是判斷演練過程的fact與標準fact的一致性,not可以看做no_op的取非操作,以上二者都是針對單體表達式;而and和or分別表示將當前父節點的fact值與其所有孩子節點做與、或操作,是針對倒序多叉樹結構的表達式集合。只有當應急演練過程中某一表達式經過type運算后,得到的fact結果為true,才能繼續流程的推導。
(3)可逆推理
狀態是客觀推理系統的基礎不可分割節點,但狀態同時也對應這lua腳本內的一段語句序列。當客觀推理機將執行主動權交給腳本系統時,所有滿足條件的lua腳本文件都會自動執行,直到遇到yield。利用這一特性,本系統實現了應急救援演練的非決定性可逆流程的關聯操作。

以閥門valve為推理對象,根據valve的狀態來控制water粒子的產生和消失。在每次的yield 之前必須通過register()函數來通知客觀推理機,下次恢復的Script-Name。當真人操作valve對象,客觀推理機會將執行主動權交給腳本,腳本進入while循環嘗試判斷water粒子的狀態。這樣的推理一直持續到真人提交done 操作,此時break跳出循環,同樣會跳過下一次yield,這樣便可以執行到state_work_done("water_state1")通知推理機產生water粒子的狀態已經完成。
(4)多分支推理
多分支推理是根據關鍵事件結果的不一致性來推演出不同演練流程。系統通過配置文件來設置分支變量值,再通過lua腳本的goto跳轉語句實現分支的遷移,每一個分支對應一個客觀對象的基本狀態。

圖2為客觀推理機4種推理機制的混合結構,每一個圓圈序號表示一個狀態或表達式,每一個狀態都至少對應一個lua腳本文件,支持若干可逆推理流程。圖2以石化廠區罐體起火的應急救援流程為例,不同標簽對應含義如下:0表示物料罐起火,1表示打電話給消防部門,2表示開噴淋閥門給罐體降溫,3表示出現黑色濃煙,4表示根據火勢對周圍的影響來選擇不同的分支流程,branch_1表示火焰引發左側罐體著火的應急救援流程,branch_2表示火焰熄滅的應急救援流程。

圖2 推理流程結構
客觀推理機執行后便輪詢可執行狀態,此時物料罐起火并伴有黑煙。此時系統推演出應當打電話并給罐體降溫,接著根據火勢的影響推演出不同的分支流程。由于救火不利可能導致次生災害,引燃左側物料罐,若恰好火焰燃點滿足表達式e6條件,客觀推理機便恢復branch_1的狀態5對應腳本的執行主動權。也可能由于噴水及時,火勢得到控制,則客觀推理機會恢復branch_2的狀態9對應腳本的執行主動權。
本文提出的基于虛擬現實的化工廠救援客觀仿真推理系統在某石化企業罐區應用并取得顯著效果。
圖3所示為巡檢人員吸入硫化氫氣體中毒倒地后觸發報警,救援人員用擔架逆風向將其送至安全位置的仿真過程,涉及正向和多分支推理。人員中毒倒地正向地觸發報警救人狀態,但人員救治是否及時則會產生不同的分支,救治成功則可繼續進行隔離毒氣的流程推演,救治失敗則應急救援演練失敗。
圖4所示為物料罐起火后,消防人員開噴淋罐閥給罐體降溫避免罐體爆炸的仿真過程,過程涉及可逆和表達式推理。當物料罐起火,人員開啟噴淋罐閥則環繞罐體的水環出現,關閉閥門則水環消失,這一過程可以反復操作查看效果,直到最終確認提交才判定狀態是否完成。而火焰熄滅的前提表達式條件則是足夠的水粒子和火焰粒子發生作用,導致火焰熄滅。

圖3 應急救援案例的傷員救治仿真

圖4 應急救援案例的起火救援仿真
本文針對傳統應急演練的不足,以客觀設備為推理對象,仿真實現了面向化工安全的應急救援流程。本系統以客觀設備為對象抽取并建立設備之間的邏輯關系,混合使用了正向、可逆、表達式和多分支這4種推理方式,利用客觀推理機驅動應急演練腳本,所構建的推理邏輯關系樹中狀態的完成度只和客觀對象自身相關,而無需指定特定人員完成該狀態。本文所提出的客觀推理系統能夠快速適應石化廠區應急演練需求的變化,且在仿真演練過程中,會根據操作人員的不同操作產生不同的演練流程,增加了演練的多樣性,有助于提高受訓人員的反應能力。
[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 的風中麥浪波動效果模擬 [J].計算機應用,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).[王俊杰,蔡志聰,朱群雄.虛擬工廠安全仿真系統設計與實現 [J].計算機與應用化學,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).[江志英,朱群雄,徐圓.一種基于虛擬現實技術的化工安全實時干預機理仿真平臺 [J].計算機與應用化學,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).[劉一松,王莉莉,李倩倩.基于狀態演算的通用游戲系統的自動推理 [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). [易濤,朱群雄,劉鵬濤.基于應急演練的化工安全模糊專家系統[J].化工學報,2011,62 (10):2818-2827.]