分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.youkuaiyun.com/jiangjunshow
也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!
规则引擎:Drools与JRuleEngine
译文:《规则引擎:Drools与JRuleEngine》
译者:chszs
作者:Vivek Tomar
原文:《Rule engine : Drools / JRuleEngine》
原文见http://www.naxos-software.de/blog/index.php?/archives/78-Rule-engine-Drools-JRuleEngine.html
一、规则引擎
规则引擎有助于基于存储在规则中的知识和推理来执行判断。这些规则基本上只有条件和动作,别无它物。
规则引擎的优点:
1、分隔应用程序的条件和控制流
(1) 规则都存储在单独的文件。
(2) 规则可以被技术人士和商业人士修改的。
(3) 规则改变后应用程序不必重新部署。
(4) 使用集中的规则使得应用程序更易于管理和维护。
2、规则替换了代码中的if else语句
(1) 规则脚本更容易提取。
(2) 即使是非技术人员也能轻易地遵循规则。
(3) 集中可以解决问题,而不是实现。
(4) 与实现代码相比,规则聚团更容易编写。
3、为什么作决定能很容易地概念化
总结:规则有助于消除代码中大量的if else语句,使代码更易于维护。
二、Drools介绍
Drools是一个开源实现。它是一个Java库,以Apache许可证发布,其二进制代码或源码下载均有效。
推理机的核心是一个规则引擎。它执行模式匹配,在执行动作中做出决策。RETE算法用于模式匹配。
知识被表述为规则。规则有两个主要部分:条件和动作。
例如:
如果用户(年龄>17),那么System.out.println("User is greater then 17");
在人工智能系统,主要有两种响应的方法。
1、正向链(Forward Chaining)
这是基于事实根据的。在工作区域检查中规则。当规则条件为真的规则不再有时,模式匹配结束。
2、反向链(Backward Chaining)
只检查规则的动作可以匹配目标的规则。如果满足条件,然后进行评估。
3、兼容JDK1.4,且需要下面的库。
(1) drools-all-jdk1.4.2.1.jar
(2) xercesImpl-2.6.2.jar
(3) antlr-2.7.5.jar
(4) janino-2.3.2.jar
4、代码示例(ApplyRule.java)
- /*
- /* $Header$
- */
- package com.vivek.drools.example;
- import java.io.IOException;
- import java.io.InputStream;
- import org.apache.commons.logging.Log;
- import org.apache.commons.logging.LogFactory;
- import org.drools.FactException;
- import org.drools.IntegrationException;
- import org.drools.RuleBase;
- import org.drools.WorkingMemory;
- import org.drools.io.RuleBaseLoader;
- import org.xml.sax.SAXException;
- /**
- * Demonstration of a sample rule using Java.
- *
- * @version <tt>$Revision: 1.0 $</tt>
- * @author <a href="mailto:{vivek.tomar@naxos-software.de}" mce_href="mailto:{vivek.tomar@naxos-software.de}">{Vivek Tomar}</a>.
- */
- public class ApplyRule {
- // Constants -----------------------------------------------------
- static Log log = LogFactory.getLog(ApplyRule.class.getName());
- private static final String RULE_FILE = "/rules/rules.drl";
- //private static final String RULE_IS_TURNOVER_INSURABLE = "turnoverInsurable";
- //private static final String RULE_IS_TURNOVER_NOT_INSURABLE = "turnoverNotInsurable";
- // Attributes ----------------------------------------------------
- private double turnover = 1000000;
- // Constructors --------------------------------------------------
- public ApplyRule () {
- try {
- InputStream in = this.getClass().getResourceAsStream(RULE_FILE);
- RuleBase ruleBase = RuleBaseLoader.loadFromInputStream(in);
- WorkingMemory workingMemory = ruleBase.newWorkingMemory();
- workingMemory.assertObject(this);
- // Fire specific rule
- //workingMemory.fireAllRules(new RuleNameEqualsAgendaFilter(RULE_IS_TURNOVER_INSURABLE));
- //Fire all rules
- workingMemory.fireAllRules();
- } catch (IntegrationException e) {
- e.printStackTrace();
- } catch (FactException e) {
- e.printStackTrace();
- } catch (SAXException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- // Public --------------------------------------------------------
- public static void main (String args[]) {
- new ApplyRule();
- }
- public double getTurnover () {
- return turnover;
- }
- public void setTurnover (double turnover) {
- this.turnover = turnover;
- }
- public void printCompanyInsurable () {
- log.info("******************************");
- log.info("This company is Insurable.");
- log.info("******************************");
- }
- public void printCompanyNotInsurable () {
- log.info("==============================");
- log.info("This company is not Insurable.");
- log.info("==============================");
- }
- }
规则定义(rules.drl)
- <?xml version="1.0"?>
- <rule-set name="cheese rules"
- xmlns="http://drools.org/rules"
- xmlns:java="http://drools.org/semantics/java"
- xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
- xs:schemaLocation="http://drools.org/rules rules.xsd
- http://drools.org/semantics/java java.xsd">
- <rule name="turnoverInsurable">
- <parameter identifier="applyRule">
- <class>com.vivek.drools.example.ApplyRule</class>
- </parameter>
- <java:condition>applyRule.getTurnover() > 2000000 </java:condition>
- <java:consequence>
- applyRule.printCompanyInsurable();
- </java:consequence>
- </rule>
- <rule name="turnoverNotInsurable">
- <parameter identifier="applyRule">
- <class>com.vivek.drools.example.ApplyRule</class>
- </parameter>
- <java:condition>applyRule.getTurnover() < 2000000 </java:condition>
- <java:consequence>
- applyRule.printCompanyNotInsurable();
- </java:consequence>
- </rule>
- </rule-set>
三、JRuleEngine介绍
JRuleEngine是一个基于Java的规则引擎,遵循JSR94规范,版本1.1。
1、JRuleEngine共同特征:
(1) 在JRuleEngine输入对象被称为事实,而输出对象被称为结论。
(2) 一个类的方法可直接从规则中调用。
2、JRuleEngine基于前向链算法。
3、规则是类org.jruleengine.rule.RuleImpl的对象,它们以下列方式载入:
(1) 可以从XML文件中读入
(2) 通过RuleImpl对象创建,也可以取自数据库。
4、会话是客户端和规则引擎之间的运行时的胶水。会话与单一的规则执行集相关。会话规则的类型:
(1) 一个有状态的规则会话可持续很长时间,可一次又一次地查询。
(2) 一个无状态的规则给出了实现,但只能持续一定时期。
5、JRuleEngine需要两个库:
(1) jsr94.jar
(2) jruleengine.jar
6、添加这些文件到您应用程序的类路径。
7、通过实例化一个有状态的规则会话(StatefulRuleSession)或无状态的规则会话(StatelessRuleSession)来使用这个库。
8、代码例子(ApplyRule.java)
- /*
- * $Header$
- */
- package com.vivek.jruleengine.example;
- import java.io.InputStream;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.List;
- import javax.rules.RuleRuntime;
- import javax.rules.RuleServiceProvider;
- import javax.rules.RuleServiceProviderManager;
- import javax.rules.StatelessRuleSession;
- import javax.rules.admin.RuleAdministrator;
- import javax.rules.admin.RuleExecutionSet;
- import org.apache.commons.logging.Log;
- import org.apache.commons.logging.LogFactory;
- /**
- * Demonstration of a sample rule using Java.
- *
- * @version <tt>$Revision: 1.0 $</tt>
- * @author <a href="mailto:{vivek.tomar@naxos-software.de}" mce_href="mailto:{vivek.tomar@naxos-software.de}">{Vivek Tomar}</a>.
- */
- public class ApplyRule {
- // Constants -----------------------------------------------------
- static Log log = LogFactory.getLog(ApplyRule.class.getName());
- private static final String RULE_FILE = "/rules/rules.xml";
- // Attributes ----------------------------------------------------
- private double turnover = 1000000;
- // Constructors --------------------------------------------------
- public ApplyRule () {
- try {
- // Load the rule service provider of the reference
- // implementation.
- // Loading this class will automatically register this
- // provider with the provider manager.
- Class.forName("org.jruleengine.RuleServiceProviderImpl");
- // Get the rule service provider from the provider manager.
- RuleServiceProvider serviceProvider = RuleServiceProviderManager.getRuleServiceProvider("org.jruleengine");
- // get the RuleAdministrator
- RuleAdministrator ruleAdministrator = serviceProvider.getRuleAdministrator();
- log.info("Administration API");
- log.info("======================");
- log.info("Acquired RuleAdministrator: ");
- // get an input stream to a test XML ruleset
- // This rule execution set is part of the TCK.
- InputStream inStream = this.getClass().getResourceAsStream(RULE_FILE);
- // parse the ruleset from the XML document
- RuleExecutionSet res1 =
- ruleAdministrator.getLocalRuleExecutionSetProvider(null).createRuleExecutionSet(inStream, null);
- inStream.close();
- log.info("Loaded RuleExecutionSet: ");
- // register the RuleExecutionSet
- String uri = res1.getName();
- ruleAdministrator.registerRuleExecutionSet(uri, res1, null);
- log.info("Bound RuleExecutionSet to URI: " + uri);
- RuleRuntime ruleRuntime = serviceProvider.getRuleRuntime();
- log.info("Acquired RuleRuntime: ");
- // create a StatelessRuleSession
- StatelessRuleSession statelessRuleSession = (StatelessRuleSession)
- ruleRuntime.createRuleSession(uri, new HashMap(),
- RuleRuntime.STATELESS_SESSION_TYPE);
- log.info("Got Stateless Rule Session: " + statelessRuleSession);
- // call executeRules with some input objects
- // Create a input list.
- List input = new ArrayList();
- input.add(this);
- // Print the input.
- log.info("Calling rule session with the following data");
- log.info("Customer turnover input: " + this.getTurnover());
- // Execute the rules without a filter.
- List results = statelessRuleSession.executeRules(input);
- // Release the session.
- statelessRuleSession.release();
- log.info("Released Stateless Rule Session.");
- } catch (NoClassDefFoundError e) {
- if (e.getMessage().indexOf("Exception") != -1) {
- log.error("Error: The Rule Engine Implementation could not be found.");
- } else {
- log.error("Error: " + e.getMessage());
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- // Public --------------------------------------------------------
- public static void main (String args[]) {
- new ApplyRule();
- }
- public double getTurnover () {
- return turnover;
- }
- public void setTurnover (double turnover) {
- this.turnover = turnover;
- }
- public void printCompanyInsurable () {
- log.info("******************************");
- log.info("This company is Insurable.");
- log.info("******************************");
- }
- public void printCompanyNotInsurable () {
- log.info("==============================");
- log.info("This company is not Insurable.");
- log.info("==============================");
- }
- }
规则定义(rules.xml)
- <?xml version="1.0" encoding="UTF-8"?>
- <rule-execution-set>
- <name>RuleExecutionSet1</name>
- <description>Rule Execution Set</description>
- <synonymn name="applyRule" class="com.vivek.jruleengine.example.ApplyRule" />
- <rule name="turnoverInsurable" description="Check if turnover insurable" >
- <if leftTerm="applyRule.getTurnover" op=">" rightTerm="2000000" />
- <then method="applyRule.printCompanyInsurable()" />
- </rule>
- <rule name="turnoverNotInsurable" description="Check if turnover not insurable" >
- <if leftTerm="applyRule.getTurnover" op="<" rightTerm="2000000" />
- <then method="applyRule.printCompanyNotInsurable" />
- </rule>
- </rule-execution-set>
结论:
Drools除了提供正常的规则引擎的能力,还有以下额外的优点:
(1) 无论是技术人士还是商业人士,Drools都是用户友好的,它提供了一个巨大的支持工具集。
(2) Drools的Reteoo算法可加速和可扩展。
(3) Drools提供的Eclipse插件带有自动完成智能感知和调试视图、规则流GUI等。
(4) 基于Web的工具(Guvnor):是一个业务规则管理系统(BRMS),它提供了高级规则授权、版本控制和管理。
至于其他的规则引擎,我个人建议在项目中使用Drools,因为它有一个很大的支持社区。在IDE支持和基于Web的规则管理工具(Guvnor)也有很大优势。
给我老师的人工智能教程打call!http://blog.youkuaiyun.com/jiangjunshow

新的改变
我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:
- 全新的界面设计 ,将会带来全新的写作体验;
- 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;
- 增加了 图片拖拽 功能,你可以将本地的图片直接拖拽到编辑区域直接展示;
- 全新的 KaTeX数学公式 语法;
- 增加了支持甘特图的mermaid语法1 功能;
- 增加了 多屏幕编辑 Markdown文章功能;
- 增加了 焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置 等功能,功能按钮位于编辑区域与预览区域中间;
- 增加了 检查列表 功能。
功能快捷键
撤销:Ctrl/Command + Z
重做:Ctrl/Command + Y
加粗:Ctrl/Command + B
斜体:Ctrl/Command + I
标题:Ctrl/Command + Shift + H
无序列表:Ctrl/Command + Shift + U
有序列表:Ctrl/Command + Shift + O
检查列表:Ctrl/Command + Shift + C
插入代码:Ctrl/Command + Shift + K
插入链接:Ctrl/Command + Shift + L
插入图片:Ctrl/Command + Shift + G
合理的创建标题,有助于目录的生成
直接输入1次#,并按下space后,将生成1级标题。
输入2次#,并按下space后,将生成2级标题。
以此类推,我们支持6级标题。有助于使用TOC
语法后生成一个完美的目录。
如何改变文本的样式
强调文本 强调文本
加粗文本 加粗文本
标记文本
删除文本
引用文本
H2O is是液体。
210 运算结果是 1024.
插入链接与图片
链接: link.
图片:
带尺寸的图片:
当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。
如何插入一段漂亮的代码片
去博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片
.
// An highlighted block var foo = 'bar';
生成一个适合你的列表
- 项目
- 项目
- 项目
- 项目
- 项目1
- 项目2
- 项目3
- 计划任务
- 完成任务
创建一个表格
一个简单的表格是这么创建的:
项目 | Value |
---|---|
电脑 | $1600 |
手机 | $12 |
导管 | $1 |
设定内容居中、居左、居右
使用:---------:
居中
使用:----------
居左
使用----------:
居右
第一列 | 第二列 | 第三列 |
---|---|---|
第一列文本居中 | 第二列文本居右 | 第三列文本居左 |
SmartyPants
SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:
TYPE | ASCII | HTML |
---|---|---|
Single backticks | 'Isn't this fun?' | ‘Isn’t this fun?’ |
Quotes | "Isn't this fun?" | “Isn’t this fun?” |
Dashes | -- is en-dash, --- is em-dash | – is en-dash, — is em-dash |
创建一个自定义列表
-
Markdown
- Text-to- HTML conversion tool Authors
- John
- Luke
如何创建一个注脚
一个具有注脚的文本。2
注释也是必不可少的
Markdown将文本转换为 HTML。
KaTeX数学公式
您可以使用渲染LaTeX数学表达式 KaTeX:
Gamma公式展示 Γ ( n ) = ( n − 1 ) ! ∀ n ∈ N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N Γ(n)=(n−1)!∀n∈N 是通过欧拉积分
Γ ( z ) = ∫ 0 ∞ t z − 1 e − t d t   . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. Γ(z)=∫0∞tz−1e−tdt.
你可以找到更多关于的信息 LaTeX 数学表达式here.
新的甘特图功能,丰富你的文章
gantt
dateFormat YYYY-MM-DD
title Adding GANTT diagram functionality to mermaid
section 现有任务
已完成 :done, des1, 2014-01-06,2014-01-08
进行中 :active, des2, 2014-01-09, 3d
计划一 : des3, after des2, 5d
计划二 : des4, after des3, 5d
- 关于 甘特图 语法,参考 这儿,
UML 图表
可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图::
这将产生一个流程图。:
- 关于 Mermaid 语法,参考 这儿,
FLowchart流程图
我们依旧会支持flowchart的流程图:
- 关于 Flowchart流程图 语法,参考 这儿.
导出与导入
导出
如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。
导入
如果你想加载一篇你写过的.md文件或者.html文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。
注脚的解释 ↩︎