当前位置: 首页 > 知识库问答 >
问题:

Drools激活组循环

姜乐家
2023-03-14

在我的场景中,我有两个excel电子表格(sheet1和sheet2),其中包含两个单独的决策表。在表1中,规则如下所示:

PRIORITY 0
NO-LOOP TRUE
ACTIVATION-GROUP Group1
AGENDA-GROUP Agenda1

    a  b | d
    1  2 | 1

因此,如果a==1,b==2,将d设置为1,则设置d的命令是:<代码>修改(输入){setD(1)}

Sheet2如下所示:

PRIORITY 5
NO-LOOP TRUE
ACTIVATION-GROUP Group1
AGENDA-GROUP Agenda1

    a  c | d
    1  3 | 1

两个文件具有相同的ACTIVATION-GROUP(激活1)和相同的AGENDA-GROUP(议程1)

我使用的输入:

a  b  c  d
1  2  3  -2

我希望为这两条规则中的每一条创建一个激活。优先级较高的规则将触发,然后由于它位于激活组中,第二条规则将被取消。

然而,当我运行时,Sheet1中的规则将被激活并运行,然后Sheet2中的规则将被激活并运行,这将无限循环。

下面是会话生成的日志输出的一部分:

==>[ActivationCreatedEvent: getActivation()=[[ RuleId15010_16 active=false ] 
==>[BeforeActivationFiredEvent:  getActivation()=[[ RuleId15010_16 active=false ]
==>[AfterActivationFiredEvent: getActivation()=[[ RuleId15010_16 active=false ] 
==>[ActivationCreatedEvent: getActivation()=[[ RuleId15011_16 active=false ] 
==>[BeforeActivationFiredEvent:  getActivation()=[[ RuleId15011_16 active=false ] 
==>[AfterActivationFiredEvent: getActivation()=[[ RuleId15011_16 active=false ] 
==>[ActivationCreatedEvent: getActivation()=[[ RuleId15010_16 active=false ] 
==>[BeforeActivationFiredEvent:  getActivation()=[[ RuleId15010_16 active=false ]
==>[AfterActivationFiredEvent: getActivation()=[[ RuleId15010_16 active=false ] 
==>[ActivationCreatedEvent: getActivation()=[[ RuleId15011_16 active=false ] 
==>[BeforeActivationFiredEvent:  getActivation()=[[ RuleId15011_16 active=false ] 
==>[AfterActivationFiredEvent: getActivation()=[[ RuleId15011_16 active=false ] 
==>[ActivationCreatedEvent: getActivation()=[[ RuleId15010_16 active=false ] 
==>[BeforeActivationFiredEvent:  getActivation()=[[ RuleId15010_16 active=false ] 
==>[AfterActivationFiredEvent: getActivation()=[[ RuleId15010_16 active=false ] 
==>[ActivationCreatedEvent: getActivation()=[[ RuleId15011_16 active=false ] 
==>[BeforeActivationFiredEvent:  getActivation()=[[ RuleId15011_16 active=false ] 
==>[AfterActivationFiredEvent: getActivation()=[[ RuleId15011_16 active=false ] 

我已经将规则分成了两个不同的议程组,这是一个解决方案,但我想知道为什么激活组没有做我认为应该做的事情。

有人知道为什么这是无限循环吗?

共有1个答案

闻人浩波
2023-03-14

这两个规则都被激活,因为所有约束的计算结果都为true。a-c-d规则具有更高的显著性,因此会激发。a-b-d规则的激活确实被取消,因为它处于相同的激活中。

现在您使用修改更新d,这指示引擎重新评估修改后的事实,因此您回到了方块1,即两个规则都被激活,具有更高显着性的规则被触发,并且...

为了打破这种恶性循环,编写更准确地描述逻辑的规则。三种方法:

(1) 仅使用一条规则将d设置为1。我提供DRL:

rule abcd
when
  $inp: Input( a == 1, b == 2 || c == 3 )
then
  modify( $inp ){ setD(1) }
end

(2) 将d上的约束添加到两个规则中:

rule abd
when
  $inp: Input( a == 1, b == 2, d != 1 )
then
  modify( $inp ){ setD(1) }
end

即使在我的第一个建议中,在d上添加约束也可能是一个好主意,因为可能有其他规则设置e、f、,。。。的输入。

(3) 如果您不需要输入。d在您的任何规则中,您都可以进行“脏更新”,即。,

rule abd
when
  $inp: Input( a == 1, b == 2 )
then
  $inp.setD(1);
end

很可能#2最适合您的电子表格方法

 类似资料:
  • 我有两个事实,分别命名为OptionalCover和OptionalPremiumComponent,其中有OptionalPremiumComponent的参考。这就是我在工作记忆中插入的内容。 我在drools中创建了以下规则 问题是,插入父对象时没有触发上述规则。我还需要做些什么来实现这种行为吗?是否支持? 谢谢你。

  • 结束 当我通过ksession.insert(Object)将一些人插入工作记忆时,只计算第一个人,忽略其他的人。我对Drools激活组的理解是,如果我有X个规则,这些规则属于同一个激活组,具有不同的显着性值,那么每个人都将被规则处理,显着性最高的将被激发,其余的将被忽略。一旦完成,下一个人将通过并重复这个过程。我所经历的是,第一个触发该激活组中任何规则的人将禁用整个激活组,不再处理其他人员。有什

  • 当实例的试用期结束时,Navicat Monitor 需要令牌以继续监控该实例。令牌可以作为永久许可证或订阅购买。若要管理你的令牌并许可你的实例,请前往“配置”->“激活令牌密钥和许可实例”。 【注意】永久许可证和订阅方案不能在同一个 Navicat Monitor 上使用。在更改激活方法之前,你需要取消激活令牌密钥或退出你的 Navicat ID。 永久许可证 如果你购买了永久许可证,你将收到一

  • 我有5个规则组,每个规则组中有多个规则。 任何帮助都很感激。如果你需要更多的细节,我将很乐意提供它。 还有一点是,如果我一次在kiesession中插入一个事实,那么我就可以使用drools.getworkingmemory().ClearRuleFlow Group(“{议程}”);它工作得很好。 但是如果我使用多个事实,那么它将停止处理会话中所有事实的规则流组。

  • 我试图使我的wordpress网站翻译准备好,使用'poedit'。我激活翻译有问题。我想只翻译网站,而不是wordpress系统。我有我的. pot,. po和. mo文件在'语言'文件夹在我的主题目录,我有这个代码在我的functions.php文件: 那么,在poedit程序中保存并翻译所有内容后,如何在我的站点中激活它?我现在正在使用本地主机。

  • 行动时刻 - 激活NULL领域 请按照以下步骤激活NULL域: 编辑FreeRADIUS配置目录下的proxy.conf文件,并更改以下部分: #realm NULL { # authhost = radius.company.com:1600 # accthost = radius.company.com:1601 # secret = testing123 #} 更改为: realm NUL