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

OptaPlanner自定义员工名册-约束提供程序中WeeklyHoursLimit的问题

潘衡
2023-03-14

我一直在遵循员工名册示例来创建自定义员工计划服务。我正在努力实施每周工作时间的限制。然而,我一直未能达到每个员工每周最多工作40小时的要求。我尝试复制OptaPlanner员工名册解决方案。这就是我想出来的,但是无论我尝试什么输入,解决方案都不会返回匹配项。

 Constraint weeklyHoursUpperLimit(ConstraintFactory constraintFactory) {
    return constraintFactory.from(Employee.class)
            .join(Schedule.class, equal(Function.identity(), Schedule::getEmployee))
            .groupBy((employee, schedule) -> employee,
                    ((employee, schedule) -> ZonedDateTime.parse(schedule.getTimeslot().getStart()).toLocalDate()
                            .with(TemporalAdjusters.previousOrSame(DayOfWeek.SUNDAY))),
                    sumDuration((employee, schedule) -> Duration.between(ZonedDateTime.parse(schedule.getTimeslot().getStart()),
                            ZonedDateTime.parse(schedule.getTimeslot().getEnd()))))
            .filter((practitioner, day, time) -> time.toHoursPart() > 40)
            .penalize("Practitioners cannot work more than 40 hours per week", HardMediumSoftScore.ONE_HARD);
{
    "employees": [
        {
            "id": "0458d419-da18-4d86-82de-31a2272f018a"
        }
    ],
    "timeslots": [
        {
            "start": "2021-05-24T00:00:00-04:00",
            "end": "2021-05-24T12:00:00-04:00",
            "slotId": 1
        },
        {
            "start": "2021-05-24T12:00:00-04:00",
            "end": "2021-05-25T00:00:00-04:00",
            "slotId": 7
        },
        {
            "start": "2021-05-25T12:00:00-04:00",
            "end": "2021-05-26T00:00:00-04:00",
            "slotId": 4
        },
        {
            "start": "2021-05-27T12:00:00-04:00",
            "end": "2021-05-28T00:00:00-04:00",
            "slotId": 5
        }
    ]
}

使用此输入,唯一可能的解决方案必须匹配此约束。其他约束会被检测和惩罚,所以我想知道为什么这一个永远不会返回任何匹配。

共有1个答案

亢胤运
2023-03-14

我怀疑问题出在过滤器上:.filter((pricitioner,day,time)->time.toHoursPart()>40)

Duration#toHoursPart()返回一天中总小时数除以小时数后的余数,该余数介于0和23之间。过滤器可能应该使用duration#tohours()。

 类似资料:
  • 我已经安装了openshift版本的员工花名册演示。我正在使用UI中的呼叫中心示例。在“点花名册”选项卡中,当我将某些点标记为未分配并单击“求解”按钮时,我看到Optaplanner开始优化,并看到软约束和硬约束的分数。即使在完成优化后,标记为未分配的内容仍然保持为未分配。我可以看到硬约束分数:0。为什么这些位置没有分配给可用的员工?

  • 我在项目中使用bean验证,我想为现有的约束注释编写一个自定义验证器。 例如,我有一个类,它表示一个名为CustomDateTime的日期/时间。在使用此类作为例如出生日期的类中,我想用过去的日期对字段进行注释: 然后,我通过实现ConstraintValidator创建一个自定义验证器 我知道您通常会创建这样的单独注释: 但对我来说,这似乎是双重代码;-) 如何注册要与一起使用的自定义验证器?

  • 我在DRL中实现了大量的加班规则,我想在Quarkus上使用Optaplanner开发的列表应用程序中重用这些规则。Quarkus指南展示了一个使用流式约束提供程序的示例。我认为将SolverFactory与Quarkus一起使用不是问题。我似乎不可能让它们一起工作。 如果他们不能,是否有某种方法可以从约束流定义中执行DRL加班规则?我想我可以插入员工并在流中有匹配时切换到drools会话,但这似

  • TLDR:我想要在单独的模块中单独的自定义bean验证定义及其ConstraintValidator实现。为此,我必须使用ConstraintMmap手动注册。它适用于带注释的类。但是定义的绑定不共享/可用于通过validation-constraints.xml.定义的验证如何修复?我试图调试它,以找出它在哪里初始化以及为什么会出现问题,但初始化这些远非易事。 动机: 一) 分离模块:如果API

  • 我将为我的网站创建自定义用户提供程序,对于用户来说,没有“用户名”和“密码”这样的概念(实际上有类似于密码的东西,但它的名称不同)。在文档中,用户实体必须实现来自安全包的UserInterface,该安全包具有诸如getUsername、getPassword之类的方法。我能用我自己的领域吗?或者我应该使用名称冲突(例如,getUsername将返回我的唯一字段)来实现我的行为吗?

  • 我正在尝试创建一个自定义的KeyClope提供程序,它将为登录逻辑添加一些内容。我已经读过如何为KeyClope创建提供者(或插件),我正在与之合作的项目中已经有一个提供者(或插件),但我对它们知之甚少。 我需要为用户身份验证/授权添加自定义逻辑:我希望能够检查内部数据库中的一些字段来验证人员帐户。但是我没有找到任何关于类似情况的指南或好文章。有人能给我提供一些关于从什么开始的链接吗?为了实现这样