带Drools Expert的java Robocode机器人
我有一个类作业,用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();
# 1 楼答案
机器人代码引擎将机器人加载到安全类加载器中。加载到robot类加载器中的类对于robocode进程中的其他类加载器不可见。我猜您必须将drools加载到与robot相同的类加载器中(最简单的方法是将robot上的类合并到类路径中,并添加drools.class文件或合并JAR)。我不确定drools在robocode的安全限制下是否还能工作,所以您可能需要关闭robocode安全