原子上可能不是正确的词.在对细胞自动机或神经网络进行建模时,通常会有两个系统状态副本.一个是当前状态,一个是您正在更新的下一步的状态.这确保了在运行所有规则以确定下一步骤时系统整体状态保持不变的一致性.例如,如果您运行一个单元格/神经元的规则以确定下一步的状态,则运行下一个单元格的规则,它的邻居,您要将这些规则用作当前状态的输入相邻单元格,而不是其更新状态.
这可能看起来效率低,因为每个步骤都要求您在更新它们之前将所有当前步骤状态复制到下一步状态,但重要的是要这样做以准确模拟系统,就好像所有细胞/神经元实际上都是同时处理,因此规则/触发功能的所有输入都是当前状态.
在为专家系统设计规则时困扰我的是一个规则如何运行,更新一些应该触发其他规则运行的事实,并且你可能有100个排队等待运行的规则作为响应,但显着性被用作脆弱的确保真正重要的人先行的方法.随着这些规则的运行,系统会发生更多变化.事实的状态一直在变化,因此当您处理第100条规则时,系统的状态自从它真正响应第一个事实更改时添加到队列的时间以来发生了显着变化.它可能已经发生了巨大的变化,以至于规则没有机会对系统的原始状态作出反应.通常作为一种解决方法,你仔细调整它的显着性,然后将其他规则移到列表中,你会遇到鸡或蛋的问题.其他解决方法涉及添加"处理标志"事实,这些事实充当锁定机制以抑制某些规则,直到其他规则处理.这些都感觉像黑客,并导致规则包括超出核心域模型的标准.
如果您构建了一个真正复杂的系统来准确地建模问题,那么您真的希望将对事实的更改分段到一个单独的"更新"队列,该队列在规则队列为空之前不会影响当前事实.因此,假设您做了一个事实更改,填充规则队列以运行100个规则.所有这些规则都会运行,但它们都不会更新当前事实列表中的事实,它们所做的任何更改都会排队到更改列表,并确保在当前批处理时不会激活其他规则.处理完所有规则后,事实更改将立即应用于当前事实列表,然后触发更多要激活的规则.冲洗重复.因此它变得非常像神经网络或细胞自动机的处理方式. 针对不变的当前状态运行所有规则,队列更改,在运行所有规则后将更改应用于当前状态.
这种操作模式是否存在于专家系统的学术界?我想知道是否有一个术语.
Drools是否具有以允许所有规则运行而不影响当前事实的方式运行的能力,并且在所有规则运行之前单独排队事实更改?如果是这样,怎么样? 我不希望你为我编写代码,只是在API中调用它的一些关键字或关键字,一些起点可以帮助我搜索.
是否有其他专家/规则引擎具备此功能?
请注意,在这种情况下,订单规则运行不再重要,因为排队运行的所有规则都将只看到当前状态.因此,当运行和清除规则队列时,没有规则看到其他规则正在进行的任何更改,因为它们都是针对当前事实集运行的. 因此,顺序变得无关紧要,管理规则执行顺序的复杂性就消失了. 在从队列中清除所有规则之前,所有事实更改都将处于暂挂状态并且不会应用于当前状态.然后立即应用所有这些更改,从而导致相关规则再次排队.因此,我的目标不是更多地控制规则运行的顺序,而是通过使用模拟同时执行规则的引擎来完全避免规则执行顺序的问题.
我正在将Drools Rules引擎集成到我的应用程序中.我发现开始的99%的例子看起来像:
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add( ResourceFactory.newUrlResource( url ),
ResourceType.DRL );
if ( kbuilder.hasErrors() ) {
System.err.println( builder.getErrors().toString() );
}
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
kbase.addKnowledgePackages( builder.getKnowledgePackages() );
StatefulKnowledgeSession ksession = knowledgeBase.newStatefulKnowledgeSession();
ksession.insert( new Fibonacci( 10 ) );
ksession.fireAllRules();
ksession.dispose();
Run Code Online (Sandbox Code Playgroud)
我有类似的工作,但我的问题是KnowledgeBase
被标记为已弃用,这对我来说是一个红旗,我做错了.现在KnowledgeBaseFactory.newKnowledgeBase()
没有标记为已弃用,但它也返回一个KnowledgeBase
类型.
那么我应该使用什么,因为不推荐使用KnowledgeBase?
当我尝试在Drools规则中导入MultiMap时,它会导致下面的错误
[11,25]: [ERR 102] Line 11:25 mismatched input 'COLLECT' expecting 'identifier' in import
Run Code Online (Sandbox Code Playgroud)
有谁知道如何在Drools规则中导入任何com.google.common.collect?
PS Problem soleved如果有人有兴趣你应该使用如下的反引号
com.google.common.`collect`.Multimap
Run Code Online (Sandbox Code Playgroud) 我对drools有一个奇怪的问题:
我有以下规则:
rule "is my dog a baby?"
ruleflow-group "dog"
salience 10
when
dog : Dog(age <1 )
then
dog.setIsBaby(true);
end
rule "baby dog"
ruleflow-group "dog"
salience 9
when
myData : MyData( myDog.isBaby() == false)
then
System.out.println(myData.getMyDog().getIsBaby());
end
Run Code Online (Sandbox Code Playgroud)
我插入我的会话myData和myData.getMyDog()
,在哪里myData.getMyDog.isBaby==false
第一条规则被解雇,我的狗将成为一个婴儿.然后第二个被触发,甚至它打印为真.(即使条件是假的)
当我在解决所有规则后进行测试时,myData中的myDog将被设置为婴儿.
我在这做错了什么?为什么第二条规则被解雇了?是会话中的问题(在我的情况下是有状态的)?
我想我需要说我修改了myData:myDog,但我不知道在哪里.
如果不告诉我,希望我的问题很清楚.
我是这个框架的初学者,我正在尝试使用地图而不是Java类.
我的例子看起来像这样:
主要方法:
Map<String, Float> mapa = new HashMap<String, Float>();
mapa.put("Height", (float)1.73);
mapa.put("Weight", (float)79.0);
mapa.put("BMI", mapa.get("Weight") /
(mapa.get("Height") * mapa.get("Height")));
ksession.insert(mapa);
Run Code Online (Sandbox Code Playgroud)
rule.drl:
rule "Low BMI"
when
$map : (Map(values("BMI")) < 18.0)
then
System.out.println("You have a low BMI");
end
Run Code Online (Sandbox Code Playgroud)
我想比较规则前置条件中BMI的值,如果这个条件为真,那么我想在下面显示消息.
怎么了?
是否可以在流氓规则的then子句中检索规则名称?
rule "A"
when
---
then
// something that outputs "A"
Run Code Online (Sandbox Code Playgroud)
谢谢.
无状态知识会话和有状态知识会话之间有什么区别.我读了一些文档都维护状态.但是什么时候可以使用无状态/有状态知识会话.
我一直在评估Drools作为规则引擎,用于我们的业务Web应用程序.
我的用例是订单管理应用程序.
规则如下:
- 如果用户类型为"特殊",则额外提供5%的折扣.
- 如果用户已经进行了10次以上的购买,请额外享受3%的折扣.
- 如果产品类别为"旧",请向价值5美元的用户赠送礼品篮.
- 如果产品类别为"新",请向价值1美元的用户赠送礼品篮
- 如果用户过去已购买超过1000美元,则免费送货
我看到的直接挑战是:
- 没有有意义的用户界面可以提供给最终用户修改规则.
- 从最终用户的角度来看,Guvnor UI或任何修改drl文件的编辑器都是不可接受的 - 这些规则中的大多数都将在db中可用的大量数据上运行
所以,
- 我想让管理员用户在我的Web App UI中指定这些规则.
- 我可以将这些"规则"存储在数据库中,然后通过Drools对它们进行操作 - 至少允许我通过"自己的"UI"修改"这些规则.所以这就像数据库中的决策表.
- 最好的方法是什么?
我在KIE API中需要帮助.需要知道它是什么,是否有任何教程可以使用Drools KIE.是kro的一部分drools-6.x?如果它是drools-6.x的一部分那么使用运行JBPM5.4和guvnor 5.5的Drool-5.5会对应用程序产生什么影响呢?
问候,
扎希德艾哈迈德
我正在撰写关于规则引擎技术的演示文稿,特别是JBoss Drools.
什么是关于规则引擎的"神话".
我能想到的是,它允许业务用户控制规则引擎,我相信它是可能的,但它需要控制和教育 - 并非所有业务用户都能够做到这一点.
你同意/不同意吗?有没有人有任何想法?
很高兴在Creative Commons下发布我的最终"调查结果"......