有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

带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) 个答案

  1. # 1 楼答案

    机器人代码引擎将机器人加载到安全类加载器中。加载到robot类加载器中的类对于robocode进程中的其他类加载器不可见。我猜您必须将drools加载到与robot相同的类加载器中(最简单的方法是将robot上的类合并到类路径中,并添加drools.class文件或合并JAR)。我不确定drools在robocode的安全限制下是否还能工作,所以您可能需要关闭robocode安全