2011-07-07 78 views
1

我有形式Drools的規劃師規則只觸發一次

rule "notBar" 
    when 
     $foo : Foo(bar == false) 
    then 
     insertLogical(new IntConstraintOccurrence("notBar", ConstraintType.NEGATIVE_SOFT, 
       $foo)); 
end 

我希望看到這個觸發一次,每美孚與酒吧是假的,不過規則僅觸發一次的規則。令人困惑的是,如果我將$foo : Foo(bar == false)更改爲$foo : Foo(),那麼對於所有Foo而言,它都是正確的。 我錯過了什麼?

+0

你確定有幾個Foo的假酒吧?我沒有看到這個規則的任何問題。 – fnst

回答

1

Bah。我是個白癡。我的cloneSolution方法調用了一個複製構造函數,它沒有正確複製欄。

+0

如果'foo'是一個計劃實體(=在計劃過程中發生了變化,例如RoomAssignment),它應該被深度克隆,但是如果'bar'只是一個計劃事實(=在計劃過程中不會改變,例如一個房間)不需要克隆它,你可以複製參考。雖然在這種情況下bar是一個布爾值,所以這只是該值的一個副本。 請參閱任何Drools Planner示例。順便說一句,你正在解決什麼樣的計劃問題? –

+0

@Geoffrey De Smet foo確實發生了變化,但我並沒有想到我只能複製事實的參考,認爲有一些代碼可以解決這個問題。只是一個小禮包包裝計劃,以幫助我學習Drools(特別策劃)。 – Jim