我试图为OptaPlanner开发Drools得分,以最大限度地创建类似的配对运输。
规划实体是一个运行 - 其中500个:
计划变量包含成对的运行可能性 - 其中12,000个:
更高的排名分数用于使用runID最大化配对运行,并且该规则正常工作,因为它解析为特定的runID。
我需要开发一个排名较低的规则,以最大化AM和PM中平衡数量的配对位置。因此,在AM中配对的两个位置应在PM中的相同位置配对。
如何配置Drools得分来实现这一目标?似乎需要累计分配给两个计划实体的AM计划变量的计数,然后与具有与AM计划实体相同位置的类似PM计划变量的计数进行比较。
或者有更好的方法对此进行建模吗?
非常感谢任何帮助。
我认为我的问题更多的是DRL语言功能之一以及如何执行聚合。 这是我写的规则,但它只能确保PM中只存在一对。
// Attempts to make certain that a morning pairing at a Location level exists in the morning and afternoon
// This rule should attempt to count Location pairs in AM and PM rule
"matchedLocationsAmToPm"
when
Run(amPm == "AM" && earlyLate == "EARLY", $amPair : pair, $earlyLocationId : LocationId)
Run(amPm == "AM" && earlyLate == "LATE" && pair == $amPair, $lateLocationId : LocationId)
Run(amPm == "PM" && earlyLate == "EARLY" && LocationId == $earlyLocationId, $pmPair : pair)
not Run(amPm == "PM" && earlyLate == "LATE" && LocationId == $lateLocationId && pair == $pmPair)
then
scoreHolder.addSoftConstraintMatch(kcontext, -1000);
答案 0 :(得分:0)
在6.1文档中,查找“公平/负载计分约束”。同样如此see this video。
因为配对运行是一个软约束(显然),我不会改变你的模型。 (如果它们是严格的约束,那么可以争论一个模型来使规划实体有2个previousStandstill
计划变量,但即便如此,我也可能不推荐它。)