大小排序/数据排序/最近最少使用的规则有什么区别?
我已经做了很多研究,而且大多数书都说:
数据排序:将所有可能的断言排列在一个长优先级列表中。使用具有与列表中最高优先级声明相匹配的条件模式的触发规则。
大小排序:使用具有最严格要求的触发规则,其中最强意味着最长的条件列表。
最近最少使用的规则(最近顺序):使用最近最少使用的规则。
但是,所有这些解释对我来说都太抽象了,我无法很好地理解它们。
有人可以通过以下案例帮助我解释这三种策略吗? (随时使用自己的情况)
答案 0 :(得分:1)
要了解什么是冲突解决策略,让我们模拟一个条件,其中两个规则之间存在冲突。我将介绍第一个和第二个示例,对于规则,我将使用CLIPS语言。
第一个规则是快速回应投诉。如果我们没有有关如何处理投诉的更多信息,这是理想的选择。
如果将投诉的客户分配给经理,然后将投诉转发给经理,则会激活第二条规则。
(defrule generic-excuse
; Provide a generic excuse to complaining customers
?complaint <- (complaint (customer ?customer))
=>
(respond-to-customer ?customer "We are sorry for the inconvenience.")
(retract ?complaint))
(defrule forward-complaint-to-manager
; Forward a complaint to the assigned manager
?complaint <- (complaint (customer ?customer))
?manager <- (manager (assigned-customers $?customers)) ; managers have a list of assigned customers
(test (member$ ?customer ?customers)) ; test if the customer among the ones assigned to the manager
=>
(forward-to-manager ?manager ?complaint)
(retract ?complaint))
这两个规则似乎可以方便地涵盖这两种情况。这两个规则都会在投诉本身得到管理时触发,从而从引擎的工作记忆中删除(撤回)投诉。
尽管如此,如果双方都具备开枪的全部条件,他们就会相互冲突。理想情况下,如果有一位经理分配给给定的客户,则投诉应转发给他/她。但是在这种情况下,第一条规则可能会接管,客户将获得通用道歉,而不是被重定向到经理。
通常,规则开发者通过显着性机制控制规则的执行顺序。如果规则看起来具有相同的显着性,则冲突解决将接管并决定规则将以什么顺序触发。
您提到的第一个解决策略(数据排序)建议将根据事实的断言顺序进行优先级排序。
CLIPS中的第二种策略(大小排序)称为复杂性策略。它优先考虑具有更多约束条件的规则。在上面的示例中,这是要采用的正确策略,因为管理器规则更加具体,因此更加复杂。如果您构建规则库,以使更多特定规则应取代通用规则,那么这是您选择的策略。
第三种策略很容易理解。最早触发最少的规则将被优先处理。
总而言之,规则冲突在专家系统中极为常见。解决策略会影响规则库的增长方式以及维护成本的增长方式。在设计之初进行明智的选择非常重要,因为稍后进行更改可能会带来许多令人不愉快的重构。
您可以在下面的gist中看到示例程序的完整副本。