在我的场景中,我有两个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没有做我认为应该做的事情 .
有没有人有任何想法为什么这是无限循环?
1 回答
由于所有约束评估为true,因此两个规则都被激活 . a-c-d规则具有更高的显着性,因此它会被激发 . a-b-d规则的激活确实被取消,因为它处于相同的激活中 .
现在你使用modify来更新d,它指示引擎重新评估修改后的事实,所以你回到方块1,即两个规则都被激活,具有更高显着性的规则被触发并且......
要打破这种恶性循环,写出更准确地描述逻辑的规则 . 三种方式:
(1)仅使用一个规则来设置d = 1 . 我提供DRL:
(2)在两个规则上添加对约束的约束:
即使使用我的第一个提案,在d上添加约束也是一个好主意,因为可能有其他规则设置输入的e,f,....
(3)如果你的任何规则中不需要Input.d,你可以进行“脏更新”,即
最有可能#2最适合您的电子表格方法 .