在我的场景中,我有两张excel电子表格(sheet1和sheet2),它们包含两个独立的决策表。 在sheet1中,规则如下:
PRIORITY 0
NO-LOOP TRUE
ACTIVATION-GROUP Group1
AGENDA-GROUP Agenda1
a b | d
1 2 | 1
因此,如果a == 1且b == 2,则将d设置为1
设置d的命令是:modify(input) {setD(1)}
Sheet2如下所示:
PRIORITY 5
NO-LOOP TRUE
ACTIVATION-GROUP Group1
AGENDA-GROUP Agenda1
a c | d
1 3 | 1
两个文件都具有相同的ACTIVATION-GROUP(activation1)和相同的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 ]
我已经将规则分成两个单独的AGENDA-GROUP,这是一个解决方案,但我想知道为什么activate-group没有做我认为应该做的事情。
有没有人有任何想法为什么这是无限循环?
答案 0 :(得分:0)
两个规则都被激活,因为所有约束都评估为true。 a-c-d规则具有更高的显着性,因此它会被激发。 a-b-d规则的激活确实被取消,因为它处于相同的激活状态。
现在你使用modify来更新d,它指示引擎重新评估修改后的事实,所以你回到方块1,即两个规则都被激活,具有更高显着性的规则被触发并且...... < / p>
要打破这种恶性循环,写下更准确描述逻辑的规则。三种方式:
(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,您可以执行“更新”#34;,即
rule abd
when
$inp: Input( a == 1, b == 2 )
then
$inp.setD(1);
end
最有可能#2最适合您的电子表格方法。