Робот Robocode с Drools Expert

У меня есть задание на создание робота с использованием 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() Роботоникку, который вызывается симулятором Robocode, я вставляю экземпляр как факт:

ksession.insert(this)

я ожидаю, что правила 1 и 3 должны сработать, но правила 2 и 3 сработают. Почему он распознает экземпляр как TeamRobot, а не как Robotonicku?

заранее спасибо.

код загрузки:

    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();

person Túlio Caraciolo    schedule 12.07.2011    source источник
comment
это может быть вызвано тем же самым. Когда я извлекаю что-то из Drools с помощью запроса и пытаюсь привести его к нужному классу в java, он дает мне (как работает загрузчик классов? Могут ли drools и robocode использовать разные загрузчики классов?): Exception: java.lang.ClassCastException: drools_robocode. Действие не может быть передано drools_robocode.Action   -  person Túlio Caraciolo    schedule 12.07.2011
comment
Не могли бы вы включить код, показывающий, как вы создаете базу знаний и сеанс. Потому что я попробовал ваш DRL с базовыми классами, которые вы описали, и правила один и три срабатывают, как и ожидалось.   -  person Perception    schedule 14.07.2011
comment
Привет Восприятие, на некоторых машинах это работает. Мы не смогли понять разницу (те же самые слюни, номера версий jdk, jre и robocode), за исключением того, что те, которые работают, являются 32-битными, а те, которые не работают, — 64-битными. не уверен, что это так.   -  person Túlio Caraciolo    schedule 02.08.2011


Ответы (1)


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

person Pavel Savara    schedule 14.07.2011
comment
Также я считаю, что робот должен подавать в слюни объекты-факты, а не сам робот. - person Pavel Savara; 14.07.2011
comment
Извини, Павел, я не понял твой последний комментарий. вы имеете в виду, что объект должен добавлять себя к фактам? - person Túlio Caraciolo; 02.08.2011
comment
нам нужно отключить безопасность, так как с ней приложение robocode не загружает внешние файлы (а значит не может загрузить правила) - person Túlio Caraciolo; 02.08.2011
comment
В приведенном выше примере кода вы позволяете слюням напрямую касаться робота. Я думаю, вам лучше передать какой-нибудь DTO - person Pavel Savara; 04.08.2011
comment
хорошо, но это как хорошая практика или обязательно работать? :D спасибо за помощь кстати - person Túlio Caraciolo; 07.08.2011