具有Drools专家的Robocode机器人

时间:2011-07-12 12:32:41

标签: java drools robocode

我有一个类任务,使用Drools作为推理机器创建一个Robot。然而,我的大多数规则都很奇怪,因为他们不会为了课而开火,而是为了它的超类而开火。像这样:

我的规则:

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 个答案:

答案 0 :(得分:1)

Robocode引擎将机器人加载到安全的类加载器中。加载到机器人classLoader中的类对于robocode进程中的其他classLoader是不可见的。我猜你必须将drools加载到与机器人相同的classLoader中(最简单的方法是在机器人上合并classPath类并添加drools .class文件或合并jar)。我不确定drools是否仍会在robocode的安全限制下工作,因此您可能需要关闭robocode安全性。