将业务规则表示为约束模型以查找解决方案集

时间:2016-12-17 12:36:56

标签: java boolean-expression constraint-programming

在我的企业应用程序中,我有以下业务规则:

  1. ((AMOUNT < 20000.00) || ((AMOUNT >= 20000.00) && (RISKEXPOSURE == 'N')))
  2. (ind = A1 || ind = A2 || ind = A3 || ind = S1 || ind = S2 || ind = S9)
  3. 正如您所见,规则由业务表达式ex (AMOUNT < 20000.00)构成。 规则可以由布尔运算符&&||连接任意数量的业务条件。 标识符AMOUNTRISKEXPOSUREind是业务变量(根据业务域可能会在1到n之间变化)。

    我的要求是在true时使用这些表达式使整个规则成立。 例如: 对于业务规则#1 - 如果符合以下条件,整个规则将成立: (AMOUNT < 20000.00)为真或((AMOUNT >= 20000.00) && (RISKEXPOSURE == 'N'))为真,因此我的输出应为:

    解决方案#1:(AMOUNT < 20000.00)

    解决方案#2:((AMOUNT >= 20000.00) && (RISKEXPOSURE == 'N'))

    同样适用于业务规则#2:

    解决方案#1:ind = A1

    解决方案#2:ind = A2

    解决方案#3:ind = A3

    解决方案#4:ind = S1

    解决方案#5:ind = S2

    解决方案#6:ind = S9

    我尝试了什么

    由于每个业务表达式都可以是true或false,因此我将业务规则#1更改为(A || ( B && C ) )。我使用了来自Tweetyproject的命题逻辑库。这给了我结果,但我不能强制执行XOR等约束。在我的示例中,A和B是互斥的,但我的输出结果可能。以真实表格形式表示规则,我得到以下所有真实条件

    011 ,100 ,101 ,110 ,111

    但是我的结果应该只有100,011

    这引导我寻找替代方案,答案here建议使用约束求解器。 我一直在阅读Choco Solver。但我不确定我的业务规则如何在解算器可接受的模型中表示。任何帮助是极大的赞赏。

2 个答案:

答案 0 :(得分:0)

简单的解决方案可以是实现找到给定大小的布尔值的所有组合的算法。然后,对于每个表达式,通过组合值和表达式的相反值计算整个表达式。如果在每个组合中,整个表达式计算与组合行中的值以及表达式的相反值不同,则此表达式就是您需要的。我会尽力解释一下。

你有表达式(A || ( B && C ) ) = BIG 然后你会找到可能值的组合:例如

[[001],[010],[011]...[111]]

对于他们中的每一个,将值替换为您的BIG表达式,并将表达式的结果与您想要的表达式的相反值 - [101] with [001] | [110] with [010]进行比较,并且对于每个组合,结果是差异,您找到表达式。然后切换到下一个索引并再次执行此操作

答案 1 :(得分:0)

我建议你看看SMT解决问题。它自然地允许解决所述问题。您引入了任何合理数量的约束(包括整数和布尔值)和变量。基本上,它试图满足方程给出一些约束。它将为您的任务找到第一个令人满意的任务。

探索链接:

  1. Z3
  2. CVC4
  3. yices2
  4. 请注意,运行时和性能在很大程度上取决于问题本身:约束,常量,精确值。