在我的课上,我学习了Prolog回溯算法和Rete forprop算法,但我也被告知Rete可以用来做backprop.
这是如何运作的?它与Prolog回溯的方式类似/不同?
例如,这是我给出的练习之一:
(R1) 24fingers and antennas => origin(mars)
(R2) shy and 5feet => origin(mars)
(R3) shy and 4arms => origin(venus)
(R4) looksDownWhenTalking => shy
(R5) fleesWhenSeen => shy
Run Code Online (Sandbox Code Playgroud)
目标是通过以下事实找到外星人的起源:
(F1) fleesWhenSeen
(F2) 4arms
Run Code Online (Sandbox Code Playgroud)
在Prolog中,我们将通过模式匹配origin(X)
规则的RHS 的目标来解决它.规则与R1,R2和R3匹配,因此首先会触发R1,我们会尝试解决24fingers and antennas
失败的子目标.
然后我们将回溯到开头并触发R2,最终将失败,最后回溯并触发R3,这成功.
因此X
,venus
在成功查询中结束绑定,算法结束.
现在,我们如何使用rete backprop算法解决相同的练习?
我天真地假设我们将使用一个子目标列表,从origin(X)
开始,触发RHS与子目标匹配的规则.
但是,当一些子目标失败时,我不清楚Rete算法如何处理回溯,或者一旦它解决了某个目标子集,它将如何知道它已经成功.
我已经阅读了很多关于JBoss Drools的文档但是找不到关于是否所有规则同时执行的肯定答案(当然它们是同时被触发的).更具体地,对于单个输入和1000个规则的规则集,在每个规则中执行"何时"条件和"然后"条件,逐个顺序执行,或者同时并行执行.
一方面,当选择节点被折叠时,rete算法意味着并行性.然而,节点优化后评估顺序?beta内存和连接节点看起来应该同时执行,但它们是什么?
此外,Drools文档提到"顺序模式",默认情况下这是关闭的.什么是开启,并行模式?并且有一个maxThreads选项暗示线程.
另一方面,我被告知代码不使用线程,因此同时进行评估,但大部分顺序执行.
有没有人见过任何证明这种情况的文件?
谢谢!
我一直在阅读一篇关于 Drools 性能的文章(JBoss Drools \xe2\x80\x93 Performance and Memory Internals),它解释了如何创建 Rete 树和节点,Drools 如何索引它们,以及为什么增加 Drools 中的对象数量几乎不会影响执行它所花费的总时间。\n以智能方式编写的规则可以大大减少 Rete Tree 中的节点数量,从而进一步提高性能。
\n\n我想知道是否有 Drools 规则编写最佳实践,这样我就可以以一种可以尽快执行的方式编写它们。
\n\n谢谢。
\n我正在尝试找出 BRE NRules 并得到一些有效的示例,但很难匹配集合。
IEnumerable<Order> orders = null;
When()
.Match<IEnumerable<Order>>(o => o.Where(c => c.Cancelled).Count() >= 3)
.Collect<Order>(() => orders, o => o.Cancelled);
Then()
.Do(ctx => orders.ToList().ForEach(o => o.DoSomething()));
Run Code Online (Sandbox Code Playgroud)
基本上我想要的是,如果有 3 个订单被取消,那么执行一些操作。但我似乎无法在集合上获得匹配,单个变量确实有效。
该程序:
var order3 = new Order(123458, customer, 2, 20.0);
var order4 = new Order(123459, customer, 1, 10.0);
var order5 = new Order(123460, customer, 1, 11.0);
order3.Cancelled = true;
order4.Cancelled = true;
order5.Cancelled = true;
session.Insert(order3);
session.Insert(order4);
session.Insert(order5);
session.Fire();
Run Code Online (Sandbox Code Playgroud)
我在这里做错了什么?
我正在尝试为示例规则绘制Rete网络,该规则在不同模式的变量之间没有绑定。我知道使用beta网络来确保不同模式下的弯曲变量保持一致。
(defrule R1
(type1 c1 c2)
(type2 c3)
=>
)
(defrule R2
(type2 c3)
(type3 c4 v1)
(type4 c5 v1)
=>
)
Run Code Online (Sandbox Code Playgroud)
在R1中,两个模式之间没有绑定变量,那么我该如何在Rete网络中合并它们的结果?在R2中,两个规则绑定了变量,而第三个没有绑定。如何在网络中结合这三个规则?我在这种情况下搜索了Rete网络示例,但未找到任何示例。我试图绘制网络,下面是我的网络。这样对吗?
更新:基于加里的答案的新网络
NRules SimpleRule的代码定义了以下规则:
public class PreferredCustomerDiscountRule : Rule
{
public override void Define()
{
Customer customer = null;
IEnumerable<Order> orders = null;
When()
.Match<Customer>(() => customer, c => c.IsPreferred)
.Collect<Order>(() => orders,
o => o.Customer == customer,
o => o.IsOpen,
o => !o.IsDiscounted);
Then()
.Do(ctx => ApplyDiscount(orders, 10.0))
.Do(ctx => LogOrders(orders))
.Do(ctx => orders.ToList().ForEach(ctx.Update));
}
...
}
Run Code Online (Sandbox Code Playgroud)
我想知道为什么条件是单独的pareameters而不是仅使用&&运算符,即以下将具有相同的效果?
public class PreferredCustomerDiscountRule : Rule
{
public override void Define()
{
Customer customer = null;
IEnumerable<Order> orders = null;
When()
.Match<Customer>(() => customer, …
Run Code Online (Sandbox Code Playgroud) rete ×7
rule-engine ×3
c# ×2
drools ×2
java ×2
nrules ×2
algorithm ×1
backtracking ×1
clips ×1
concurrency ×1
prolog ×1