代码之家  ›  专栏  ›  技术社区  ›  Jorge Córdoba

规则评估系统和“不精确”匹配(ej:x<3000)

  •  0
  • Jorge Córdoba  · 技术社区  · 17 年前

    我正在设计一个规则评估系统,需要处理一个事实数据库和数据库上的某些规则。我们现在有一个 modified version of RETE 这部分是正确的,但也有一些缺点。

    问题是规则不局限于精确匹配,但它们还必须支持不等式(如小于)和其他类型的模糊计算。

    例如,假设你有这些事实

    (工资约58000) (工资:SARA 78000) (雇员约翰) (萨拉老板) (嫁给了约翰·萨拉) (John StackOverflow作品)

    你可能有一条规则说:

    (薪水)?W<60000)/(已婚?W)/(工作)?w stackoverflow)==>无论什么

    很明显,结果将用一个?“john”的w值,但是我们现在这样做的方式是通过循环遍历事实基中的每个元素,这些元素与第一个表达式(salary x x)的begining匹配,然后进行比较并将结果存储在事实基IT中。例如,在第一次通过之后,您将在事实库中添加以下项:

    (工资约58000<60000)

    一旦这样做了,你就用通常的rete方法执行连接。这样,它在事实基础中占据了很大的空间,特别是因为规则可以引用任何数字,所以只要规则处于活动状态,您就拥有那些“计算”的事实。

    另一方面,您可以使用第一个表达式应用多个规则,并且可以继续使用标准匹配算法来触发规则。

    有人知道处理这种行为的模式、引用或方法吗?通常的跳跃、治疗、再测试算法只处理(据我所知的)“精确”匹配。

    顺便说一下,这是C.NET。

    2 回复  |  直到 15 年前
        1
  •  1
  •   DaveParillo    17 年前

    CLIPS 在我意识到的情况下,它支持条件元素至少15年。退房 basic programming guide for CLIPS 而这 CLIPS tutorial 举个例子。您可以免费查看(或修改)剪辑源。

    剪辑使用前缀表示法,因此示例条件可能如下所示:

    (defrule fat-boy
        (person-data (name ?name) (weight ?weight))
        (test (> ?weight 100))
    =>
        (printout t ?name " weighs " ?weight " kg! " crlf)
    )
    
        2
  •  -1
  •   Lars D    17 年前

    据我所知,所有的模糊规则都将整数或浮点值范围划分为有限的子范围。例如,如果将工资与58000、60000、78000个值进行比较,则有4个范围:<58000、58000-60000、60000-78000和gt;78000。

    如果是这样的话,也许你可以将变量重新定义为0,1,2,3的整数,从而将不等式规则转换为相等规则。

    推荐文章