2014-06-09 55 views
0

嗨,我剛開始使用OptaPlanner與drools結合使用。不過,我有兩個問題。我相信這取決於我對語法的理解。OptaPlanner Drools執行錯誤

以下規則在嘗試實例化求解器時發生錯誤。

//Soft constraints 
rule "waistedArea" 
    when 
     $sheet : Sheet($area: (area * 10000)) 
     $usedAreaTotal : Number (intValue > 0 && intValue < $area) from accumulate(
      Part(
        sheet == $sheet, 
        $usedArea : requiredArea * 10000 
       ), 
      sum($usedArea) 
     ) 
     $waste : ($area - $usedAreaTotal) 
     eval($waste > 0) 
    then 
     insertLogical(new IntConstraintOccurrence("waistedArea", constraintType.NEGATIVE_SOFT, $waste,$sheet) 
    end 

乘以10000是一個從double值到int的臨時轉換,注意到這個語法。

該規則旨在計算具有多個組件分配給它的工作表的腰圍值。

規則拋出以下錯誤。

Message [id=1, level=ERROR, path=optaplanner-kie-namespace//Resources/DRLRools 
/NestingRules.drl, line=71, column=0 
    text=[ERR 102] Line 71:24 mismatched input '-' in rule "waistedArea"] 
Message [id=2, level=ERROR, path=optaplanner-kie-namespace//Resources/DRLRools 
/NestingRules.drl, line=0, column=0 
    text=Parser returned a null Package] 

任何探測都會有幫助。

回答

1

你可以不寫這個,因爲它不是一個「條件元素」:

$waste : ($area - $usedAreaTotal) 

這足以:

eval($area > $usedAreaTotal) 

我看不出有什麼好的理由由10000乘以 - 最後,你比較兩個值,乘以10000不會改變關係。 Number也有doubleValue()

和:這就是所謂的浪費 - 是你的皮帶:-)

+0

謝謝您的意見,我已經發現了EVAL選項。我目前有其他規則(以及我的拼寫:))的困難。請你能提供一個簡單的演員例子,因爲從我讀過的軟規則不能有效地使用實數。它是否正確? – Jon

+0

是的,漂浮/雙打[天生破碎](http://docs.jboss.org/drools/release/latest/optaplanner-docs/html_single/index.html#avoidFloatingPointNumbersInScoreCalculation)(但OptaPlanner仍支持它們)。如果你需要3個十進制數的精度,只需要使用一個長的多個浮點數/ 1000;如果你需要4個,則使用10000個,或者使用BigDecimal。 –

+0

@GeoffreyDeSmet但是,一個10的冪的乘法不會從浮點轉換爲整數。使用面積小的*積分*單位避免了這個問題,但是這必須在數據模型Sheet和Part中實現。 – laune