我正在寻求设计一个基本上需要根据输入做出决策的系统。输入将是一个人。
class Person:
def __init__(self, name, age, sex, weight, height, nationality):
self.name = name
self.age = age
self.sex = sex
self.weight = weight
self.height = height
self.nationality = nationality
我们希望根据某些规则将每个人分配到一个学校班级。
例如:
22至25岁之间的英国妇女应参加B级。 75岁以上的男性应该参加A级。 6英尺以上的女性应参加C级课程。
我们将有大约400个不同的规则,并且应该应用第一个满足的规则-我们需要保持规则的顺序。
我正在考虑如何在此处存储/表示规则。显然,您可能只有一段很长的if, elif, elif
声明,但这并不有效。另一种选择是将规则存储在数据库中,并可能在内存表中。
我希望能够在不发布规则的情况下编辑规则-可能具有允许非技术人员添加,删除和重新排序规则的前端。
这里所有内容都在表上-唯一的要求是实际的编程语言必须是Python。
添加了更多背景信息
我想我的问题是如何存储规则。目前,这是一条巨大的长if elif elif
语句,因此,只要业务逻辑发生变化,PM就会制定新规则,然后将它们转换为if语句。
系统的所有输入将通过相同的规则列表发送,并且将应用第一个匹配的规则。多个规则可以应用于每个输入,但始终是第一个应用的规则。
例如
25岁以上的女性进入B级课程
女人上A级。
即使第二条规则也适用,所有25岁以上的女性都将被送进B级。
输入将始终包含相同格式的输入-尚未确定它将是对象还是字典的位置,但某些值可能是None
。有些人可能没有与之相关的体重。
答案 0 :(得分:9)
与其建议您重新发明轮子,不建议您使用一些易于使用的解决方案。有几种专家系统,我将重点介绍那些使用Python或可通过Python使用的系统。
CLIPS
是最初由NASA开发的专家系统。它被认为是最先进的,并且在教授AI基础知识时用于大学课程。由于其出色的文档记录,这是一个很好的起点。
它的语法绝对不是Python,而是让人想起Lisp。 CLIPS
的优势在于它是一个可靠的C引擎,可以通过其绑定与旧的pyclips和新的clipspy的任何其他Python系统完全集成。绑定允许将Python代码嵌入CLIPS语言中,从而使其易于扩展。
可以在运行时加载规则,而无需重新启动引擎,这将更适合您的需求。
Python Knowledge Engine
是一个相当强大的逻辑编程框架。对于CLIPS
,PyKE
拥有自己的语法来表达规则,并依靠Python来实现机制。
换句话说,您用Python编写了做什么,并通过规则表达了时间和方式。
可以根据需要激活和禁用规则。这应该允许您支持无版本更新。
Durable Rules
是一个相当新的项目,旨在支持多种编程语言(到目前为止,支持Python,Node.js和Ruby)。
Durable Rules
允许您用Python编写整个知识库(事实和规则)。语法可能看起来有点怪异,但在此之后请注意。
我不确定在系统在线时是否可以更新规则集。
除了对多种语法的支持之外,我对这个项目感兴趣的是,其核心是建立在Redis DB之上的RETE
的基于C的实现。从长远来看,这可能会导致一些有趣的发展。
这些项目允许大多数情况下使用Python表达知识库。我从未见过他们的实际应用,也不确定他们的性能和功能支持。
我建议不使用自己的规则引擎以在生产中使用的主要原因是,尽管起初似乎很容易,但是很明显问题域比预期的要大。
Python OOP本质最初似乎很适合表达知识,因为Rule和Facts都可以是简单的类。
不过,模式匹配变得稍微复杂一点(Employee
必须在Company
中工作了3年以上,而Stock
的值在过去3年中小于10 $)两件事变得明显。
and
,or
,not
,is
,...的局限性使得事情真的很难阅读此外,强迫组织的员工使用另一种内部构建的语言通常是一个坏主意。这样会阻止他们学习在更广泛的上下文中使用的内容,例如CLIPS
或Drools
,并使您长时间陷入维护/文档循环中。