出于学习目的,我想研究一个开源专家系统,特别是可以推理和解释它的推理的专家系统.你知道哪些?
规则引擎和专家系统有什么区别?
例1:假设我有一个程序来确定新驾驶执照的到期日期.它需要签证有效期,护照号码,生日等输入.它根据此输入确定驾驶执照的到期日期.如果输入没有足够的有效标识来允许新的驾驶执照,它甚至会出错.
例2:假设我正在制作游戏Monopoly的在线版本.我希望能够改变比赛的规则(比如传球去400美元,或者没有人可以购买房产,直到他们两次落在同一个房产上等).我在代码中有一个模块来处理这些规则.
这些都是规则引擎还是专家系统?它们看起来都很相似.它只是一个同义词吗?
原子上可能不是正确的词.在对细胞自动机或神经网络进行建模时,通常会有两个系统状态副本.一个是当前状态,一个是您正在更新的下一步的状态.这确保了在运行所有规则以确定下一步骤时系统整体状态保持不变的一致性.例如,如果您运行一个单元格/神经元的规则以确定下一步的状态,则运行下一个单元格的规则,它的邻居,您要将这些规则用作当前状态的输入相邻单元格,而不是其更新状态.
这可能看起来效率低,因为每个步骤都要求您在更新它们之前将所有当前步骤状态复制到下一步状态,但重要的是要这样做以准确模拟系统,就好像所有细胞/神经元实际上都是同时处理,因此规则/触发功能的所有输入都是当前状态.
在为专家系统设计规则时困扰我的是一个规则如何运行,更新一些应该触发其他规则运行的事实,并且你可能有100个排队等待运行的规则作为响应,但显着性被用作脆弱的确保真正重要的人先行的方法.随着这些规则的运行,系统会发生更多变化.事实的状态一直在变化,因此当您处理第100条规则时,系统的状态自从它真正响应第一个事实更改时添加到队列的时间以来发生了显着变化.它可能已经发生了巨大的变化,以至于规则没有机会对系统的原始状态作出反应.通常作为一种解决方法,你仔细调整它的显着性,然后将其他规则移到列表中,你会遇到鸡或蛋的问题.其他解决方法涉及添加"处理标志"事实,这些事实充当锁定机制以抑制某些规则,直到其他规则处理.这些都感觉像黑客,并导致规则包括超出核心域模型的标准.
如果您构建了一个真正复杂的系统来准确地建模问题,那么您真的希望将对事实的更改分段到一个单独的"更新"队列,该队列在规则队列为空之前不会影响当前事实.因此,假设您做了一个事实更改,填充规则队列以运行100个规则.所有这些规则都会运行,但它们都不会更新当前事实列表中的事实,它们所做的任何更改都会排队到更改列表,并确保在当前批处理时不会激活其他规则.处理完所有规则后,事实更改将立即应用于当前事实列表,然后触发更多要激活的规则.冲洗重复.因此它变得非常像神经网络或细胞自动机的处理方式. 针对不变的当前状态运行所有规则,队列更改,在运行所有规则后将更改应用于当前状态.
这种操作模式是否存在于专家系统的学术界?我想知道是否有一个术语.
Drools是否具有以允许所有规则运行而不影响当前事实的方式运行的能力,并且在所有规则运行之前单独排队事实更改?如果是这样,怎么样? 我不希望你为我编写代码,只是在API中调用它的一些关键字或关键字,一些起点可以帮助我搜索.
是否有其他专家/规则引擎具备此功能?
请注意,在这种情况下,订单规则运行不再重要,因为排队运行的所有规则都将只看到当前状态.因此,当运行和清除规则队列时,没有规则看到其他规则正在进行的任何更改,因为它们都是针对当前事实集运行的. 因此,顺序变得无关紧要,管理规则执行顺序的复杂性就消失了. 在从队列中清除所有规则之前,所有事实更改都将处于暂挂状态并且不会应用于当前状态.然后立即应用所有这些更改,从而导致相关规则再次排队.因此,我的目标不是更多地控制规则运行的顺序,而是通过使用模拟同时执行规则的引擎来完全避免规则执行顺序的问题.
我正在撰写关于规则引擎技术的演示文稿,特别是JBoss Drools.
什么是关于规则引擎的"神话".
我能想到的是,它允许业务用户控制规则引擎,我相信它是可能的,但它需要控制和教育 - 并非所有业务用户都能够做到这一点.
你同意/不同意吗?有没有人有任何想法?
很高兴在Creative Commons下发布我的最终"调查结果"......
在我正在进行的应用程序中,我需要定期检查成千上万个对象的资格,以获得某种服务.决策图本身采用以下形式,只是更大:
在每个端节点(圆圈)中,我需要运行一个动作(更改对象的字段,日志信息等).我尝试使用Drool Expert框架,但在这种情况下,我需要为图中的每个路径编写一条长规则,从而导致结束节点.Drools Flow似乎也没有为这样的用例构建 - 我拿一个对象,然后,根据一路上的决定,我最终进入一个终端节点; 然后又为另一个对象.或者是吗?你能给我一些这些解决方案的例子/链接吗?
更新:
Drools Flow调用可能如下所示:
// load up the knowledge base
KnowledgeBase kbase = readKnowledgeBase();
StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
Map<String, Object> params = new HashMap<String, Object>();
for(int i = 0; i < 10000; i++) {
Application app = somehowGetAppById(i);
// insert app into working memory
FactHandle appHandle = ksession.insert(app);
// app variable for action nodes
params.put("app", app);
// start a new process instance
ProcessInstance instance = ksession.startProcess("com.sample.ruleflow", params);
while(true) {
if(instance.getState() == instance.STATE_COMPLETED) {
break; …Run Code Online (Sandbox Code Playgroud) 我正在寻找方向并尝试标记此问题:
我试图在Python中构建一个简单的推理引擎(有一个更好的名字?),它将采用一个字符串和 -
1 - 通过简单地创建一个空格分隔值列表来创建一个令牌列表
2 - 使用正则表达式对这些标记进行分类
3 - 使用更高级别的规则集根据分类做出决策
例:
"90001" - 一个令牌,与zipcode正则表达式匹配,对于仅包含zipcode的字符串存在规则会导致某种行为发生
"30 + 14" - 三个标记,数值的正则表达式和数学运算符匹配,存在数值后跟数学运算符后跟另一个数值的规则导致某种行为发生
我正在努力学习如何最好地完成第3步,更高级别的规则.我确信某些框架必须存在.有任何想法吗?另外,你如何描述这个问题?基于规则的系统,专家系统,推理引擎,还有什么?
谢谢!
我正在使用带有推理引擎(前向链接)的专家系统,我想解释为什么它比使用非常简单的概念的决策树更好.(在某种特殊情况下)
我知道stackoverflow上有一个类似的问题,但它不是我正在寻找的答案.
这是我的问题:
对于客户关系管理,我使用了许多不同的业务规则(引发对话规则)来帮助客户对一个产品做出决策.注意:经常添加规则(每天2个).
在得到答案之前,客户回答了一系列问题.与对话规则混合的业务规则使得得到的问卷看起来像是由最优决策树生成的问卷.即使隐藏的推理完全不同.
我想知道与这种情况下的决策树相比,在可伸缩性,健壮性,复杂性和效率方面支持(或可能反对)推理引擎的主要论点是什么.
我已经有了一些想法,但是因为我需要说服别人,所以我从来没有足够的论据.
提前感谢您的想法,如果您能告诉我有关此主题的优秀论文,我将非常高兴.
LISP或Jess之类的东西是最好的选择吗?我有兴趣编写一个基于用户答案提出建议的程序.计算方面的考虑并不是一个真正的因素,它几乎就是模式匹配引擎.此外,我想为此制作一个应用程序并将其放在网上.
更新:我想把它放在博客或网站上,让人们从那里使用它.我想我的问题是,是否有一个特定的推理引擎可以与.NET系列或PHP一起使用,或者那种效果?每种选择等的优缺点有哪些?
我有一个算法问题可以简化为这个任务:
假设我们有一系列n疾病和m症状.
对于每种疾病d和症状s,我们有三种选择之一:
s => ds => ~d该算法的目标是创建关于症状的是/否问题列表(甚至更好 - 问题的二叉树),其可以根据症状推断出确切的疾病.
任何对特定算法,相关软件工具甚至特定领域术语的引用都将非常受欢迎.
expert-system ×10
rule-engine ×4
drools ×3
algorithm ×2
jess ×2
drools-flow ×1
java ×1
jrules ×1
lisp ×1
open-source ×1
optimization ×1
parsing ×1
python ×1