使用Optaplanner对列表中的项目进行排序

时间:2015-04-02 11:38:35

标签: sorting schedule optaplanner

我们目前正在评估optaplanner用于我们的切割机进度优化项目。

optaplanner在根据规则对项目列表进行排序方面的效率如何?

一点背景故事:

客户对我们的期望是,该工具应优化切割机的时间表,以便使用以下因素最大限度地减少切割机的停机时间:

  1. 优先级高的订单应首先通过机器。 (硬分数)
  2. 然后在截止日期前订购。 (中等分数)
  3. 最小化计划中的产品更改发生,因为每次更改机器需要停机X分钟以进行清洁工作。 (软分数)
  4. 最小化图案之间的刀位置变化。每个刀具位置变化将需要5分钟,以便操作员进行设置。 (软分数)
  5. 如果上述所有内容相同,则应用FIFO方法,因此最旧的项目应首先通过机器。 (软分数)
  6. 我们使用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
    

    也许规则没有以正确的方式表达,但我们很难理解为什么规则在与其他规则结合使用时无法正常工作。

    如果我需要提供更多信息(我第一次在这里发帖),请告诉我。

    提前感谢您的支持。

1 个答案:

答案 0 :(得分:0)

要考虑一些想法:使规则3和4成为中等分数(切换到HardMediumSoftScore),因为规则5以“如果上面的所有内容相同”开头,所以它确实应该得到它自己的得分水平,即最低得分水平。

查看有关“公平约束”的文档部分。简单地惩罚每个任务,它的orderNumber和前一个任务的orderNumber之间的差异的平方可能已经做了你想要的。规则5的描述留下了一些解释空间(例如,两个1个订单号太晚,比一个5个订单号太晚了?)。