推理引擎
推理引擎就是應用系統中用
來完成推理功能的模塊,也能夠稱做推理機。推理機通常包括調度器,執行器和一致性協調器三部分。調度器控制整個推理流程,使得推理能夠按照必定的流程進行下去;執行器執行調度器所選定的動做,而且負責讀取知識庫中的知識和全局黑板中的信息;一致性協調器保持推理中間結果的一致性,主要用於反向推理中。
推理引擎根據知識表示的不一樣採起的控制策略也是不一樣的,在這裏咱們所實現的是基於產生式規則集的知識表示。選擇這種知識表示是由於其具備不少的優勢,尤爲是其易於理解、易於獲取、易於管理,而且在現今的大多數智能應用系統中都採用了這種知識表示方法。基於這種知識表示的推理引擎採用「識別-動做"的方式來循環執行規則。 java
規則引擎
規則引擎由
推理引擎發展而來,是一種嵌入在應用程序中的組件
,實現了將業務決策從應用程序代碼中分離出來,並使用預約義的語義模塊編寫業務決策。接受數據輸入,解釋業務規則,並根據業務規則作出業務決策。
應用背景: 企業級管理者對企業IT系統的開發有着以下的要求:
1.爲提升效率,管理流程必須自動化,即便現代商業規則異常複雜。
2.市場要求業務規則常常變化,IT系統必須依據業務規則的變化快速、低成本的更新。
3.爲了快速、低成本的更新,業務人員應能直接管理IT系統中的規則,不須要程序開發人員參與。
使用規則引擎能夠經過下降實現複雜業務邏輯的組件的複雜性,下降應用程序的維護和可擴展性成本,其優勢以下:
· 分離商業決策者的商業決策邏輯和應用開發者的技術決策;
· 能有效的提升實現複雜邏輯的代碼的可維護性;
· 在開發期間或部署後修復代碼缺陷;
· 應付特殊情況,即客戶一開始沒有提到要將業務邏輯考慮在內;
大多數規則引擎都支持規則的次序和規則衝突檢驗,支持簡單腳本語言的規則實現,支持通用開發語言的嵌入開發。目前業內有多個規則引擎可供使用,其中包括商業和開放源碼選擇。開源的表明是Drools,商業的表明是VisualRules ,iLog。 數據庫
規則引擎是解析、調用、執行規則包的服務,目前VisualRules採用java語言來實現規則引擎,而且提供了java類接口、Socket、Servlet、SOAP等多種外部調用接口。其實Java類接口是全部這些接口的核心,其餘接口其實也是經過Java類接口來加以調用。考慮到最小化規則引擎,所以規則包的解析工做已經放在規則編輯時,預先進行了處理。規則引擎只處理規則包的調用和執行,同時爲規則包用到的
數據庫接口、Excel接口、內存表接口、Xml接口提供缺省的實現。
規則引擎執行原理
VisualRules規則引擎會根據規則包名稱,取得對應規則包編譯後的rsc文件。而後將rsc加載到內存中,生成規則包執行上下文。同時規則引擎將傳遞的參數傳遞到規則包執行上下文中,而後開始執行規則包。執行完畢後,再將規則包執行上下文中的數據,傳回給調用規則包的應用程序。整個執行原理很是簡單,所以最大限度的保證了規則運行平臺的穩定以及最佳的性能。 dom
規則包的對象庫中,定義瞭如下一些
數據庫對象接口Database、Table、Select、View、Procedure。VisualRules規則引擎直接用JDBC來實現這些接口,最大限度的保證了
數據庫對象調用的性能。固然用戶能夠根據本身的須要,從新來實現這些
數據庫接口。
Excel接口 性能
規則包須要調用的Excel接口主要是IExcelBook、IExcelSheet、IExcelTableSheet、IExcelXYSheet。VisualRules規則引擎採用POI來實現Excel接口。 spa
內存表格接口
規則包須要調用的內存表格接口爲Sheet,VisualRules採用Object[][]來實現內存表格接口的實現。
Xml接口 htm
規則包須要調用的XML接口爲Node。目前VisualRules採用Jdom來實現。 對象
如何調用 接口
規則引擎是外部Java程序調用規則包的一組Java類,其包含在engine.jar中。 外部Java程序調用規則包時只須要用到兩個類。一個是 com.flagleader.engine.RuleEngine 。另外一個是 com.flagleader.engine.RuleEngineFactory 。
RuleEngineFactory是獲得規則引擎實例的工廠類。 一般代碼爲
RuleEngine ruleEngine = RuleEngineFactory.newInstance().getRuleEngine();
獲得規則引擎實例後,能夠調用規則引擎中的方法,主要是put、excute和get這三個方法。 put用於傳入須要傳入的值,excute用於運行指定的規則包,get用於獲得傳出的值。 通常的調用代碼爲:
ruleEngine.put(傳入對象);
ruleEngine.excute("規則包調用名");
傳出對象 = ruleEngine.get("傳出對象名");
所以外部程序調用規則包很是簡單。只需以上幾行代碼就能夠完成應用。
----from 百度百科 內存