使用多个计划实体进行流氓评分

时间:2014-05-15 17:05:11

标签: drools optaplanner

我试图为OptaPlanner开发Drools得分,以最大限度地创建类似的配对运输。

规划实体是一个运行 - 其中500个:

  • 的runid
  • amPmIndicator - 包含AM或PM
  • 位置

计划变量包含成对的运行可能性 - 其中12,000个:

  • runID1
  • LOCATION1
  • runID2
  • LOCATION2
  • amPmIndicator

更高的排名分数用于使用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);

1 个答案:

答案 0 :(得分:0)

在6.1文档中,查找“公平/负载计分约束”。同样如此see this video

因为配对运行是一个软约束(显然),我不会改变你的模型。 (如果它们是严格的约束,那么可以争论一个模型来使规划实体有2个previousStandstill计划变量,但即便如此,我也可能不推荐它。)