规则具有固定数量的输入参数,每个参数都有不同的域。
考虑三个规则参数:颜色、材料和尺寸:
- 颜色:红、绿、蓝 - 材料:木头、玻璃、铝 - 尺寸:小、中、大
每个规则可以匹配一个参数的多个值或匹配任何值。选择匹配所有参数值的第一个规则。没有否定规则,但域是固定的,因此可以通过添加所有其他规则来实现否定。
+--------------------------------------------------++-----------------
| Rule Parameters || Rule Action
+----------------+------------------+--------------++-----------------
| Color | Material | Size || ==> Price
+----------------+------------------+--------------++-----------------
Rule 1 | Red | Wood, Glass | Large || $100
Rule 2 | Red | Aluminium | Large || $200
Rule 3 | Blue or Green | Wood | Medium || $300
Rule 4 | Red | ** Any ** | Large || $400 <== Redundant
Rule 5 | ** Any ** | ** Any ** | ** Any ** || $500
规则4由于规则1和2的组合是冗余的。冗余规则是指由于在该规则之前定义的规则(的组合)而永远不会被匹配的规则。在冗余检查中不评估规则动作。
如何高效地实现这个(Java)?它应该支持1000个带有10个参数和每个参数有100个值的规则。规则、参数和参数值从数据库中读取(即它们不能被硬编码)。
效率问题在于有100^10种输入参数的组合(每个参数都有100个值的域)。算法需要在规则编辑器GUI中使用,以支持创建规则的用户。它应该在几秒钟内找到所有的冗余规则。
GITHUB
我创建了一个存储库来测试提出的解决方案: https://github.com/qlp/redundant-rules目前只有一个BDD实现,但在这个大小的问题上失败了。也许我的BDD实现可以改进?