3

我开发了一个程序,该程序根据州标准使用不同类型的承保范围生成保险报价。现在我想添加指定“规则”的功能。例如,我们可能有 3 种覆盖类型(我们将它们称为 UM、BI 和 PD)。好吧,有些州不允许 PD 大于 BI,而其他州不允许 UM 在没有 BI 的情况下存在。因此,我添加了用户创建这些规则的功能,以便在生成报价时遵循规则,因此在程序生成报价时不会违反州法规。

问题

我不希望用户能够选择冲突的规则。用户可以选择任何 VB 数学运算符(>、<、>=、<=、=、<>)并在任一侧设置覆盖范围。他们可以多次执行此操作(但一次只能执行一次),因此他们最终可能会得到如下规则列表:

  • A > B
  • B > C
  • C > A

如您所见,最后一条规则与之前设置的规则冲突。我对此的解决方案是每次用户单击“将规则添加到列表”时验证列表。

假设第三个列表项尚未在列表中,但用户已单击“添加规则”将其放入列表中。验证过程首先检查两个传入变量是否已在同一行上使用。如果没有,它只会在已创建的列表中搜索左侧的传入变量(在本例中为“C”)。如果找到它,则将 tmp1 设置为匹配对面的变量 (tmp1 = 'B')。然后它对右侧的传入变量(在本例中为“A”)执行相同的操作。然后 tmp2 设置为等于 A 对面的变量 (tmp2 = 'B')。如果 tmp1 和 tmp2 相等,则无论使用何种运算符,传入的规则要么是冲突的,要么是不相关的。我很确定这是给定 3 个变量的可靠逻辑。然而,我发现添加任何其他变量都可以轻松绕过我的验证。在任何给定状态下可能有超过 10 种覆盖类型,因此能够验证的不仅仅是 3 种是很重要的。

给定任意数量的变量,是否有任何统一的方法来进行声音验证?任何想法或想法都会受到赞赏。我希望我的解释是有道理的。谢谢

4

2 回答 2

1

一般来说,这是一个相当困难的问题。您实际上想知道的是,一组命题方程(显然)是否为真。为此,您需要相当于“知道”算术的约束求解器。在 VB6 中不太可能找到它,但您可能能够将其作为子进程调用。

如果规则是仅在不等式上的命题方程(AA“,请仅以一种方式编写它们)。其次,尝试解决重言式的命题(参见Wang 的算法,您可能会在 VB6 中笨拙地实现)。

如果命题不是重言式,那么现在您需要将不等式链(例如,A > B > C)构建为图形并查找循环。这失败的地方是当你的命题有析取时,例如,("A>B or B>Q"); 您必须为每种析取组合生成一个不等式链,并丢弃不一致的析取项。如果您将它们全部丢弃,则该集合是不一致的。注意像“A和B”这样的表达;根据 DeMorgans 定理,它们等价于“非 A 或非 B”,例如,“A>B and B>Q”等同于“A<=B or B<=Q”。您可能希望将条件简化为析取范式以避免感到惊讶。

显然有这种不平等的决定程序。它们可能很难实施。

于 2012-07-04T11:09:26.320 回答
1

我最好的选择是某种层次的规则树。当用户添加第一条规则(比如 A > B)时,应用程序可以创建这样的数据结构(lowerValues 是一个 Map,其键指向一个值列表):

lowerValues['A'] = ['B']

现在,当用户添加下一条规则(B > C)时,应用程序可以检查 B 是否已经在任何 lowerValues 列表中(在本例中为 A)。如果发生这种情况,C 被添加到 lowerValues['A'],并且还创建了 lowerValues['B']:

lowerValues['A'] = ['B', 'C']
lowerValues['B'] = ['C']

最后,当用户提供最后一条规则 (C > A) 时,应用程序检查 C 是否在任何 lowerValues 列表中。由于它在 B 和 A 中,因此该规则无效。

希望有帮助。我不记得VB中是否有某种映射。我认为您应该尝试 Dictionary 对象。

为了实现这个想法,所有操作都必须在内部转换为简单类型。因此,例如:

A > B

可以翻译为

B <= A

祝你好运

于 2012-07-03T22:26:43.743 回答