项目要开发一个专家系统,以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学习基础(二)相关推荐

  1. Jess学习基础(一)

    准备开发一个专家系统,经过前后比较和思考后决定使用Java+Jess进行开发.因此步入的学习Jess的道路. 1.Jess简介 Jess是用Java编写的专家系统开发平台.以CLIPS专家系统外壳为基 ...

  2. opengl基础学习专题 (二) 点直线和多边形

    题外话 随着学习的增长,越来越觉得自己很水.关于上一篇博文中推荐用一个 学习opengl的 基于VS2015的 simplec框架.存在 一些问题. 1.这个框架基于VS 的Debug 模式下,没有考 ...

  3. 【笔记】MySQL的基础学习(二)

    [笔记]MySQL的基础学习(二) MySQL 老男孩  一 视图 视图其实就是给表起个别名 1.创建视图 格式:CREATE VIEW 视图名称 AS SQL语句 CREATE VIEW v1 AS ...

  4. react ui框架_Web开发 React 学习(二十)连载基础篇大结局

    系列文章: 测开技能--Web开发 React 学习(一) 测开技能--Web开发 React 学习(二)环境搭建 测开技能--Web开发 React 学习(三)元素的渲染 测开技能--Web开发 R ...

  5. pythonsze_python学习笔记二 数据类型(基础篇)

    Python基础 对于Python,一切事物都是对象,对象基于类创建 不同类型的类可以创造出字符串,数字,列表这样的对象,比如"koka".24.['北京', '上海', '深圳' ...

  6. TCL/Tk基础学习(二)

    TCL/TK基础学习(二) 表达式 算术操作符 关系.逻辑.按位.选择操作符 函数 表达式 Tcl表达式由操作符.操作数.圆括号等构成.于C语言.verilog用法几乎相同. # 算术操作符.逻辑运算 ...

  7. LINUX学习基础篇(十二)痕迹命令

    LINUX学习基础篇(十二)痕迹命令 系统痕迹命令 w命令 who命令 last命令 lastlog命令 lastb命令 系统痕迹命令 系统中有一些重要的痕迹日志文件,如/var/log/wtmp./ ...

  8. 2021-07-14 深度学习基础与实践(二)

    深度学习基础与实践(二) 一.分类及其性能度量 1.分类问题 2.分类性能度量 (1)准确率 (2)精确率和召回率 (3)P-R曲线 (4)F值 (5)ROC曲线 3.分类性能可视化 (1)混淆矩阵的 ...

  9. Mendix敏捷开发零基础学习《二》-进阶(Microflow微流、表单验证、运算符、条件判断、数据嵌套、触发器、Debug问题跟踪、版本管理)

    目录结构 Mendix敏捷开发零基础学习<二> 一.Microflow微流 1.引言 2.常见的功能 3.微流可以做那些事情? 3.1 举例1(用微流打开新增页面) 3.2 举例2(用微流 ...

最新文章

  1. Neutron 物理部署方案 - 每天5分钟玩转 OpenStack(68)
  2. 解决Win8.1系统LYNC共享PPT提示“演示文稿遇到问题”
  3. 技术人员如何参与产品设计讨论:激活那一潭死水
  4. linux io测试陈旭,陈旭方案论证及器件选择.doc
  5. raspberry pi_如何启动新的Raspberry Pi
  6. 同频切换的事件_LTE前台路测切换问题处理大礼包
  7. AngularJS 监控对象属性:$watch和$digest
  8. 一条 update 语句引起的事故,这回可以长长记性了
  9. 深入理解计算机系统第四版_技术干货 |深入理解计算机系统之链接
  10. 编译原理完整学习笔记(四):语法分析
  11. 微分销机制设计_免费快速搭建微信分销商城_OctShop源码
  12. 综合计算增长比例计算机,比如2001-2010这10年GDP年均增长率怎么计算?
  13. 银行家算法和安全性算法笔记
  14. 推荐系统(一):不了解推荐系统,基本在被out的队列,岌岌可危
  15. Spring 让 LOB 数据操作变得简单易行,LOB 代表大对象数据,包括 BLOB 和 CLOB 两种类型
  16. Tomcat7 性能优化,提高并发-NIO模式
  17. Win8.1 安装NLTK及nltk数据
  18. gms认证流程_【热点资讯】详解Google GMS认证流程可大大缩短终端手机上市时间...
  19. Mina的zkApp
  20. Java:Java常考经典编程例题(二)

热门文章

  1. 哈工大软件构造 复习
  2. vue实现标签云,让你的标签动起来
  3. VMware虚拟机恢复系统的某个状态的方法
  4. 润乾报表主子报表通过参数控制子报表显示
  5. Python神笔马良案例集简介
  6. Ubuntu修改ssh登录欢迎信息
  7. 力扣 656.金币路径
  8. Ubuntu 笔记本 麦克风无声音解决方法
  9. 深入理解JVM:java对象的创建过程?
  10. 城南花未开,星海依然在