2017-04-19 24 views
0

我有一個優化問題,我試圖用optaplanner解決。解決方案算法使用一組規則。引擎使用捕獲每個規則權重的對象。規則的最終得分是規則的中間分數乘以權重。分數設置在每條規則的右側。每個規則的左側評估其權重是否不爲零,然後才執行右側。將規則的權重設置爲零是停用規則的機制。我已經運行了一些檢查,它的工作原理。取消optaplanner規則

此機制的替代方法是從optaplanner求解器配置文件中將其徹底刪除,從而永久性地「停用」規則。

我認爲將權重設置爲零並刪除規則會導致相同的結果,但這不是事實。從配置文件中刪除規則產生比將權重設置爲零的更好的解決方案。

這是爲什麼? 如何在運行時停用規則?

下面是一個規則myrule.drl的例子:

rule "myrule" 
    when 
     MyWeights($weight: myRuleWeight != 0) 
    then 
     scoreHolder.addHardConstraintMatch(context, $weight) 
end 

這裏求解器配置:

<solver> 
    <scoreDirectorFactory> 
     <scoreDrl>myrule.drl</scoreDrl> 
    </scoreDirectorFactory> 
</solver> 

從求解器配置註釋掉myrule.drl給出比設定重量更好的解決方案歸零。

ANSWER

的secondsSpentLimit在配置XML不夠大,使得具有重量優化設置爲0,已經做了給定的時間內只有111本地搜索(LS)的步驟和優化無規則完成了301 LS步驟。增加secondsSpentLimit解決了問題

回答

1

這是不可能的如果他們都運行相同數量的步驟。 打開DEBUG登錄org.optaplanner查看他們跑步的步數以及他們的得分速度。

在任何步驟中,兩次運行必須具有完全相同的分數和完全相同的最佳分數。如果沒有,你有一個錯誤,尋找重現在文檔中的潛在原因。

+0

我已更新我的問題並將答案放在那裏,但步驟分數不相同。優化運行10分鐘,零權重運行120k LS步驟,沒有規則122k LS步驟。我猜這是有道理的,因爲優化會因時間限制而中止,而不是因爲他們找到了最佳解決方案 – JCvanDamme

+0

步驟119k中的步驟是否具有相同的分數? –

+1

是的,步驟119k的分數相同 – JCvanDamme