事实属性任意组合的规则
Rules on arbitrary combinations of fact attributes
我是一个十足的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
对规则本身进行排序。因此,由此产生的规则是更高的级别将具有更高的显着性。有更优雅的方法吗?
我发现了一个类似的问题 ,但它似乎只涉及 1 条规则,而且 OP 可能比我更熟悉 Drools
,因为我不了解解决方案。那谈到引入一个单独的 control
事实,但我不明白它是如何工作的。
编辑:
我最终将不得不创建一个模板并使用 csv 提供数据。对于这个问题可能无关紧要,但是,如果它以任何方式帮助...
根据属性组合为一个类型的事实分配一个离散值的问题就是我所说的"classification problem"(参见Design Patterns in Production Systems)。简单的方法是为每个离散值编写一个规则,并使用约束将属性值与所有其他属性集完全分开。请注意,
等语句
- 当属性值
age < a
和其他属性的任何值时 class 确定为级别 1
具有误导性,不得用于推导规则,因为显然这不是正确的要求,因为我们有
- 当
age < a && gender == female
(...) 然后 class 化为 10 级
这与之前的要求相矛盾,正确写为
- 当
age < a && gender == male
然后 class 化为级别 1
同样,level 2 的规格也必须完成(而且显然没有老人的国家)。使用这种方法,基于 i 属性的 classification 每个只有 2 个间隔导致 2n 规则。如果生成的级别数接近此数字,则此方法是最好的。对于实施,决定 table 是 suitable.
如果 n 维的主要子集 space 应落入相同的 class,则应使用更经济的解决方案。例如,如果所有女性都应属于同一级别,则可以编写一条选择所有女性的规则并给予最高优先级;其余规则必须处理 n-1 个维度。因此,最简单的场景只需要 n 条规则,每个维度一个。
也可以在 n 维 space 中描述其他区间,为每个区间提供所有维度的完整值集。为每个间隔使用适当的值子集避免了对规则进行排序(使用显着性)的必要性,并确保真正处理所有情况。当然,如果尚未设置级别,则 "fall-through" 规则以低优先级触发只是谨慎的做法。
我是一个十足的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
对规则本身进行排序。因此,由此产生的规则是更高的级别将具有更高的显着性。有更优雅的方法吗?
我发现了一个类似的问题 Drools
,因为我不了解解决方案。那谈到引入一个单独的 control
事实,但我不明白它是如何工作的。
编辑: 我最终将不得不创建一个模板并使用 csv 提供数据。对于这个问题可能无关紧要,但是,如果它以任何方式帮助...
根据属性组合为一个类型的事实分配一个离散值的问题就是我所说的"classification problem"(参见Design Patterns in Production Systems)。简单的方法是为每个离散值编写一个规则,并使用约束将属性值与所有其他属性集完全分开。请注意,
等语句- 当属性值
age < a
和其他属性的任何值时 class 确定为级别 1
具有误导性,不得用于推导规则,因为显然这不是正确的要求,因为我们有
- 当
age < a && gender == female
(...) 然后 class 化为 10 级
这与之前的要求相矛盾,正确写为
- 当
age < a && gender == male
然后 class 化为级别 1
同样,level 2 的规格也必须完成(而且显然没有老人的国家)。使用这种方法,基于 i 属性的 classification 每个只有 2 个间隔导致 2n 规则。如果生成的级别数接近此数字,则此方法是最好的。对于实施,决定 table 是 suitable.
如果 n 维的主要子集 space 应落入相同的 class,则应使用更经济的解决方案。例如,如果所有女性都应属于同一级别,则可以编写一条选择所有女性的规则并给予最高优先级;其余规则必须处理 n-1 个维度。因此,最简单的场景只需要 n 条规则,每个维度一个。
也可以在 n 维 space 中描述其他区间,为每个区间提供所有维度的完整值集。为每个间隔使用适当的值子集避免了对规则进行排序(使用显着性)的必要性,并确保真正处理所有情况。当然,如果尚未设置级别,则 "fall-through" 规则以低优先级触发只是谨慎的做法。