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

严重超约束调度策略

索锐藻
2023-03-14

试图将1000个观测(目前持续时间相同)安排在500个时隙中,因此只有一半适合。使用规划实体“观察”和可空的规划变量“timeslot”。表示为ConstraintStream的约束

    null

调查结果

  1. 将501个观察值调度到500个时隙中,在16s后以0hard/-1medium终止。这是意料之中的。
  2. 调度1000个观测到500个时隙在10m后终止,-499hard/-1medium。这完全出乎意料。我预计0hard/-500medium,或者至少是朝着那个方向的。

要使optaplanner做正确的事情,有哪些必要的措施?

    Constraint notSameSlot(ConstraintFactory constraintFactory) {
        constraintFactory.fromUniquePair(OB.class)
            .filter({ ob1, ob2 -> ob1.start == ob2.start })
            .penalize("overlap", HardMediumSoftScore.ONE_HARD)
    }

    Constraint notAssignable(ConstraintFactory constraintFactory) {
        constraintFactory.fromUnfiltered(OB.class)
            .filter(ob -> ob.start == null)
            .penalize("not assignable", HardMediumSoftScore.ONE_MEDIUM)
    }
@PlanningEntity
public class OB {
    @PlanningVariable(nullable = true, valueRangeProviderRefs = "timeslotRange")
    Timeslot start
    @PlanningId
    int obId
    OB(int obId) {this.obId = obId }
    OB() {} // required by Optaplanner, not sure why
}
class Timeslot {
    @PlanningId
    int slot

    Timeslot(int slot) {
        this.slot = slot
    }
}

规划解决方案

@PlanningSolution
class Schedule {
    @ValueRangeProvider(id = "timeslotRange")
    @ProblemFactCollectionProperty 
    List<Timeslot> timeslots

    @PlanningEntityCollectionProperty
    List<OB> observations

    @PlanningScore
    HardMediumSoftScore score
}

更新:在NotSameslot约束中添加了空检查,我不知道FromUniquePairs传递了未分配的实体。这会改变结果,但不会变得更好。现在,根本没有分配插槽。现在的结果是0hard/-1000medium/0soft

Constraint notSameSlot(ConstraintFactory constraintFactory) {
     constraintFactory.fromUniquePair(OB.class)
            .filter({ ob1, ob2 ->
                ob1.start !== null &&
                ob2.start !== null &&
                ob1.start.slot == ob2.start.slot
            })
            .penalize("overlap", HardMediumSoftScore.ONE_HARD)
    }

共有1个答案

空浩淼
2023-03-14

发现问题了。我有

<termination>
    <unimprovedSpentLimit>PT2M30S</unimprovedSpentLimit>
    <bestScoreFeasible>true</bestScoreFeasible>
</termination>

作为终止标准。我不明白BestScoreComposable意味着一旦没有违反硬约束,求解器就会终止,这导致没有分配插槽,因为这仍然被认为是一个可行的解决方案。删除第二个标准解决了这个问题。

 类似资料:
  • 调度策略即设置在满足指定条件时,将会根据偏好选择或排除在绑定某一类调度标签的宿主机创建虚拟机。 调度策略即设置在满足指定条件时,将会根据偏好选择或排除在绑定某一类调度标签的宿主机创建虚拟机。调度策略中的偏好将会覆盖调度标签中的默认偏好。调度策略将会影响最后的调度结果。 调度策略中偏好分为以下四种: 尽量使用(prefer):调度时优先使用拥有这种调度标签的宿主机。如没有带这种调度标签的宿主机、也可

  • 问题内容: 我有一个这样的表: 我想禁止给定的重叠间隔 编辑:我发现了一些东西: 如果您想了解更多有关此信息,请访问http://www.depesz.com/2010/01/03/waiting-for-8-5-exclusion- constraints/ 我唯一的问题是,它不能将空值用作结束时间戳记,我曾想将其替换为无限值,但效果不佳。 问题答案: 好吧,我最终这样做了: 与无限,交易证明完

  • 本文向大家介绍BUG严重程度有哪些?相关面试题,主要包含被问及BUG严重程度有哪些?时的应答技巧和注意事项,需要的朋友参考一下 致命 严重 一般 轻微 建议

  • 我在布局中有一个UIView,以便进行一些剪切和分组,但是自动布局会在收缩时调整其大小。我想给它一个固定的高度,但唯一的选择是设置顶部和底部空间。 有没有办法设置明确的高度约束?

  • 我有与K8s集成的集群自动缩放器,工作节点从0缩放。我希望每个节点不调度超过2个豆荚。我在库贝莱特等级上设置了吊舱限制。当我用4个吊舱并行运行5个作业时,它限制扩展3个节点,但它试图只在2个节点和一个吊舱上调度,以减少到期限制。在K8S中是否有调度限制参数?只在特定时间(一些睡眠参数)后安排豆荚?当所有工人都准备好时,我们需要等待

  • 进程是操作系统虚拟出来的概念,用来组织计算机中的任务。但随着进程被赋予越来越多的任务,进程好像有了真实的生命,它从诞生就随着CPU时间执行,直到最终消失。不过,进程的生命都得到了操作系统内核的关照。就好像疲于照顾几个孩子的母亲内核必须做出决定,如何在进程间分配有限的计算资源,最终让用户获得最佳的使用体验。内核中安排进程执行的模块称为调度器(scheduler)。这里将介绍调度器的工作方式。 进程状