使用 Optaplanner 对列表中的项目进行排序
Using Optaplanner to sort items in a list
我们目前正在评估 optaplanner 以用于我们的切割机调度优化项目。
optaplanner 在根据规则对项目列表进行排序时效率如何?
一些背景故事:
客户对我们的期望是,该工具应该优化切割机的调度,从而使用以下因素最大限度地减少它们的停机时间:
- 优先级高的订单优先上机。 (硬分)
- 然后在临近到期日时下单。 (中分)
- 尽量减少计划中产品更换的发生,因为每次更换机器都需要停机 X 分钟以进行清洁工作。 (软分数)
- 尽量减少图案之间的刀位变化。操作员每次更改刀具位置都需要 5 分钟来进行设置。 (软分数)
- 如果以上都相同,则采用先进先出的方法,所以最早的项目应该先通过机器。 (软分数)
我们在 Drools 中使用 chainedVariable 和 shadowVariable、HardMediumSoftScore 和上述规则实现了模型。
Optaplanner 在前 4 条规则上做得很好,但在最后一条规则上表现不佳。
但是,当我注释掉所有其他规则时,optaplanner 就可以正常进行,我看到项目被正确排序了。
这是最后一条规则的流口水规则:
rule "sort by ItemNumber"
salience 10
when
$previousScore : Number() from accumulate(
TaskGroup(previous!=null, previous.name > name, productType == previous.productType),
sum(-1)
)
$nextScore : Number() from accumulate(
TaskGroup(nextTaskGroup!=null, nextTaskGroup.name < name, productType == nextTaskGroup.productType),
sum(-1)
)
then
scoreHolder.addSoftConstraintMatch(kcontext,$previousScore.intValue()+$nextScore.intValue());
end
也许规则没有以正确的方式表达,但我们很难理解为什么当与其他规则结合使用时规则不能正确地完成它的工作。
如果我需要提供更多信息,请告诉我(我第一次在这里发帖)。
在此先感谢您的支持。
需要考虑的一些想法:将规则 3 和 4 设为中等分数(切换到 HardMediumSoftScore),因为规则 5 以 "if everything of above is the same" 开头,所以它确实应该有自己的分数级别,最低的。
查看有关 "fairness constraints" 的文档部分。简单地为每个任务惩罚它的 orderNumber 和前一个任务的 orderNumber 之间的差异的平方可能已经做了你想要的。规则5的描述留下了一些解释空间(例如两次1个订单号来不及比一次5个订单号来不及更糟糕?)。
我们目前正在评估 optaplanner 以用于我们的切割机调度优化项目。
optaplanner 在根据规则对项目列表进行排序时效率如何?
一些背景故事:
客户对我们的期望是,该工具应该优化切割机的调度,从而使用以下因素最大限度地减少它们的停机时间:
- 优先级高的订单优先上机。 (硬分)
- 然后在临近到期日时下单。 (中分)
- 尽量减少计划中产品更换的发生,因为每次更换机器都需要停机 X 分钟以进行清洁工作。 (软分数)
- 尽量减少图案之间的刀位变化。操作员每次更改刀具位置都需要 5 分钟来进行设置。 (软分数)
- 如果以上都相同,则采用先进先出的方法,所以最早的项目应该先通过机器。 (软分数)
我们在 Drools 中使用 chainedVariable 和 shadowVariable、HardMediumSoftScore 和上述规则实现了模型。 Optaplanner 在前 4 条规则上做得很好,但在最后一条规则上表现不佳。 但是,当我注释掉所有其他规则时,optaplanner 就可以正常进行,我看到项目被正确排序了。
这是最后一条规则的流口水规则:
rule "sort by ItemNumber"
salience 10
when
$previousScore : Number() from accumulate(
TaskGroup(previous!=null, previous.name > name, productType == previous.productType),
sum(-1)
)
$nextScore : Number() from accumulate(
TaskGroup(nextTaskGroup!=null, nextTaskGroup.name < name, productType == nextTaskGroup.productType),
sum(-1)
)
then
scoreHolder.addSoftConstraintMatch(kcontext,$previousScore.intValue()+$nextScore.intValue());
end
也许规则没有以正确的方式表达,但我们很难理解为什么当与其他规则结合使用时规则不能正确地完成它的工作。
如果我需要提供更多信息,请告诉我(我第一次在这里发帖)。
在此先感谢您的支持。
需要考虑的一些想法:将规则 3 和 4 设为中等分数(切换到 HardMediumSoftScore),因为规则 5 以 "if everything of above is the same" 开头,所以它确实应该有自己的分数级别,最低的。
查看有关 "fairness constraints" 的文档部分。简单地为每个任务惩罚它的 orderNumber 和前一个任务的 orderNumber 之间的差异的平方可能已经做了你想要的。规则5的描述留下了一些解释空间(例如两次1个订单号来不及比一次5个订单号来不及更糟糕?)。