Jess学习基础(二)
項目要開發(fā)一個專家系統(tǒng),以Jess進行推理決策,以Java作為外層框架進行開發(fā)。因為專家系統(tǒng)方向的資料比較少,目前仍然在摸索中。把已經(jīng)掌握的知識寫出了,給個參考。
好在Jess官方提供了一個java+jess的example,雖然沒有說明,慢慢摸索理解了一下, 在此與大家分享。
之前的博客中已經(jīng)給出了Jess作為插件在Eclipse中的安裝過程,在此可以直接使用。
一、工程搭建
1、新建一個Dynamic web project;
2、增加jess.jar包,并bulid path;
3、 在該工程中新建一個*.clp文件。(新建文件,手動增加后綴為.clp即可)
如圖:
得到的目錄如下圖:
二、源碼分析
下面我們來看項目的源碼。
這是一個價格計算的項目,根據(jù)消費者購買的商品的數(shù)量、價格等進行打折或者提供贈品。
model包中提供了商品目錄CatalogItem.java、消費者消費次數(shù)Customer.java、消費者訂單Order.java及商家提供的優(yōu)惠活動Offer.java。
demo包中的demo.java是主程序入口,DemoDatabase.java提供數(shù)據(jù)接口的實現(xiàn)。
diagnosis包中Database.java提供數(shù)據(jù)接口,PricingEngine.java實現(xiàn)價格計算引擎。正是PricingEngine.java實現(xiàn)了pricing.clp與Java程序連接。
下面是PricingEngine.java中的源碼部分。
public class PricingEngine {private Rete engine;private WorkingMemoryMarker marker;private Database database;public PricingEngine(Database aDatabase) throws JessException {// Create a Jess rule engineengine = new Rete();//創(chuàng)建Jess規(guī)則引擎engine.reset();// Load the pricing rulesengine.batch("pricing.clp");//加載價格規(guī)則// Load the catalog data into working memorydatabase = aDatabase;engine.addAll(database.getCatalogItems());//加載目錄數(shù)據(jù)到工作存儲區(qū)// Mark end of catalog data for latermarker = engine.mark();//標記目錄數(shù)據(jù)}private void loadOrderData(int orderNumber) throws JessException {// Retrive the order from the databaseOrder order = database.getOrder(orderNumber);//從數(shù)據(jù)庫獲取訂單if (order != null) {// Add the order and its contents to working memory,增加訂單及訂單目錄到工作存儲區(qū)engine.add(order);engine.add(order.getCustomer());engine.addAll(order.getItems());}}public Iterator run(int orderNumber) throws JessException {// Remove any previous order data, leaving only catalog dataengine.resetToMark(marker);//重置規(guī)則引擎// Load data for this orderloadOrderData(orderNumber);//加載數(shù)據(jù)// Fire the rules that apply to this order engine.run();//啟動規(guī)則引擎// Return the list of offers created by the rulesreturn engine.getObjects(new Filter.ByClass(Offer.class));} }將數(shù)據(jù)庫中的內(nèi)容增加到規(guī)則庫的存儲區(qū)中,通過PricingEngine規(guī)則引擎來加載規(guī)則庫
那么,Java如何帶動這個規(guī)則引擎呢?
下面給出Demo中的main函數(shù),可以看到,通過新建規(guī)則庫,可以很容易地將規(guī)則引擎加入到Java中。
那么,將Jess的規(guī)則處理加入到了Java中,它是如何處理數(shù)據(jù)的呢
下面是pricing.clp 中的內(nèi)容
(import model.*) (deftemplate Order (declare (from-class Order))) (deftemplate OrderItem (declare (from-class OrderItem))) (deftemplate CatalogItem (declare (from-class CatalogItem))) (deftemplate Customer (declare (from-class Customer)))(defrule 10%-volume-discount"Give a 10% discount to everybody who spends more than $100."?o <- (Order {total > 100})=>(add (new Offer "10% volume discount" (/ ?o.total 10))))可以看到(import model.*) 同Java中的import是一致的。
(declare (from-class Order))這一部分正是從Java的類中獲得的。這樣Jess就可以使用Java中的對象了。
這一部分的功能是對所有的訂單消費超過100$的消費者打九折的優(yōu)惠。
在Order中的{total}是方法名去掉get,并且將首字母變?yōu)樾?#xff08;如果緊挨著的第二個字母也是大寫,則不會變?yōu)樾?#xff0c;編寫代碼時會有智能提示),而不是Java類中的變量名。
程序的運行結(jié)果如下
總結(jié)
以上是生活随笔為你收集整理的Jess学习基础(二)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: RPC通信协议远程服务调用(25)Jav
- 下一篇: 110配线架打法图解_配线架打线的方法以