我是一个完整的Drools
菜鸟。我的任务是实现一个设置规则,在没有嵌套规则的情况下,对我来说似乎非常复杂。问题如下:
我有一个名为Person
的事实,其中包含age
,gender
,income
,height
,weight
和其他一些内容。根据属性的值,某人可能被归类为level_1
,level_2
,...,level_n
。例如,
when
age
< a
以及其他属性then
的任何值
classification
= level_1
。 when
gender
== female
等等
其他属性的值then
classification
= level_2
。when
age
< a
和gender
== female
以及其他任何值
属性then
classification
= level_10
。 因此,在任何规则中,都可以使用任意属性的任意组合。任何人都可以帮我表达这个吗?
问题的第二部分是级别是有序的,如果一个人满足超过1的规则,则选择最高级别。我能想到订购级别的唯一方法是使用salience
自行订购规则。因此产生的规则越高,水平就越高。有更优雅的方式吗?
我发现了一个类似的问题here,但这似乎只涉及1条规则而OP可能比我更熟悉Drools
,因为我还没有理解解决方案。这谈到引入一个单独的control
事实,但我没有得到它是如何工作的。
编辑: 我最终必须创建一个模板并使用csv提供数据。它可能对这个问题无关紧要,但是,如果它有任何帮助......
答案 0 :(得分:0)
基于属性组合为类型事实分配离散值的问题是我称之为“分类问题”(参见Design Patterns in Production Systems)。简单的方法是为每个离散值编写一个规则,约束将属性值与所有其他属性集完全分开。请注意诸如
之类的陈述age < a
和其他属性的任何值然后归类为级别1 具有误导性,不得用于推导规则,因为显然,这不是正确的要求,因为我们有
age < a && gender == female
(...)然后归类为等级10 这与之前的要求相矛盾,正确写成
age < a && gender == male
然后归类为等级1 同样,第2级的规范也必须完成(并且很明显,老年人没有国家)。使用这种方法,基于 i 属性的分类只有2个区间,每个区间产生2个 n 规则。如果得到的水平数量接近这个数字,这种方法是最好的。为了实现,决策表是合适的。
如果n维空间的主要子集应属于同一类,则应使用更经济的解决方案。例如,如果所有女性都应该达到同一水平,那么选择所有女性的规则可以写成并给予最高优先权;剩下的规则必须处理 n -1维。因此,最简单的场景只需要 n 规则,每个维度一个。
还可以描述n维空间中的其他区间,为每个区间提供所有维度的完整值集。为每个间隔使用适当的值子集可以避免排序规则的必要性(使用显着性)并确保实际处理所有情况。当然,如果没有设置级别,那么以低优先级触发的“直通”规则只是谨慎的。