我有一个课堂作业,以使用Drools作为推理机来创建机器人。但是,我的大多数规则都表现得很奇怪,因为它们不是为该类解雇,而是为它的超类解雇。像这样:
我的规则:
import the.manifested.Robotonikku;
import the.manifested.Strategy;
import the.manifested.Action;
import robocode.TeamRobot;
rule "One"
when
Robotonikku();
then
System.out.println("roboto is present");
end
rule "Two"
when
not Robotonikku();
then
System.out.println("roboto is not present");
end
rule "Three"
when
TeamRobot();
then
System.out.println("robot is present");
end
rule "Four"
when
not TeamRobot();
then
System.out.println("robot is not present");
end
和预期的一样
public class Robotonikku extends TeamRobot
在由Robocode的模拟器调用的Robotonikku的run()方法中,我将实例作为事实插入:
ksession.insert(this)
我希望规则一和三可以被执行,但是规则二和三可以被执行。为什么将实例识别为TeamRobot而不是Robotonikku?
提前致谢。
加载代码:
String ficheroReglas = System.getProperty("robot.reglas", RobotDrools.FICHERO_REGLAS);
kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add(ResourceFactory.newClassPathResource(ficheroReglas, RobotDrools.class), ResourceType.DRL);
if (kbuilder.hasErrors()) {
System.err.println(kbuilder.getErrors().toString());
}
kbase = KnowledgeBaseFactory.newKnowledgeBase();
kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
ksession = kbase.newStatefulKnowledgeSession();
最佳答案
Robocode引擎将机器人加载到安全的类加载器中。在robocode进程中,加载到机械手classLoader的类对其余的classLoader不可见。我猜您必须将流口水与机器人加载到相同的classLoader中(最简单的方法是在机器人上合并classPath的类,并添加流口水.class文件或合并jar)。我不确定流口水是否仍会在robocode的安全性限制下起作用,因此您可能需要关闭robocode的安全性。