计算是关于决策以及我们在一个多能级来进行的一切。集成电路CPU层面上,我们通过硬件连接的逻辑网关实现,这个逻辑网关拥有不可思议的速度,但缺少灵活性。为了获取灵活性我们发明语言,用其编写条件语句来控制一个程序。在某种程度上决策中越来越多的需求的复杂性让编程实际上更复杂了。
我的经验是“当你的IF-ELSE语句充满屏幕,你的程序正在试图告诉你一些事情。” 面对变化中的需求,尝试维护这些代码简直就是程序员的噩梦。频繁的改变决策制定需求,这时也许规则引擎就能帮到你了。 规则引擎 当然,计算决策的概念就像“人工智能”或者AI,已经存在于计算机科学家的脑子中很久了。
AI似乎就是一个永远看得见的目……
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
计算是关于决策以及我们在一个多能级来进行的一切。集成电路CPU层面上,我们通过硬件连接的逻辑网关实现,这个逻辑网关拥有不可思议的速度,但缺少灵活性。为了获取灵活性我们发明语言,用其编写条件语句来控制一个程序。在某种程度上决策中越来越多的需求的复杂性让编程实际上更复杂了。我的经验是“当你的IF-ELSE语句充满屏幕,你的程序正在试图告诉你一些事情。”
面对变化中的需求,尝试维护这些代码简直就是程序员的噩梦。频繁的改变决策制定需求,这时也许规则引擎就能帮到你了。
规则引擎
当然,计算决策的概念就像“人工智能”或者AI,已经存在于计算机科学家的脑子中很久了。AI似乎就是一个永远看得见的目标,但是永远不会实现,大概是因为期望每一时刻都在增大。现在我希望探讨的是实际成功记录的工具,忽略掉是否或者它们代表AI的问题。
最早的成功的计算机决策系统之一是MYCIN。在上个世纪90年代,MYCIN通过伴随置信因子的规则,在定义细菌感染和引进抗生素上实现了高效率的成功。MYCIN可以识别哪些实事可以导致争端的改进,并直接询问医生用户。最初由LISP编写,MYCIN已经被翻译成许多计算机语言。自从规则以文本格式出现之后,基础语言可以为任何一个开发者所熟悉。
在规则引擎中,那些使用简单true/false实事和那些通过逻辑衡量置信因子(像MYCIN)之间有一个主要的区别。你也许看到术语模糊逻辑适应了规则引擎,规则引擎可以通过0到1之间的真值维护因子。对于模糊逻辑引擎的研究正在进行,但是我没有发现现实世界的广泛应用。
问题域示例
假设你的问题是支持一个基于网络的运输系统,对于会员有特殊折扣规则,季节性价格变动、特殊商品、运输选择和可变税法需要考虑。在市场遭遇突发性的头脑风暴,试图为这种变化改编代码简直就是一场噩梦,但是你可以准备一套脱机规则,代替新的规则,而不需要改变系统的任何其他部分。你可以看到为什么规则引擎“业务规则”应用如此受欢迎。
规则引擎项目示例
很多开发者试图通过各种方法用多种语言和操作系统来实现规则引擎。通常开发者在使用Java时,在设想规则引擎的运转的时候面向对象很有帮助。2003年有一次尝试,即为规则引擎创建Java API,但是实际Java实施开发似乎远远超越了JSR 94。这篇文章给出了30多种基于Java的规则引擎和相关工具的简短概述。下面是目前的规则引擎项目的具体信息。
- Jess是Sandia National实验室用Java编写的规则引擎。Jess在一种从一套规则或者实事的说明风格中运行, 可能是常量或者Java变量来创建一列逻辑结论。Jess不是开源的。
- Drools是开源Java实施,它已经和广泛使用的JBoss Java EE应用服务器结合。Jboss是红帽公司2006年分割出的部门。红帽主持社区来支持Drools版本,也提供商业版本支持。Drools为声明规则和连接规则逻辑和程序提供了多种方法。不必使用Jboss来利用多种多样的开源Drools工具。
规则表示
采纳规则引擎解决方案的障碍之一是必须学习另一种语法来表达因子和逻辑。这是一种学科的方式超越了本文的范畴,但为你提供了一种想法,下面是一个来自JSR 94文件的案例,该文件定义了用户和发票对象以及处理给定发票的规则。
以下是引用片段: (defclass org.jcp.jsr94.tck.model.Customer org.jcp.jsr94.tck.model.Customer) (defclass org.jcp.jsr94.tck.model.Invoice org.jcp.jsr94.tck.model.Invoice) (defrule rule-1 ?customer <- (org.jcp.jsr94.tck.model.Customer (creditLimit ?limit) (OBJECT ?C)) ?invoice <- (org.jcp.jsr94.tck.model.Invoice (amount ?amt&:(> ?limit ?amt)) (status "unpaid") (OBJECT ?I)) => (modify ?customer (creditLimit (- ?limit ?amt))) ; (printout t "The credit limit of the customer is " ; (get ?C creditLimit) crlf) (modify ?invoice (status paid)) ; (printout t "The status of the invoice is " ; (get ?I status) crlf) ) |
幸运的是有编程工具辅助开发者表达规则。例如,Drools项目使用Eclipse IDE插件提供各种用户定义规则接口,包括像电子表格的界面。
规则和语义网
在研究目前W3C在语义Web活动上工作时,我发现一个名为“规则交换格式工作组”或者RIF的子项目。这个工作组在2005年创立,致力于“在规则系统之间交换规则创建标准,尤其是Web规则引擎之间。”鉴于语义网实施的现状,这是一个相当冒险的项目,我怀疑商业网站对共享所有权规则很感兴趣。
作者
相关推荐
-
网易OpenStack部署运维实战
本文为您介绍了网易公司基于OpenStack开发的一套云计算管理平台,以及在开发、运营、维护过程中遇到的问题和经验分享。
-
支持Swift!全新“四步测”BDD框架Quick诞生
Quick是一款专门用于iOS应用开发的开源行为驱动开发(BDD)测试框架,基于MIT许可协议发布,支持Swift和Objective-C,其灵感主要来源于RSpec、Specta和Ginkgo。
-
Sharp:最快的Node.js图像调整模块
Sharp是调整图片尺寸最快的Node.js模块,它支持JPEG、PNG、WebP和TIFF格式的图片处理,使用libvips库。
-
开源是怎样修炼成的?
开源的不仅仅只是一个软件许可证。如果你相信GitHub,那么你就会明白一个协同软件开发的成功范例是什么样子了。