rule-engine - 如何开始使用大型决策表

标签 rule-engine

今天我遇到了一个有趣的挑战,我希望你能就如何处理这种情况提出意见。

所以问题如下(我已将其转换为演示数据,因为如果不牢记公司字典,真正的问题将没有多大意义)。

我们有一个至少有 16 个条件的决策表。因为管理所有这些(2^16 种可能性)是一项不可能的壮举,所以我们决定只列出异常(exception)情况。像这样:

decision table example

作为一个例子,我只添加了 10 个条件,但实际上有(现在)16 个。基本思想是我们有一个基线(默认),它对每个人都有效,并且对这个默认的所有异常(exception)都有效。

示例:

你有一个外国人也是海盗。
如果您逐个检查所有异常,并逐个条件删除至少有一个条件失败的异常。最后,您将得到以下两个对我们的案例有效的异常(exception)情况。比赛是在 IsPirate 和 IsForeigner 条件下进行的。但是正如您所看到的,这里有 2 个结果,如果算上默认值,实际上是 3 个。
problem example

我们的解决方案

现在我们想出的解决方法是,在您添加这些异常的 GUI 中,应该运行一个算法来检查此类情况并强制您更具体地定义异常。这只是一个理论,还没有经过测试,但我们认为它可以这样工作。

我的问题

我正在寻找使规则易于管理并防止我在示例中显示的问题的替代解决方案。

最佳答案

您的问题似乎是解决冲突规则。当多个规则匹配您的输入(您的外国人和海盗)并且它们最终推荐不同的内容(您的 cangetjob 和 cangetevicted)时,您需要一个解决此冲突的策略。

你提到的是一种解决方法——首先消除冲突。然而,这并不总是可行的,也不总是可取的,因为当用户添加与一组旧规则(他/她没有编写)冲突的新规则时,用户可能不知道如何修改它以删除冲突。

另一种可能的解决方法是优先排序。在每条规则上标记优先级(根据用户自身权限等),将匹配的规则按优先级排序,按优先级升序应用。这通常有效并且更易于管理(例如,每个人都知道最高老板的规则是最终的!)

优先级也可用于将某个规则标记为“全局覆盖”。在您的示例中,您可能希望将“IsPirate”作为覆盖规则——这意味着它会覆盖普通人的设置。换句话说,一旦你成为海盗,你就会受到不同的对待。这使得设计一个系统变得非常容易,在该系统中,您有一堆正常的业务规则来管理 90% 的情况,然后是一组被区别对待的“异常(exception)”,自动覆盖某些事情。在这种情况下,您还应该考虑制作“?”也可在输出列中使用。

另一种可能的解决方法是在每个条件中包含属性。例如,某些条件必须没有“零”才能通过(?无关紧要)。有些条件必须至少有一个“一”才能通过。换句话说,将每个条件标记为“AND”、“OR”或“XOR”。一些流行的文件系统安全使用这种模型。例如,CanGetJob 可能是 AND(您希望严格遵守工作权利)。 CanBeEvicted 可能是或者——如果外国人也是海盗,你甚至可能想要驱逐他。

AND/OR 方法的一个改进是提供一个阈值,在通过该条件之前,总结果必须超过该阈值。例如,将 CanGetJob 设置为 2 的阈值,那么它必须至少获得两个 1 才能返回 1。这有时在不清晰的黑白条件下很有用。

您可以混合解析方法:例如首先确定优先级,然后使用 AND/OR 来解决具有相似优先级的规则。

可能性是无限的,实际上取决于您的实际需求。

关于rule-engine - 如何开始使用大型决策表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5101879/

相关文章:

javascript - 创建 DSL 表达式解析器/规则引擎

java - 检查字符串列表中的任何字符串是否出现在段落(字符串)中?

java - 超能力规则语言: return datafield of class from pattern

node.js - 使用 MongoDB 的用户分割引擎

流口水的规则需要多个其他规则

java - 用于根据规则集重命名/移动文件的 Java API

java - Drools 决策表中的无限循环

java - drools (6.2) 事实不会在有状态 session 中重新评估

java - Drools 中的非模板动态规则

optimization - OptaPlanner 是否支持对连续变量的优化和约束?