【问题标题】:Robocode Robot with Drools Expert带有 Drools Expert 的 Robocode 机器人
【发布时间】:2011-08-03 00:03:02
【问题描述】:

我有一个班级作业是使用 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();

【问题讨论】:

  • 它可能是由同一件事引起的。当我使用 Query 从 Drools 检索某些内容并尝试将其转换为 java 中的正确类时,它给了我(类加载器如何工作?drools 和 robocode 可以使用不同的类加载器吗?):异常:java.lang.ClassCastException:drools_robocode。动作不能转换为 drools_robocode.Action
  • 能否请您包含显示您如何创建知识库和会话的代码。因为我使用您描述的基本类和规则一和三按预期触发了您的 DRL。
  • 你好 Perception,在某些机器上它可以工作。我们无法找出区别(相同的 drools、jdk、jre 和 robocode 版本号),除了工作的是 32 位和不工作的是 64 位。不确定是不是这样。

标签: java drools robocode


【解决方案1】:

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

【讨论】:

  • 另外我认为机器人应该将事实对象提交到drools,而不是机器人本身。
  • 抱歉,pavel,我没听懂你最后的评论。你的意思是一个对象应该将自己添加到事实中?
  • 我们需要禁用安全性,因为使用它的 robocode 应用程序不会加载外部文件(这意味着它无法加载规则)
  • 在上面的示例代码中,您让流口水直接接触机器人。我认为你应该通过一些 DTO
  • 好的,但这就像一个很好的实践或必须工作? :D 感谢您的帮助
猜你喜欢
  • 2011-07-03
  • 2011-12-15
  • 1970-01-01
  • 2010-11-24
  • 1970-01-01
  • 2013-06-23
  • 1970-01-01
  • 2016-02-02
  • 2010-10-12
相关资源
最近更新 更多