日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Jess学习基础(二)

發布時間:2024/3/7 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Jess学习基础(二) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

項目要開發一個專家系統,以Jess進行推理決策,以Java作為外層框架進行開發。因為專家系統方向的資料比較少,目前仍然在摸索中。把已經掌握的知識寫出了,給個參考。
好在Jess官方提供了一個java+jess的example,雖然沒有說明,慢慢摸索理解了一下, 在此與大家分享。

之前的博客中已經給出了Jess作為插件在Eclipse中的安裝過程,在此可以直接使用。


一、工程搭建



1、新建一個Dynamic web project;
2、增加jess.jar包,并bulid path;
3、 在該工程中新建一個*.clp文件。(新建文件,手動增加后綴為.clp即可)

如圖:

得到的目錄如下圖:

二、源碼分析


下面我們來看項目的源碼。

這是一個價格計算的項目,根據消費者購買的商品的數量、價格等進行打折或者提供贈品。

model包中提供了商品目錄CatalogItem.java、消費者消費次數Customer.java、消費者訂單Order.java及商家提供的優惠活動Offer.java。

demo包中的demo.java是主程序入口,DemoDatabase.java提供數據接口的實現。

diagnosis包中Database.java提供數據接口,PricingEngine.java實現價格計算引擎。正是PricingEngine.java實現了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();//創建Jess規則引擎engine.reset();// Load the pricing rulesengine.batch("pricing.clp");//加載價格規則// Load the catalog data into working memorydatabase = aDatabase;engine.addAll(database.getCatalogItems());//加載目錄數據到工作存儲區// Mark end of catalog data for latermarker = engine.mark();//標記目錄數據}private void loadOrderData(int orderNumber) throws JessException {// Retrive the order from the databaseOrder order = database.getOrder(orderNumber);//從數據庫獲取訂單if (order != null) {// Add the order and its contents to working memory,增加訂單及訂單目錄到工作存儲區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);//重置規則引擎// Load data for this orderloadOrderData(orderNumber);//加載數據// Fire the rules that apply to this order engine.run();//啟動規則引擎// Return the list of offers created by the rulesreturn engine.getObjects(new Filter.ByClass(Offer.class));} }

將數據庫中的內容增加到規則庫的存儲區中,通過PricingEngine規則引擎來加載規則庫

那么,Java如何帶動這個規則引擎呢?
下面給出Demo中的main函數,可以看到,通過新建規則庫,可以很容易地將規則引擎加入到Java中。

public static void main(String[] args) {try {DemoDatabase database = new DemoDatabase();//新建數據庫PricingEngine engine = new PricingEngine(database);//新建規則引擎processOrder(database, engine, 123);//處理訂單processOrder(database, engine, 567);processOrder(database, engine, 666);} catch (JessException e) {e.printStackTrace();}}

那么,將Jess的規則處理加入到了Java中,它是如何處理數據的呢

下面是pricing.clp 中的內容

(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中的對象了。

(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))))

這一部分的功能是對所有的訂單消費超過100$的消費者打九折的優惠。
在Order中的{total}是方法名去掉get,并且將首字母變為小寫(如果緊挨著的第二個字母也是大寫,則不會變為小寫,編寫代碼時會有智能提示),而不是Java類中的變量名。

程序的運行結果如下

總結

以上是生活随笔為你收集整理的Jess学习基础(二)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。