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