3

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

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

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

决策表示例

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

例子:

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

我们的解决方案

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

我的问题

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

4

5 回答 5

9

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

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

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

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

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

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

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

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

于 2011-03-22T06:38:31.533 回答
3

对我来说,这个问题提醒业务规则引擎,其中没有已知的算法来定义输入的输出(例如使用布尔逻辑),但用户(通常是某种管理员)必须自己定义全部或部分逻辑。

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

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

Drools Guvnor 提供了一个(逻辑集中的)存储库来存储您的业务知识,以及一个基于 Web 的环境,允许业务用户查看和(在某些限制内)可能直接更新业务逻辑。

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

于 2011-03-18T10:19:16.547 回答
1

一切都取决于你的实际规则会是什么样子。像“IF 有偶数个这些属性 THEN”这样的规则用这种格式表示会很痛苦,而像“IF pirate and not geek THEN”这样的规则很容易。

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

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

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

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

于 2011-03-20T22:16:08.170 回答
1

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

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

于 2016-03-15T21:28:48.937 回答
0

您可能需要某种推理引擎。考虑在序言中进行。

于 2011-03-18T12:30:33.667 回答