常瑩 朱慶華

摘要:將規則系統引入智能家居平臺很好地解決了將控制邏輯與程序代碼分離的問題,用戶可以根據需求方便的添加修改規則。但是隨著智能家居系統的不斷擴大,系統設備的增多以及帶來的用戶需求的日益復雜,規則系統也變得更加繁雜,不同規則之間可能發生沖突。本文介紹了智能家居系統中的核心部分——規則系統,研究了規則引擎的工作方式,揭示了規則沖突問題的重要性。對智能家居中的規則沖突問題進行了研究分析,并提出了避免規則沖突問題的方法。
關鍵詞:智能家居;規則沖突;沖突檢測
中圖分類號:G642? ? ? ? 文獻標識碼:A
文章編號:1009-3044(2021)01-0199-03
1規則系統
在智能家居系統中,規則系統是一個核心模塊,用戶是通過制定規則來享受系統帶來的便利,對于系統中規則的存儲,規則的分解、匹配,規則間沖突的避免和檢測以及規則的執行都是通過規則系統來完成的。規則系統在本文提及的智能家居結構中位于業務層,承上啟下,發揮著非常重要的作用。規則系統包括規則存儲模塊,規則引擎模塊和沖突檢測模塊三個部分。規則存儲模塊即規則庫,可以用來匹配以及規則展示。規則引擎對規則庫和事件庫進行匹配,在匹配前需要規則沖突檢測模塊對規則庫進行檢測,如果有沖突,則需要修改規則以避免規則沖突帶來的問題,可見規則沖突檢測對系統的重要性。如果匹配成功,則觸發規則執行模塊去執行動作部分。
1.1 規則引擎技術
規則引擎起源于基于規則的專家系統,它是在推理引擎的基礎上發展而來的,是一種嵌入在程序內的組件[1]。專家系統實際上是一個計算機程序,只是它包含著特定領域大量的知識和經驗,通過推理可以得到類似專家級別的效果。
規則引擎一般包括工作內存、匹配器、規則集容器和執行器幾個部分,其結構如圖所示。(1)規則集容器連接著存儲規則的數據庫,用于將規則數據庫中的規則取出來以待匹配,是匹配前的規則緩存模塊。(2)工作內存則相當于一個事件庫,其中存放著當前的環境參數,設備狀態等事件信息。(3)匹配器將規則集容器和工作內存連接起來,分別對兩者中的規則和事件進行匹配,若匹配成功,則可以執行該規則。(4)執行器則存儲著匹配成功的規則,并且系統會去按一定順序執行這個規則的動作部分。
規則引擎的工作流程如下所示:
1)調用規則沖突檢測模塊對規則數據庫中的規則進行沖突檢測,如果沖突,則將沖突規則返回修改;
2)從規則庫中取出需要匹配的規則放到規則集容器,并轉化成一定的形式以便匹配;
3)更新工作內存中的數據,即更新事件庫;
4)匹配器對容器中規則和工作內存中的事件進行匹配,并將匹配成功的規則加入執行器;
5)執行器按照某種預定順序去執行匹配成功規則的動作。
規則引擎適合比較復雜的而且沒有明確清晰的解決方案的場景,對于需要動態更新,基于一定數據量能夠很快做出決策的場景也非常適用。目前常見的商業引擎有ILOG的JRules和Jess,商業引擎做得比較成熟好用,穩定性高,但缺點是其價格非常昂貴。作為一個商業引擎,Jess并不是開源的,但是好在對于學術研究用途是免費提供的,只有商業用途時才需要付費,因此基于Jess的研究項目非常多。而Drools則是目前最活躍的開源引擎。
1.2 Rete算法
在規則引擎中,規則匹配模塊尤為重要,其匹配質量和效率直接影響著規則引擎的好壞。常用模匹配算法有Rete,Leaps,Treat等。目前許多規則引擎的匹配算法都是基于1982年Forgy提出的RETE算法改進而成的[2]。
Rete算法是一種高效的前向鏈型匹配算法,它是基于時間冗余性和結構相似性這兩個基本的假設。(1)時間冗余性,即在每個執行周期,往往只有一小部分的事實發生了變化,如果每次對所有的事實重新匹配,效率非常低下,因此可以記錄下已經匹配過得事實,然后下次匹配只對變化的事實進行匹配。(2)結構相似性,是指許多規則之間往往具有比較相似的模式和模式組。
在產生式系統(productionsystem)中,被處理的數據稱為工作內存(workingmemory),一條產生式規則分為兩個部分前提(LHS)和結論(RHS),進行匹配的主要流程可以分為:
(1)匹配找出符合條件部分的workingmemory集合;
(2)然后選擇一個條件被滿足的規則;
(3)執行該規則的動作部分;
(4)返回(1);
Rete算法主要是通過構建一個匹配網絡來提升匹配步驟的效率,該匹配網絡分為aloha網絡和beta網絡兩個部分進行匹配。Rete算法的核心思路是將在過去匹配過程中的全部信息保存下來,用于再次匹配時的篩選,以便提高匹配效率。在不斷循環匹配中,通過記住已經匹配過的事實,然后只去計算新刪除或新添加的事實所引發的變化,僅通過變化的事實去匹配其對應的規則,因為每次事實的變化相對于規則來說是少量,因此這種從事實去匹配規則的演繹推理能有效降低計算量,提升匹配效率。但隨之而來的問題就是需要占用大量的內存資源,運行成本增加。
2規則沖突類型分析
所謂規則,就相當于一條完整的控制指令。基于物聯網的智能家居傳感網絡可以從當前環境狀態下獲取相關環境狀態參數以及設備狀態參數,如果滿足用戶設定的觸發條件,控制系統便控制設備對當前環境或者設備狀態進行改變。規則可以分為條件(Condition)部分和動作(Action)部分。即IF條件部分滿足,THEN執行動作部分的相應動作。
本文可以將規則抽象成是由用戶(User),觸發器(Triggers)和執行器(Actuators),環境實體(Environments)四個部分組成[3]。其中用戶中包括用戶ID以及用戶權限,觸發器中包括條件中涉及的環境實體的ID,觸發條件,以及該觸發條件優先級。環境實體中包括環境實體ID,以及它前狀態和后狀態。執行器中包括執行動作中涉及環境實體的ID以及動作(Action)。通過對上述規則模型分析,可以發現規則之間可能會有相似觸發條件,相似執行動作,相反執行動作等關系,進一步總結這些關系得出了下述幾種規則沖突類型:
1)執行動作相反沖突。執行動作相反沖突即當前狀態下,兩條規則的條件部分都得到滿足,并且兩規則優先級相同,即兩條規則同時被觸發時,如果兩條規則的執行器是對相同環境實體采取相反的動作,即發生了執行動作相反沖突。例如下面兩條規則:
RA:當溫度大于28℃時,則打開空調;
RB:當溫度大于28℃時,則關閉空調。
2)影子沖突。影子沖突即兩條規則的觸發條件部分有相互包含的關系,而且兩規則的執行器對同一環境實體采取了相同的操作。比如:
RA:如果室內PM2.5濃度>35mg/m?,則打開空氣凈化器;
RB:如果室內PM2.5濃度>45mg/m?,則打開空氣凈化器。
如果當前室內的PM2.5是50mg/m?,兩條規則皆符合。但考慮當前室內PM2.5濃度是40mg/m?時,顯然未滿足RB的觸發條件,但滿足RA要打開空氣凈化器的條件,顯然這兩條規則之間是沖突的。
3)依賴沖突。依賴沖突是指RA的觸發條件恰好是RB執行后的狀態,而RB的觸發條件也恰好是RA執行后的狀態,兩條規則的觸發條件和對方的執行后狀態互為依賴型。例如下面兩條規則:
RA:如果打開照明燈光,則關閉窗簾;
RB:如果關閉了窗簾,則打開照明燈光。
上述兩條規則如果單獨存在,則可以正常運行,但是如果兩條規則同時存在,一旦一條規則被觸發,比如打開了燈光,那么將會關閉窗簾,相應地B規則也會被觸發,這樣兩條規則會不斷進行循環執行,占用系統資源,影響系統穩定性。在依賴沖突里,上述兩條規則間的依賴是一種直接依賴,還有可能就是有三條或三條以上的規則之間存在著間接依賴關系。
3規則模型
本文是基于本體和SWRL規則語言對智能家居規則沖突問題進行研究的,因此將使用SWRL建立規則。
SWRL是一種語義網規則表示語言,由W3C在2004年提出。SWRL結合了本體語言OWLDL,OWLLite與規則標記語言SWRLML[4]。SWRL允許用戶編寫基于OWL概念表示的規則,而且它能夠提供比OWL語言更加強大的推理能力。在語義上,SWRL是建立在與OWL相同的描述邏輯基礎上,并在執行推理時提供類似的強形式保證。
在形式上,一條SWRL規則分為兩個部分,一個前提(antecedent)與一個結論(consequent)。Antecedent部分在owl文件中使用Body標簽,consequent在owl文件中使用Head標簽。即SWRL規則可以抽象為如下所示的形式:
Antecedent—>Consequent。
其中Body和Head部分都可以包含一個或者多個原子(atoms)。所以也可以將規則表示成:
atom^atom^atom^…—>atom^atom^…
它所表示的意思是只要前提部分的所有atoms都為真,就可以得到結論部分所有的atoms也為真。一個atom是形如:
P(arg1,arg2,arg3…argn)
其中P是一個謂詞符號,其中arg1, arg2,…,argn是表達式的項或參數。在SWRL中,支持五種類型的謂詞:OWL類、OWL屬性、數據類型、數據范圍和內置函數。參數可以是OWL個體或數據值或引用它們的變量。SWRL中的所有變量都被視為普遍的量化,其范圍僅限于給定的規則。
在SWRL中約定了一種規范,用戶是按照這些規范去方便的制定規則的。它主要分為四個部分:Imp、Atom、Variable和Building。Imp包括head和body,head表示的是這條規則的結果部分,body則是這個結果需要滿足的所有條件的交,在head和body中包含著的一個個實例則是由原子和變量(variable)組成的。在Atom中包含了幾種限制表達式,其主要可分為以下幾類:C(x),P(x,y), sameAs(x,y) 以及differentFrom(x,y)。C表示的是OWL中的類,P是OWL屬性,括號中的x,y可以是變量,可以是owl個體(owlindividual),也可以是owl數據值。SameAs表示x和y相等,diffrentfrom表示x和y不相等。Building是SWRL內置的模塊化元件,在編寫規則時可以直接使用。
SWRL中提供了七種atoms:ClassAtoms、IndividualPropertyatoms、DataValuedPropertyatoms、DifferentIndividualsatoms、SameIndividualatoms、Built-inatoms、DataRangeatoms。下面列出一條簡單的SWRL規則實例:
hasParent(?x , ?y)^hasBrother(?y , ?z)->hasUncle(?x,?z)
這條規則是說如果y是x的父親并且z是y的兄弟,那么我們便可以得到z是x的叔叔。根據上述其中不同的atoms以及它們之間自由的組合,我們便可以使用SWRL構建強大的規則庫,結合本體知識庫和SWRL,便可以使用推理機進行推理,挖掘中知識庫中隱藏的大量信息。
如果一條規則條件部分包含了“∧”和“∨”這樣的邏輯運算符,那么規則往往可以通過這種邏輯組合表示的特別復雜。復雜的規則形式會使沖突檢測變得困難,為解決這一問題,我們可以使用析取范式來將復雜的規則轉化為基本的簡單規則。比如形如:f:A1∧A2∧(A3∨(A4∧A5))->B1∧B2的一條規則,通過拆分化簡可以將其分解為下述兩條簡單規則::A1∧A2∧A3->B1∧B2與A1∧A2∧A4∧A5->B1∧B2,這樣處理后會方便進行沖突檢測。
4一種基于智能家居的規則沖突避免機制
基于智能家居系統中規則沖突的常見性以及帶來的不良后果,必須有一套規則沖突避免和檢測機制。在規則系統中,如果對所有的規則都進行規則沖突檢測的話,一是如果規則庫非常龐大,那么所帶來的時間開銷和資源開銷也會大為增加。二是其實沒有必要進行全部檢測,在日常場景中,我們對各種家居設備操作的頻率以及它們的重要性都有非常大的差異,因此可以在檢測之前采用一定方法進行規則沖突的避免。可以基于優先級或者是“先進后出”的方法去執行規則。“先進后出”即一種類似棧機制的一種方法,即后添加的規則先被激活,先添加的后被激活,由于這種方式并不適合多任務并發的智能家居場景,因此暫不做討論。下面將提出基于場景優先級和基于用戶優先級的規則沖突避免方法。
4.1 基于場景優先級
在智能家居系統中,用戶可以將所需要執行的任務劃分為多個場景類型,每一個任務就對應著一條規則,而為每一條規則設定一個場景類型。比如現在有如下兩條規則,RA:當檢測到室內煙霧濃度高時,就打開窗戶并打開煙霧報警;RB:當打開音響時,關閉窗戶。那么如果在煙霧濃度過高時,恰好打開了音響,這時兩條規則便發生了沖突。但明顯RA涉及安全,更為重要,需要優先執行,因此我們可以將這兩條規則加入不同的場景類型中,并按照類型的重要性為場景類型設置不同的優先級,正好避免了這種沖突的發生[5]。
我們可以將場景劃分為以下四種場景類型:
1)安全場景。R1:如果在夜間,窗戶或者門被打開,則打開燈光,打開報警器;
2)娛樂場景。R2:如果打開家庭影院,則關閉窗簾,關閉燈光。
3)能量場景。R3:當家用電器總功率超過2000W時且溫度低于28℃時,則關閉空調。
4)環境場景。如果有人在家且室內PM2.5濃度>35mg/m?,則打開空氣凈化器。
根據不同的需求,用戶可以靈活的設定各場景的優先級。例如:當家里有成人且孩子在家時,我們可以把娛樂場景設置到最高優先級,安全場景次之。當家中有老人時我們又可將環境場景設置到最高優先級,為老人的健康提供一定的服務。
對于不同場景類型的規則之間的沖突使用優先級便可以避免。對于同一場景類型中規則之間的沖突,我們可以使用沖突檢測算法進行檢測,此時由于進行的場景劃分,沖突檢測時需要遍歷的規則數也將減少,效率也會提高。
4.2 基于用戶優先級
此外,還可以進行基于用戶優先級的沖突避免。在家庭中往往有多個人同時生活,相應的也將會有多個用戶可以制定規則。由于不同用戶需求不同,因此不同用戶之間制定的規則具有隨機性,很可能會發生沖突。如果現在系統中存在兩個用戶,A用戶制定了一條R1:在早晨七點到八點之間打開窗戶進行通風。B用戶制定了一條R2:在晚上10點后到早晨10點前,關閉窗戶,以便睡眠不被噪聲干擾。那么在這兩段時間重合的區域,系統將會發生規則沖突。為解決上述問題,可以采用類似設置用戶權限的方法,為A,B用戶設定不同的優先級,當不同用戶的規則發生沖突時,系統將選擇執行優先級高的用戶的規則,從而可以避免這種類型的沖突發生。
可見,上述基于優先級的規則沖突避免機制很好地將各用戶,各需求場景之間的沖突進行了避免,可以使得不同用戶不同場景規則的添加變得更為豐富靈活同時又不影響規則的執行,也降低了沖突檢測模塊的復雜度。其主要分為兩個階段,首先是場景任務的添加階段,此時涉及了同一類型場景的沖突檢測,如果有沖突,則提醒用戶進行規則修改,如果沒有沖突,則進行場景任務執行階段,此階段便可以基于預設的場景優先級以及用戶優先級,決定執行哪些規則。
參考文獻:
[1] 劉偉. Java規則引擎——Drools的介紹及應用[J]. 網絡新媒體技術, 2005,26(6):717-721.
[2] Forgy CL. Rete: a fast algorithm for the many pattern/many object pattern match problem[M]. Expert systems. IEEE Computer Society Press, 1991:547-559.
[3] SunY, WangX, LuoH, etal. Conflict Detection Scheme Based on Formal Rule Model for Smart Building Systems[J]. IEEE Transactionson Human-Machine Systems, 2015, 45(2):215-227.
[4] 金保華, 林青, 付中舉, 等. 基于SWRL的應急案例庫的知識表示及推理方法研究[J]. 科學技術與工程, 2012, 12(33):9049-9055.
[5] 潘平安. 基于Zigbee和Android的智能家居系統的研究與實現[D].華東交通大學.2017
【通聯編輯:王力】