2011-07-12 55 views
1

我有一個課堂作業,創建一個機器人使用Drools作爲推理機器。然而,我的大部分規則表現奇怪,因爲他們不爲班級開火,而是因爲超級班而開火。事情是這樣的: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 

Robotonikku的run()方法是通過的Robocode的模擬器叫我插入的實例作爲事實中:

ksession.insert(this) 

我認爲規則一和三應該是火,但規則二和三是f紅外發光二極管。爲什麼它將實例識別爲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(); 
+0

它可能是由同樣的事情引起的。當我用Query從Drools中獲取某些東西並嘗試將它轉換爲java中的正確類時,它給了我(類加載器如何工作?可以流口水和robocode使用不同的類加載器嗎?):Exception:java.lang.ClassCastException:drools_robocode。無法將操作轉換爲drools_robocode.Action –

+0

您能否包含顯示您如何創建知識庫和會話的代碼?因爲我用你所描述的基本班級來嘗試你的DRL,並且按照預期來管理一,三次火災。 – Perception

+0

Hello Perception,在某些機器上工作。我們無法弄清楚它們的區別(相同的drools,jdk,jre和robocode版本號),只是那些工作的是32位而不是64位的。不確定情況如何。 –

回答

1

Robocode的發動機加載機器人成固定類加載器。加載到機械手classLoader中的類對於robocode進程中的類加載器的其餘部分不可見。我想你必須將drools加載到與機器人相同的類加載器(最簡單的方法是將機器人上的類加入classPath並添加drools .class文件或合併jar)。我不確定在robocode的安全限制下,drools仍然可以工作,因此您可能需要關閉robocode安全性。

+0

另外我認爲機器人應該將事實對象提交到流口水中,而不是機器人本身。 –

+0

對不起帕維爾,我不明白你最後的評論。你的意思是一個對象應該加入事實? –

+0

我們需要禁用安全性,因爲使用它時,robocode應用程序不會加載外部文件(這意味着它無法加載規則) –