1

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)

ルール 1 と 3 が実行されるはずですが、ルール 2 と 3 が実行されます。インスタンスがロボトニックではなくチームロボットとして認識されるのはなぜですか?

前もって感謝します。

コードの読み込み:

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

1 に答える 1

1

Robocodeエンジンは、ロボットを安全なクラスローダーにロードします。ロボットclassLoaderにロードされたクラスは、robocodeプロセスの残りのclassLoaderには表示されません。droolsをロボットと同じclassLoaderにロードする必要があると思います(最も簡単な方法は、ロボットのクラスをclassPathにマージし、drools .classファイルを追加するかjarファイルをマージすることです)。droolsがrobocodeのセキュリティ制限の下で引き続き機能するかどうかはわかりません。そのため、robocodeのセキュリティをオフにする必要がある場合があります。

于 2011-07-14T13:43:42.847 に答える