0

我正在使用 OptaPlanner 计算一组需要在一天内处理的任务的班次(即开始时间、结束时间和必要的资格)。

我使用了一个drools score director,并设置了一些规则来将任务分配给轮班,同时保持如下约束:

  • 永远不要将重叠的任务分配给同一个班次
  • 永远不要将两个任务分配给同一个班次,因为这会导致违反最大班次长度
  • 当没有一组可能的资格与两项任务的必要资格相匹配时,永远不要在同一班次上安排两项任务等。

到目前为止,我得到了相当不错的结果。但是,还剩下一项优化。应该可以有不同长度的轮班(例如 8 小时、6 小时和 4 小时轮班),并且有一个可以认为轮班有效的阈值(例如,如果任务涵盖了 60% 的时间)。因此,与长期无效率的轮班相比,进行更多、更短但富有成效的轮班会更好。

我很难将类似的东西定义为规则。在我看来,问题在于这是一种转变的属性。然而,这种转变是我的计划事实,因此在计算过程中不能改变它的状态。

你知道我该如何解决这个问题吗?

在此先感谢, 问候, Hendrik

4

1 回答 1

1

假设TaskShift是问题事实,并且TaskAssignment是由 a 定义的计划实体,task并且具有计划变量shift

when
  $s: Shift($t : treshold)
  $totalTime : Number(intValue < $t) from accumulate (TaskAssignment(shift == $s, $t : time) sum($t))
then
  add($t - $totalTime)
end
于 2013-10-17T11:39:31.140 回答