rete算法Java实现,rete算法python实现

  rete算法Java实现,rete算法python实现

  Rete可以读作Rete特或雷-泰,在拉丁语中是“网络”的意思。Rete算法是Charles Forgy博士在1974年发明的一种算法。后来成为产生式规则系统的大脑。Drools是从产生式规则系统进化而来的。

  产生式规则产生式规则是一种常用的知识表示方法,以‘如果-那么’的形式表示因果关系。这种统治形式反映了人类的解决方案(一种?)问题的行为特征,我们可以通过循环应用这些规则来解决问题。

  .R3:如果一种动物是有蹄动物,脖子长,腿长,身上有黑斑,那么它就是长颈鹿(问题已解决)R4:如果一种动物是有蹄动物,身上有黑色条纹,那么它就是斑马(问题已解决).R8:如果一个动物是哺乳动物和咀嚼者,那么它就是有蹄动物.R10:如果动物有奶,那么它就是哺乳动物.

  比如,有了上面的产生式规则,给定牛奶、倒嚼、长脖子、长腿、身上有黑斑(也叫事实)等条件,问题的答案就可以解为“长颈鹿”。

  对于这类问题,自然的实现方法是一条一条的去查规则,但是像上面的例子,有些知识是在推理的过程中获得的,比如“哺乳动物”和“有蹄动物”,规则不一定按照理想的顺序排列。为了解决问题,他们只能循环几次,直到问题解决。对于一个庞大的规则集来说,这显然是低效的。Rete算法为产生式规则系统提供了一种非常有效的实现方式。

  产生式规则系统的结构在介绍Rete算法之前,先简单介绍一下下面的产生式规则系统的结构。如图所示,规则存储在生产内存中,要评估的事实被插入到工作内存中,在工作内存中它们被修改或撤回。一个拥有大量规则和事实的系统,在一个事实评价中可能会导致多个规则为真,这就是所谓的冲突。代理(议程)将使用冲突解决策略来管理冲突规则的执行顺序。

  Rete算法Rete算法可以分为规则编译和运行时执行两部分,其中编译算法是Rete算法的精髓。本文描述了如何处理规则来生成一个有效的判别网络。认证可以理解为一个用来过滤在其中传输的数据的网络。Forgy博士描述了Rete算法网络中的四种类型的节点:

  根节点:所有对象进入网络的入口。网络中只有一个根节点。单输入节点:可分为对象类型节点、alpha节点、leftinputadapternode等。两个输入节点:包括JoinNode和NotNode。JoinNode和NotNode也属于BetaNodes,用于比较两个对象及其域。终端节点:当到达一个终端节点时,表示单个规则匹配所有条件,网络中有多个终端节点。当单个规则中有或时,也会有多个终端节点。对象类型节点

  从事实根节点进入Rete网络后,您将立即进入ObjectTypeNode,它提供了按对象类型过滤对象的能力。通过这种节点,规则引擎可以不做额外的工作。如下图,Cheese类型的事实进入网络后,只需要经过Cheese ObjectTypeNode之后的节点。

  AlphaNodeAlphaNode节点的作用是对文字条件求值,如下图所示,对奶酪事实的name和strength属性值求值。AlphaNode是串行的,即只要有一个节点不满足,就把事实过滤掉。

  JoinNode和LeftInputAdapterNode如前所述,双输入节点JoinNode是一种BetaNode。BetaNode的输入称为左输入和右输入,其中左输入通常是对象(元组)的列表,而右输入是单个对象,可以检查列表中是否存在某个对象。LeftInputAdapterNode的功能是输入一个对象,并将其作为单个对象列表(tuple)进行传播。如图所示,JoinNode的左输入是LeftInputAdapterNode传播的列表,右输入是Person对象。

  流口水规则和网算法的例子//规则一当cheddar:name== cheddar )$ Person:Person(最喜欢的cheddar==$ cheddar)then system。出去。println(Person。getname()‘像切达干酪’);end//规则2当奶酪($ cheddar:name== cheddar )$ Person:Person(最喜欢的奶酪!=$切达干酪)然后系统。出去。println(person。getname()不喜欢切达’);目标

  图示的网网络除了展示了代码块中的流口水规则,还体现了网算法中节点共享的特征,此特征减少了网络中结点的冗余。

  参考资料1.产生式规则表示法

  2.产生式表示法

  3.流口水官方文档

  4.网算法

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: