当前位置: 首页 > 知识库问答 >
问题:

基于时间粒的间断配送调度问题

长孙硕
2023-03-14

我有以下时间安排优化问题:

有n个Rest时间要安排。一次Rest占用每个15分钟的k时间颗粒。我看到的总视界是m个时间颗粒。每次谷物都有一个需要优化的中断量。开始中断的范围是每个中断定义的,您不能自由选择范围。

break.scala:

case class Break(vehicleId: String, durationInGrains: Int)

Timegrain.scala:

@PlanningEntity
case class TimeGrain(desiredBreaks: Int,
                     instant: Instant,
                     @CustomShadowVariable(...), // Dummy annotation, I want to use the entity in constraint stream 
                     var breaks: Set[Break])

中断分配:

@PlanningEntity
case class BreakAssignment(
  break: Break,
  @PlanningVariable(valueRangeProviderRefs = Array("timeGrainRange"))
  var startingTimeGrain: TimeGrain,
  @ValueRangeProvider(id = "timeGrainRange")
  @ProblemFactCollectionProperty @field
  timeGrainRange: java.util.List[TimeGrain],
  @CustomShadowVariable(
    variableListenerClass = classOf[StartingTimeGrainVariableListener],
    sources = Array(new PlanningVariableReference(variableName = "startingTimeGrain"))
  )
  var timeGrains: util.Set[TimeGrain]
)

object BreakAssignment {
  class StartingTimeGrainVariableListener extends VariableListener[Solution, BreakAssignment] {
    override def afterVariableChanged(scoreDirector: ScoreDirector[Solution], entity: BreakAssignment): Unit = {
      val end = entity.startingTimeGrain.instant
        .plusSeconds((entity.break.durationInGrains * TimeGrain.grainLength).toSeconds)
      scoreDirector.getWorkingSolution.timeGrains.asScala
        .filter(
          timeGrain =>
            timeGrain.instant == entity.startingTimeGrain.instant ||
            entity.startingTimeGrain.instant.isBefore(timeGrain.instant) && end
              .isAfter(timeGrain.instant)
        )
        .foreach { timeGrain =>
          scoreDirector.beforeVariableChanged(timeGrain, "breaks")
          timeGrain.breaks = timeGrain.breaks + entity.break
          scoreDirector.afterVariableChanged(timeGrain, "breaks")
        }
    }
  }
}
private def constraint(constraintFactory: ConstraintFactory) =
  constraintFactory
    .from(classOf[TimeGrain])
    .filter(timeGrain => timeGrain.breaks.nonEmpty)
    .penalize(
      "Constraint",
      HardSoftScore.ONE_SOFT,
      (timeGrain: TimeGrain) => {
        math.abs(timeGrain.desiredBreaks - timeGrain.breaks.size)
      }
    )

我在想出正确的模型的时候,是不是走错了方向?

共有1个答案

黄沈浪
2023-03-14

如果我正确理解您的意思,那么从概念上讲,在TimeGrain类中,我将保留一个(自定义)shadow变量(仅)保留与该TimeGrain(实例)重叠的Break实例的计数。为了简单起见,我叫它breakCount。让我称x为一个中断所跨越的时间颗粒数。

因此,当求解器将一个Break实例分配给一个TimeGrain实例时,我将增加该TimeGrain实例的Break Count。不仅要计算THát TimeGrain实例的breakCount,还要计算接下来几个(x-1)个TimeGrain实例的breakCount。请注意将这些增量中的每一个都包装在“ScoreDirector.BeforeVariableChanged()”-“ScoreDirector.AfterVariableChanged()”括号中。

剩下的就用分数计算了。但请注意,我自己还会将时间颗粒的理想中断计数和它的“真实”中断计数(即阴影变量)的差平方,就像OptaPlanner的文档中解释的那样,以加强更多的“公平性”。

编辑:当然,在从时间颗粒实例中删除中断实例时,也会减少时间颗粒的中断计数...

 类似资料:
  • 相同优先级线程按照时间片轮番调度 相同优先级线程按照时间片轮番调度 源码/* * Copyright (c) 2006-2018, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes * 2018-08-24 yangjie the first

  • 我遇到了单词中断问题,它是这样的: 给定一个输入字符串和一个字典,如果可能,将输入字符串分割成一个空间分隔的字典单词序列。 然而,在Quora中,一个用户发布了一个线性时间解决方案 我不知道它怎么会是线性的。他们在时间复杂度计算上有什么错误吗?这个问题的最佳可能最坏情况时间复杂度是多少。我在这里发布了最常见的DP解决方案

  • 所有人, 有没有一种方法,我可以使用spring调度器,改变基于一天的时间的固定费率? 对于例如:一个方法应该在10-12AM以1000ms的速率运行,然后在12AM之后切换到5000ms 还是必须用不同的cron创建多个方法?

  • 我正在与石英时间表和一切工作完美根据要求。但有一件事我想实现,即我希望我的下一个作业执行将触发(currentFinishTime+intervalOfScheduler) 间隔为30秒的作业执行示例: 请帮助我解决我的问题。

  • 我偶然发现了这个不错的教程https://github.com/manashmndl/DeadSimpleSpeechRecognizer其中数据是基于由文件夹分隔的样本进行训练的,所有mfcc都是一次计算的。 我正试图以不同的方式实现类似的目标。 基于此:https://librosa.github.io/librosa/generated/librosa.feature.mfcc.html l

  • 在SJF算法中,我们使用公式来预测下一个CPU突发时间: 然后我们选择预测突发时间最短的进程。现在我的问题是:我们已经知道进程到达的CPU突发时间了吗?如果是,那么为什么要预测CPU突发时间呢?我们可以只使用最短时间的进程来调度。如果不是,即,我们对进程的突发时间没有任何想法,预测的突发时间(n 1)如何帮助我们选择进程?希望我能解释我的困惑。谢谢。