使用多个规划实体进行drools评分

使用多个规划实体进行drools评分,drools,optaplanner,Drools,Optaplanner,我正在尝试为OptaPlanner开发Drools分数,以最大限度地创建类似的成对运输运行 规划实体是其中的500个: 鲁尼德 电流指示器-包含AM或PM 位置 计划变量包含成对运行的可能性-其中12000个: runID1 地点1 runID2 地点2 安培表 更高的排名分数用于最大化使用runID的成对运行,该规则运行良好,因为它解析为特定的runID 我需要制定一个较低的排名规则,最大化AM和PM中成对位置的平衡数量。因此,在AM中配对的两个位置应在PM中的相同位置配对 // At

我正在尝试为OptaPlanner开发Drools分数,以最大限度地创建类似的成对运输运行

规划实体是其中的500个:

  • 鲁尼德
  • 电流指示器-包含AM或PM
  • 位置
计划变量包含成对运行的可能性-其中12000个:

  • runID1
  • 地点1
  • runID2
  • 地点2
  • 安培表
更高的排名分数用于最大化使用runID的成对运行,该规则运行良好,因为它解析为特定的runID

我需要制定一个较低的排名规则,最大化AM和PM中成对位置的平衡数量。因此,在AM中配对的两个位置应在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);
如何配置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);
在6.1文档中,查找“公平性/负载平衡分数约束”。我也这么想


因为成对运行是一种软约束(显然),所以我不会更改您的模型。(如果它们是硬约束,人们可以提出一个模型,使一个规划实体具有2个以前的静态规划变量,但即使这样,我也不推荐。)

我在上面的原始问题中添加了一个说明和示例代码。叹气。请参阅我答案的第一句:文档=澄清,视频=optplanner示例中的示例名称。谢谢。我想我现在明白了,我会尝试这个解决方案。我花了一段时间才这样想。非常感谢您的耐心。