如何开始使用大型决策表

时间:2011-02-24 08:00:58

标签: rule-engine

今天我遇到了一个有趣的挑战,我想知道如何处理这种情况。

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

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

decision table example

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

示例:

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

我们的解决方案

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

我的问题

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

5 个答案:

答案 0 :(得分:8)

您的问题似乎解决了相互冲突的规则。当多个规则符合您的输入(您的外国人和海盗)并最终推荐不同的内容(您的cangetjob和cangetevicted)时,您需要一个针对此冲突的解决方案的策略。

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

另一种可能的解决方法是优先级。标记每个规则的优先级(基于用户自己的权限等),根据优先级对匹配规则进行排序,并按优先级递增顺序应用。这通常有效并且管理起来要简单得多(例如,每个人都知道最高老板的规则是最终的!)

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

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

AND / OR方法的增强是提供在传递该条件之前总结果必须超过的阈值。例如,将CanGetJob置于阈值2,那么它必须至少获得两个1才能返回1.这有时在非明显黑白的条件下有用。

您可以混合分辨率方法:例如首先确定优先顺序,然后使用AND / OR解决具有类似优先级的规则。

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

答案 1 :(得分:3)

对我来说,这个问题提醒business rules engine,没有已知算法来定义输入的输出(例如使用布尔逻辑),但用户(通常是某种管理员)必须定义全部或部分逻辑本身。

这可能听起来有点过分但OTOH提供了几乎无限制的扩展功能:您不必编写任何新的业务逻辑代码,只需定义新的规则集。

据我了解您的问题,您正在寻找一种可视化这些规则编辑的好方法。但这一切都取决于您的编程语言和您为此选择的工具。例如,Java有JBoss Drools。引用他们的页面:

  

Drools Guvnor提供了一个(逻辑上   集中存储库来存储你   商业知识和基于网络的   允许业务用户的环境   查看和(在某些情况下)   约束)可能更新   业务逻辑直接。

您可以使用此通用工具或编写自己的工具。

答案 2 :(得分:1)

一切都取决于您的实际规则是什么样的。像'IF这样的规则具有偶数个这些属性,然后用这种格式表示会很痛苦,而像'如果盗版而不是极客那样'这样的规则很容易。

您可以通过声明您将始终使用第一个实际匹配来“避免歧义”,换句话说,您的规则具有优先权。然后,您需要标记无效的规则,因为它们被更高的规则“遮蔽”。他们不难找到,所以这是你的程序应该做的事情。

您的界面还可以指示规则组,其中组内的规则可以按任何顺序排列,而不会更改结果。这将增加规则的真实含义。

如果您的某些输出相对独立于其他输出,则通过在输出中允许问号,您还可以获得更紧凑,更清晰的表格。在该设计中,对于每个输出,对第一匹配规则的扫描进行一次。例如,考虑'HasChildren'是否是与'可以被驱逐'相关的唯一因素。如果输出中有问号(=无效果),则可以将异常规则的数量减半。

我的背景是电路逻辑设计,而不是业务逻辑。您正在设计的内容与PLA类似,但不一样。只要您的实际规则接近产品总和,那么它就能很好地运作。如果您的规则不是,例如“偶数个这些属性”规则,那么网格状的表示将在组合的案例爆炸中分解。你最好的希望如果你的规则是任意的是用方程式或电路图等图表来获得更清晰,更紧凑的表示。如果可以的话,要避免。

答案 3 :(得分:1)

如果您正在寻找带有GUI的决策引擎,那么您可以试试这个:http://gandalf.nebo15.com/

我们刚刚发布它,它是开源和生产就绪的。

答案 4 :(得分:0)

您可能需要某种推理引擎。想想在prolog中做这件事。