首页 > 编程知识 正文

deutsch算法,gardner算法

时间:2023-05-06 06:09:40 阅读:16412 作者:588

关于rete算法的介绍,能找到的资料不少,但对初学者往往不友好,很快Fact、TypeNode、AlphaNode等术语层出不穷,非常容易劝诱。 这里想总结一下自己的学习过程,以便于从问题中理解rete算法本身。

举个例子:

例如,需要向旅客提供“机票酒店”、“机票酒店特别休息室”两种产品。

机票、酒店、贵宾休息室需要满足几个基本限制条件。 然后:

“机票酒店”产品必须保证酒店位于目的地,并可当日入住。

“机票酒店特殊休息室”产品必须保证酒店在目的地,当天到达并入住。 贵宾休息室在出发城市。

假设机票有10种类型,酒店有10中型,休息室有10种类型。 如果需要以常规编程方式嵌套在三个for循环中,则计算量为三类笛卡儿积10*10*10=1000。 接下来,我们来看看用rete算法解决问题。

Rete算法:规则(rule ) :首先是规则的定义,这里直接引用了另一个例子。 在觉得说明清晰的同时,将相关概念与上面的case相关联。

说明一下,可以想象a、b、c相当于我们上面的类型,a是机票,b是酒店,c是休息室。 那么a1、a2相当于机票属性,同样b1、b2相当于酒店属性。 上面的规则可以理解为(yy的)、a1=1)仓库=头等舱)、b3=a2 )、c1=b2 )贵宾室的公司=酒店集团)。 这里只是容易理解,此case与上述问题的解决方案不直接相同。

在此挪用资料的case,再追加两个规则。

rule_1可以理解为一种组合或集的规则,同样其他两种是其他集的组合规则。

事实(Fact )这相当于我们有数据,在这个case中相当于机票、酒店、贵宾室的各种数据。

这里的类型有点多,大家向上理解就行了。 例如,有两个a数据表示两个航班的机票信息,有三个b表示三个酒店的信息。

具体的示例代码为https://github.com/yk dsg/my Java项目/tree/master/base/src/main/Java/com/Hz/yk/drools/my

Rete网络可以基于以上规则构建Rete网络,便于结合以上Fact提供的数据进行理解。

整个网络分为两个部分:阿尔法网络和beta网络。

alpha网络图最左侧的Fact往往被称为根节点,从这里开始,我们首先遇到的是TypeNode,它提供了按对象类型过滤的能力。 如下图所示,Cheese类型的事实进入网络后,只需经过Cheese ObjectTypeNode之后的节点。

紧接其后的椭圆形边框的select node,更常见的称呼是Alpha Node,主要对同一对象类型内的属性进行约束和常量测试。 如上所述A.a1=1,B.b1=2

接下来是阿尔法地图。 用于保存通过阿尔法节点的数据。 上图的直角块部分。

beta网络首先是beta节点,具有两个输入节点。 用于比较两个对象。 这两个对象可能是同一类型或不同类型。 beta节点主要有两种类型:连接节点和非节点。 这里只使用了连接节点。 通常,这也是实现rete算法的核心。

通过BetaNode后,将结果保存到beta内存中。 这里和阿尔法梅里很像。 在上图的case中,在经过a2==b3的beta注释后,它是两个type的笛卡儿积。 例如,上面beta mail中的是a(1,100,a )1),b ) 2,10,100,b )1); a (1,100,a_1),b ) B(2.11.100,b_2)。 因此,如果对应于a的Alpah Memory有两个结果,则这里的beta memory为四个。 如果规则设计得不好,这里的内存大小很容易膨胀。 而且下面也一样。 根据条件的内容进行笛卡儿积。 最后到达了终端节点。 这是规则运算的结果。

总结:

要在空间中改变时间,首先保存了中间结果(alpha存储器、beta存储器)。 如果像机票、酒店、贵宾室的case这样,需要用普通编程的方法使用3个for循环,假设计算次数为3个类别数的直积,分别为10,则为10*10*10。 通过rete算法,计算次数为101010 (alpha节点计算次数),加上2次join操作(rete节点计算次数)。 这样的话相当于条件维度(机器葡萄酒观光地)。 )越多,不同规则之间往往存在相同的子条件(a规则:机器所在地酒店所在地b规则:酒店所在地景点所在地。 酒店所在地这一子条件相同),rete算法与普通编程相比好处更大。

带来的问题:

事实上,可能存在重复数据消除。 例如,与alpha节点1匹配的Fact1和与alpha节点2匹配的Fact1存储在相应的节点缓存中。 在某些场景中,会消耗大量空间。 计算beta节点后,内联的数据量可能很大。 在整个网络较大的情况下,这个数据量很难评估。 内存爆炸的可能性很高。 最后我想说的是,网上的资料是到处抄的,很多关键也不清楚。 后来通过看Drools的源代码想知道,作为工业级的引擎,性能和可靠性考虑太多,无关的代码很多,非常容易头晕。 另外,关于网上Drools源代码分析的说明很少,最多的是Drools的使用说明。

推荐:

一个python的项目py _ rete (https://github.com/CMAC lell/py _ rete ),实现比较简单,如果是研究源代码的话,是更好的选择。 《AnIntroductionToTheReteAlgorithm》应该是老年人提供的ppt

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。