我们目前正在评估optaplanner用于我们的切割机进度优化项目。
optaplanner在根据规则对项目列表进行排序方面的效率如何?
一点背景故事:
客户对我们的期望是,该工具应优化切割机的时间表,以便使用以下因素最大限度地减少切割机的停机时间:
我们使用chainedVariable和shadowVariable,HardMediumSoftScore以及Drools中的上述规则来实现模型。 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
也许规则没有以正确的方式表达,但我们很难理解为什么规则在与其他规则结合使用时无法正常工作。
如果我需要提供更多信息(我第一次在这里发帖),请告诉我。
提前感谢您的支持。
答案 0 :(得分:0)
要考虑一些想法:使规则3和4成为中等分数(切换到HardMediumSoftScore),因为规则5以“如果上面的所有内容相同”开头,所以它确实应该得到它自己的得分水平,即最低得分水平。
查看有关“公平约束”的文档部分。简单地惩罚每个任务,它的orderNumber和前一个任务的orderNumber之间的差异的平方可能已经做了你想要的。规则5的描述留下了一些解释空间(例如,两个1个订单号太晚,比一个5个订单号太晚了?)。