我正在尝试为 OptaPlanner 开发 Drools 分数,以最大限度地创建类似的配对运输运行。
计划实体是一个运行 - 其中 500 个:
- 运行ID
- amPmIndicator - 包含 AM 或 PM
- 地点
计划变量包含成对的运行可能性 - 其中 12,000 个:
- 运行 ID1
- 位置1
- 运行ID2
- 位置2
- amPm指标
较高的排名分数用于最大化使用 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);