基于Python规则的引擎

use*_*855 2 python artificial-intelligence rules expert-system

我正在寻求设计一个基本上需要根据输入做出决策的系统。输入将是一个人。

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
Run Code Online (Sandbox Code Playgroud)

我们希望根据某些规则将每个人分配到一个学校班级。

例如:

22至25岁之间的英国女性应进入B级。75岁以上的男性应进入A级。6英尺以上的女性应进入C级。

我们将有大约400个不同的规则,并且应该应用第一个满足的规则-我们需要保持规则的顺序。

我正在考虑如何在此处存储/表示规则。显然,您可能只想发表一段很长的if, elif, elif声明,但这并不有效。另一种选择是将规则存储在数据库中,并可能在内存表中。

我希望能够在不发布规则的情况下编辑规则-可能具有前端,以允许非技术人员添加,删除和重新排序规则。

一切都在这里-唯一的要求是实际的编程语言必须是Python。

添加了更多内容

我想我的问题是如何存储规则。目前,这是一条很长的if elif elif语句,因此只要业务逻辑发生变化,PM都会制定新规则,然后将它们转换为if语句。

系统的所有输入将通过相同的规则列表发送,并且将应用匹配的第一个规则。多个规则可以应用于每个输入,但始终是第一个应用的规则。

例如

25岁以上的
女性去B级女性去A级。

即使第二条规则也适用,所有25岁以上的女性都将被送入B级。

输入将始终包含相同格式的输入-尚未确定它是对象还是字典的位置,但其中一些值可能是None。有些人可能没有与之相关的体重。

nox*_*fox 23

我建议您不要使用新的解决方案,而应该重新发明轮子。这里有几种专家系统,我将重点介绍那些使用Python或可通过Python使用的系统。

片段

CLIPS是最初由NASA开发的专家系统。它被认为是最先进的,并且在教授AI基础知识时用于大学课程。由于其出色的文档资料,这是一个很好的起点。

它的语法绝对不是Python,而是让人想起Lisp。这样做的好处CLIPS是它是一个可靠的C引擎,可以通过其绑定与所有其他Python系统完全集成:较旧的pyclips和较新的clipspy。绑定允许将Python代码嵌入CLIPS语言中,从而使其易于扩展。

可以在运行时加载规则,而无需重新启动引擎,这将更适合您的需求。

派克

Python Knowledge Engine这是一个相当强大的逻辑编程框架。至于CLIPSPyKE它具有自己的语法来表达规则,并依靠Python来实现机制。

换句话说,您用Python编写了做什么,并通过规则表达了何时以及如何进行。

可以根据需要激活和禁用规则。这应该允许您支持无版本更新。

耐用的规则

Durable Rules 这是一个相当新的项目,旨在支持多种编程语言(到目前为止,支持Python,Node.js和Ruby)。

Durable Rules使您可以用Python编写整个知识库(事实和规则)。不过,语法可能看起来有些怪异,在此之后的结尾处对此进行了注释。

我不确定在系统在线时是否可以更新规则集。

除了多重语法支持之外,我对这个项目感兴趣的是,其核心是基于RETERedis DB的基于C的实现。从长远来看,这可能会导致一些有趣的发展。

PyKnow,Python智能和业务规则

皮诺

智力

商业规则

这些项目允许大多数情况下使用Python表达知识库。我从未见过它们的实际应用,并且我不确定它们的性能和功能支持。


我建议不要将自己的规则引擎用于生产中的主要原因是,尽管起初看似很容易,但很快就会发现问题域比预期的要大得多。

最初,Python OOP本质似乎很适合表达知识,因为Rule和Facts都可以是简单的类。然而,一旦模式匹配变得有点复杂(Employee一定很成功,> 3岁Company,其Stock值<在过去3年$ 10),两件事情变得很明显。

  1. 简单地使用限制andornotis,...使事情真的很难读
  2. 问题突然显示出它的指数性质,性能成为主要问题

而且,强迫组织的员工使用另一种内部构建的语言通常是一个坏主意。它阻止他们学习在诸如CLIPSDrools等更广泛的上下文中使用的东西,并使您长时间陷入维护/文档循环。

  • `PyKnow` 似乎不再维护。`PyKnow` 项目有一个活跃的分支 [experta](https://github.com/nilp0inter/experta)。 (4认同)
  • 看起来 pyke 是在 2010 年创建的。下载被列为最后一次修改于 2010 年。这仍然相关吗? (3认同)