Робокод Робот с Drools Expert - PullRequest
1 голос
/ 12 июля 2011

У меня есть назначение класса для создания робота, использующего 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

внутри метода run () Robotonikku, который вызывается симулятором Robocode, я вставляю экземпляр как факт:

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 голос
/ 14 июля 2011

Двигатель Robocode загружает робота в защищенный загрузчик классов.Классы, загруженные в робота classLoader, не видны остальным classLoaders в процессе робокода.Я предполагаю, что вы должны загрузить drools в тот же classLoader, что и робот (самый простой способ - объединить классы на роботе с classPath и добавить файлы drools .class или объединить банки).Я не уверен, что слюни по-прежнему будут работать с ограничениями безопасности робокода, поэтому вам может потребоваться отключить безопасность робокода.

...