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

Sorting 使用Optaplanner对列表中的项目进行排序,sorting,schedule,optaplanner,Sorting,Schedule,Optaplanner,我们目前正在评估optaplanner,以用于我们的切割机计划优化项目 optaplanner根据规则对项目列表进行排序的效率如何 一点背景故事: 客户对我们的期望是,刀具应优化切割机的时间表,以便使用以下因素将其停机时间降至最低: 具有高优先级的订单应首先经过机器。(硬分数) 然后在到期日附近下单。(中分) 尽量减少计划中的产品变更,因为每次变更机器都需要停机X分钟进行清洁工作。(软评分) 尽量减少图案之间的刀位变化。操作员每次更改刀位都需要5分钟的时间进行设置。(软评分) 如果以上所有内容都

我们目前正在评估optaplanner,以用于我们的切割机计划优化项目

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

一点背景故事:

客户对我们的期望是,刀具应优化切割机的时间表,以便使用以下因素将其停机时间降至最低:

  • 具有高优先级的订单应首先经过机器。(硬分数)
  • 然后在到期日附近下单。(中分)
  • 尽量减少计划中的产品变更,因为每次变更机器都需要停机X分钟进行清洁工作。(软评分)
  • 尽量减少图案之间的刀位变化。操作员每次更改刀位都需要5分钟的时间进行设置。(软评分)
  • 如果以上所有内容都相同,则应用FIFO方法,因此最旧的项目应首先检查机器。(软评分)
  • 我们使用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
    
    规则“按项目编号排序”
    显著性10
    什么时候
    $previousScore:累积中的编号()(
    任务组(previous!=null,previous.name>name,productType==previous.productType),
    总和(-1)
    )
    $nextScore:累积中的编号()(
    任务组(nextTaskGroup!=null,nextTaskGroup.name
    也许规则没有以正确的方式表达,但我们很难理解为什么规则在与其他规则结合使用时不能正确发挥作用

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


    提前感谢您的支持。

    一些想法需要考虑:将规则3和4设为中等分数(切换为硬-中-软分数),因为规则5以“如果以上所有内容都相同”开头,因此它确实值得自己的分数级别,最低的一级


    请看文档中关于“公平约束”的部分。只需对每个任务惩罚其orderNumber与上一个任务的orderNumber之间的差值平方,就可能已经达到了您想要的效果。规则5的描述留下了一些解释的空间(例如,两次1订单号太迟比一次5订单号太迟更糟糕?。

    因为规则5是一个软权重,如果没有完全遵守所有规则的解决方案(实践中从未有过),它将与规则3和4竞争。我不明白规则是如何实现的“按项目编号排序“实现了规则5中你想要的。谢谢杰弗里的快速回答。在阅读了你的答案和评论之后,把规则5放在它自己的部分是有意义的,你是对的,为它表达的口水规则真的没有任何意义,因为我们没有包括itemNumber之间的差异。这真的帮了我们很多;-)