关于事实属性的任意组合的规则

时间:2015-07-24 18:53:36

标签: java drools rule-engine

我是一个完整的Drools菜鸟。我的任务是实现一个设置规则,在没有嵌套规则的情况下,对我来说似乎非常复杂。问题如下:

我有一个名为Person的事实,其中包含agegenderincomeheightweight和其他一些内容。根据属性的值,某人可能被归类为level_1level_2,...,level_n。例如,

  • when age< a以及其他属性then的任何值 classification = level_1
  • when gender == female等等 其他属性的值then classification = level_2
  • when age< agender == female以及其他任何值 属性then classification = level_10
  • ...

因此,在任何规则中,都可以使用任意属性的任意组合。任何人都可以帮我表达这个吗?

问题的第二部分是级别是有序的,如果一个人满足超过1的规则,则选择最高级别。我能想到订购级别的唯一方法是使用salience自行订购规则。因此产生的规则越高,水平就越高。有更优雅的方式吗?

我发现了一个类似的问题here,但这似乎只涉及1条规则而OP可能比我更熟悉Drools,因为我还没有理解解决方案。这谈到引入一个单独的control事实,但我没有得到它是如何工作的。

编辑: 我最终必须创建一个模板并使用csv提供数据。它可能对这个问题无关紧要,但是,如果它有任何帮助......

1 个答案:

答案 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维空间中的其他区间,为每个区间提供所有维度的完整值集。为每个间隔使用适当的值子集可以避免排序规则的必要性(使用显着性)并确保实际处理所有情况。当然,如果没有设置级别,那么以低优先级触发的“直通”规则只是谨慎的。