<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-16  評論-54  文章-0  trackbacks-0
     

    1      Java規(guī)則系統(tǒng)簡介

    在大型商業(yè)系統(tǒng)中,業(yè)務(wù)規(guī)則、商業(yè)邏輯等等都會(huì)比較復(fù)雜。而且在很多大型系統(tǒng)當(dāng)中,很多業(yè)務(wù)規(guī)則、商業(yè)邏輯并不是一成不變的。甚至當(dāng)系統(tǒng)進(jìn)入生產(chǎn)階段時(shí),客戶的業(yè)務(wù)規(guī)則、商業(yè)邏輯也會(huì)改變。某些系統(tǒng)要求甚至更高,要求能24小時(shí)不停機(jī),并且能夠?qū)崟r(shí)修改商業(yè)規(guī)則。這就對商業(yè)系統(tǒng)提出了較大的挑戰(zhàn)。如果將這些可變的規(guī)則直接編寫到代碼里面的話,業(yè)務(wù)規(guī)則一旦改變,就要修改代碼。并由此帶來編譯、打包、發(fā)布等等問題。這對于生產(chǎn)系統(tǒng)來說是極不方便的。因此,如何考慮把一些可變的業(yè)務(wù)規(guī)則抽取到外面,使這些業(yè)務(wù)規(guī)則獨(dú)立于程序代碼。并最好是能夠?qū)崟r(shí)的修改業(yè)務(wù)規(guī)則,這樣就可以做到不用打包編譯發(fā)布等等。

    值得慶幸的是現(xiàn)在出現(xiàn)了一些Java規(guī)則引擎(Rule Engine),專門解決以上所述的問題。利用它,我們就可以在應(yīng)用系統(tǒng)中分離客戶的商業(yè)決策邏輯和應(yīng)用開發(fā)者的技術(shù)決策,并把這些商業(yè)規(guī)額則放在中心數(shù)據(jù)庫或其他統(tǒng)一的地方,讓它們能在運(yùn)行時(shí)可以動(dòng)態(tài)地管理和修改。

    JbossRules是一個(gè)優(yōu)秀的JAVA規(guī)則引擎,其前身是Drools3,后來被Jboss合并并改名為JbossRules

    1.1基于規(guī)則的專家系統(tǒng)簡介

    人工智能是一個(gè)新興的學(xué)科,它是想讓計(jì)算機(jī)模擬人腦的思維和推理模式。人工智能分成如下幾個(gè)主要的分學(xué)科:

    知識表示

    神經(jīng)網(wǎng)絡(luò)

    基因算法

    決策樹

    專家系統(tǒng)

    等等幾個(gè)學(xué)科

    知識表示是人工智能中的一個(gè)基礎(chǔ)領(lǐng)域,其目的是如何更好的在計(jì)算機(jī)當(dāng)中描述已存在的事實(shí)。專家系統(tǒng)就是使用知識表示,來做規(guī)則推理,得出最后的結(jié)論來。

    Java規(guī)則引擎起源于基于規(guī)則的專家系統(tǒng),而基于規(guī)則的專家系統(tǒng)又是專家系統(tǒng)的其中一個(gè)分支。專家系統(tǒng)屬于人工智能的范疇,它模仿人類的推理方式,使用試探性的方法進(jìn)行推理,并使用人類能理解的術(shù)語解釋和證明它的推理結(jié)論。為了更深入地了解Java規(guī)則引擎,下面簡要地介紹基于規(guī)則的專家系統(tǒng)。RBES包括三部分:Rule Baseknowledge base)、Working Memoryfact base)和Inference Engine。它們的結(jié)構(gòu)如下系統(tǒng)所示:

    如上圖所示,推理引擎包括三部分:模式匹配器(Pattern Matcher)、議程(Agenda)和執(zhí)行引擎(Execution Engine)。推理引擎通過決定哪些規(guī)則滿足事實(shí)或目標(biāo),并授予規(guī)則優(yōu)先級,滿足事實(shí)或目標(biāo)的規(guī)則被加入議程。模式匹配器決定選擇執(zhí)行哪個(gè)規(guī)則,何時(shí)執(zhí)行規(guī)則;議程管理模式匹配器挑選出來的規(guī)則的執(zhí)行次序;執(zhí)行引擎負(fù)責(zé)執(zhí)行規(guī)則和其他動(dòng)作。

    和人類的思維相對應(yīng),推理引擎存在兩者推理方式:演繹法(Forward-Chaining)和歸納法(Backward-Chaining)。演繹法從一個(gè)初始的事實(shí)出發(fā),不斷地應(yīng)用規(guī)則得出結(jié)論(或執(zhí)行指定的動(dòng)作)。而歸納法則是根據(jù)假設(shè),不斷地尋找符合假設(shè)的事實(shí)。Rete算法是目前效率最高的一個(gè)Forward-Chaining推理算法,許多Java規(guī)則引擎都是基于Rete算法來進(jìn)行推理計(jì)算的。

    正向推理:

     

    正向推理圖形如下:

    正向推理引擎的推理步驟如下:

    將初始數(shù)據(jù)(fact)輸入Working Memory

    使用Pattern Matcher比較規(guī)則庫(rule base)中的規(guī)則(rule)和數(shù)據(jù)(fact)。

    如果執(zhí)行規(guī)則存在沖突(conflict),即同時(shí)激活了多個(gè)規(guī)則,將沖突的規(guī)則放入沖突集合。

    解決沖突,將激活的規(guī)則按順序放入Agenda

    使用執(zhí)行引擎執(zhí)行Agenda中的規(guī)則。重復(fù)步驟25,直到執(zhí)行完畢所有Agenda中的規(guī)則。

    直到得出最終的結(jié)果為止

    反向推理:

     

    反向推理是目標(biāo)驅(qū)動(dòng)的推理方式。從目標(biāo)出發(fā),找出所有能滿足該目

    標(biāo)的子目標(biāo)。這樣一直推導(dǎo)下去,直到所有的子目標(biāo)都已經(jīng)滿足為止。

    1.2Java規(guī)則引擎

    Java規(guī)則引擎是一種嵌入在Java程序中的組件,它的任務(wù)是把當(dāng)前提交給引擎的Java數(shù)據(jù)對象與加載在引擎中的業(yè)務(wù)規(guī)則進(jìn)行測試和比對,激活那些符合當(dāng)前數(shù)據(jù)狀態(tài)下的業(yè)務(wù)規(guī)則,根據(jù)業(yè)務(wù)規(guī)則中聲明的執(zhí)行邏輯,觸發(fā)應(yīng)用程序中對應(yīng)的操作。

    一般來說,一條規(guī)則的形式如下:

    when

        <conditions>

    then

        <actions>

    也就是說,當(dāng)conditions成立的話,就做下面的actions。其中actions可以為生成新的事實(shí)、或者做其他動(dòng)作,比如,發(fā)送email通知、執(zhí)行一些本地任務(wù)等等。

    1.3    JAVA規(guī)則引擎的優(yōu)點(diǎn)

    聲明式編程

    聲明式編程,規(guī)則引擎讓我們直到“做什么”,而不用直到“怎么做”。我們只要把一系列規(guī)則表示出來后。具體的推理動(dòng)作就交給規(guī)則引擎來處理。

    邏輯和數(shù)據(jù)分開

    將可變的業(yè)務(wù)邏輯和數(shù)據(jù)分開。雖然,這違背了面向?qū)ο笤瓌t。面向?qū)ο髲?qiáng)調(diào)數(shù)據(jù)和業(yè)務(wù)邏輯耦合。但是,對于一些易變而復(fù)雜的業(yè)務(wù)規(guī)則。如果散步在程序的各個(gè)地方、各個(gè)層次。那么一旦業(yè)務(wù)規(guī)則更改的話,就會(huì)出現(xiàn)“牽一發(fā)而動(dòng)全身”的局面。因此,將可變的業(yè)務(wù)邏輯獨(dú)立出來管理,將有助于后面的業(yè)務(wù)變更。

    性能

    Rete算法的性能比較高。

    知識集中表示

    通過使用規(guī)則,我們把規(guī)則集中存放起來,從而使系統(tǒng)知識能夠集中表示。

    可讀性

    規(guī)則的可讀性比較高。對于熟悉業(yè)務(wù)規(guī)則。但不會(huì)程序開發(fā)的業(yè)務(wù)專家,只要熟悉規(guī)則的標(biāo)示,也可以編寫和修改業(yè)務(wù)規(guī)則。

    1.4    使用JAVA規(guī)則系統(tǒng)的場合

    那么,在那些場合下適合應(yīng)用JAVA規(guī)則系統(tǒng)呢?總而言之,可以用一句話來概括:當(dāng)用傳統(tǒng)的程序開發(fā),無法得到一種優(yōu)雅的解決方法的時(shí)候,就可以考慮使用規(guī)則系統(tǒng)。如下的一些場合:

    用傳統(tǒng)的代碼開發(fā)比較復(fù)雜、繁瑣

    問題雖然不復(fù)雜,但是用傳統(tǒng)的代碼開發(fā)比較脆弱,也就是經(jīng)常修改

    沒有優(yōu)雅的算法

    業(yè)務(wù)規(guī)則頻繁改變

    有很多業(yè)務(wù)專家、不懂技術(shù)開發(fā)

    1.5    不適合使用JAVA規(guī)則系統(tǒng)場合

    雖然規(guī)則系統(tǒng)看起來比較不錯(cuò),但是并不是任何地方都可以使用規(guī)則系統(tǒng)。很多簡單、固定的業(yè)務(wù)系統(tǒng),可以不用使用規(guī)則系統(tǒng)。規(guī)則系統(tǒng)也不能用來作為標(biāo)示重要的業(yè)務(wù)流程、不能用來作為工作流引擎。

    有很多程序員把JAVA規(guī)則系統(tǒng)當(dāng)成是一種動(dòng)態(tài)修改配置。也就是把一部分代碼邏輯抽取到外面,統(tǒng)一存放起來。這樣,當(dāng)一些配置修改的話,通過修改規(guī)則,就能修改代碼的一部分邏輯。如果把JAVA規(guī)則僅僅用在這個(gè)場合下的話,可以考慮采用腳本引擎。比如BeanShellJEXLGroovy等等。

    posted on 2008-10-28 12:15 jspark 閱讀(1562) 評論(1)  編輯  收藏

    評論:
    # re: JbossRules入門(一) 2008-10-28 18:44 | 123
    好。支持  回復(fù)  更多評論
      

    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 99久久久国产精品免费无卡顿| 国产高清视频免费在线观看 | 免费国产在线精品一区| 午夜神器成在线人成在线人免费| 亚洲天堂电影在线观看| 波多野结衣在线免费视频| 亚洲国产成人精品无码一区二区| 青青在线久青草免费观看| 免费在线观看一区| 国产免费131美女视频| 在线91精品亚洲网站精品成人| 国产一精品一aⅴ一免费| 污视频网站在线免费看| 亚洲日本一区二区三区在线不卡| 国产精品永久免费视频| 亚洲AV无码精品色午夜果冻不卡| 亚洲精品在线免费看| 亚洲中文字幕无码mv| 亚洲?v无码国产在丝袜线观看 | 国内精品一级毛片免费看| 亚洲人成电影亚洲人成9999网| 亚洲黄色免费电影| 亚洲人成电影网站色www| 免费永久在线观看黄网站| 中文日本免费高清| 亚洲欧洲校园自拍都市| 国产色爽免费视频| 国产免费一区二区三区不卡| 亚洲天堂一区二区三区四区| 白白国产永久免费视频| 久久久久久av无码免费看大片| 亚洲第一精品电影网| 日本黄色免费观看| 日本视频在线观看永久免费| 亚洲AV成人一区二区三区在线看| 亚洲精品国产精品国自产观看| 人妻丰满熟妇无码区免费| 亚洲а∨精品天堂在线| 精品国产综合成人亚洲区| 免费无码A片一区二三区| 91福利免费网站在线观看|