从约束流中的多个类中提取信息

问题描述 投票:0回答:1

因此,我正在创建一个应用程序,用于安排助理进行预设的每周服务。我正在使用 Optaplanner 9.44.0.Final 来执行此操作。目前,我遇到了一些问题,造成了我的限制之一,想知道是否有人知道解决办法。

我有一份愿意在服务期间志愿服务的助理名单。我还有一份需要安排助理的服务列表。助理通过 ServiceAssignment 分配给服务,该服务跟踪该特定任务的服务、助理和助理的位置。我有很多限制条件,可以帮助决定人们被分配什么职位、何时分配以及所有这些爵士乐。不幸的是,似乎正在发生的情况是,只要没有任何限制,助理就会被一遍又一遍地安排,而不会从名单中删除新的助理。相反,我想对日程安排之外的每个助理进行软惩罚,希望这会稍微改变任务(不幸的是,我不能只是说,不要安排任何人超过 x 次,因为有时我们没有足够的志愿者)。

到目前为止,这是我编写的模拟约束:

private Constraint utilizedAssistantsConstraint(ConstraintFactory constraintFactory) {
            return constraintFactory.forEach(Assistant.class)
                    .filter(assistant -> constraintFactory.forEach(ServiceAssignment.class).map(ServiceAssignment::getAssistant).collect(Collector.toList()).contains(assistant))
                    .penalize(HardMediumSoftScore.ONE_SOFT)
                    .asConstraint("Utilized All Assistants Constraint");
        }

现在,这显然不起作用,因为 uni 约束流无法收集到这样的列表中,并且转换在约束提供程序中不起作用。基本上,我需要做的是这样的:

private Constraint utilizedAssistantsConstraint(ConstraintFactory constraintFactory) {
            return constraintFactory.forEach(Assistant.class)
                            .filter(assistant -> !isAssistantInServiceAssignments)
                    .penalize(HardMediumSoftScore.ONE_SOFT)
                    .asConstraint("Utilized All Assistants Constraint");
        }

其中

isAssistantInServiceAssignments
是伪代码,用于检查助手是否出现在 ServiceAssignment 的某处。我正在努力想出一种方法来访问应用程序生成的 ServiceAssignment 对象,因为我还需要 Assistant 类。

java constraints optaplanner
1个回答
0
投票

我认为你正在寻找条件传播

private Constraint utilizedAssistantsConstraint(ConstraintFactory constraintFactory) {
        return constraintFactory.forEach(Assistant.class)
                .ifNotExists(ServiceAssignment.class,
                        Joiners.equal(Functions.identity(), ServiceAssignment::getAssistant))
                .penalize(HardMediumSoftScore.ONE_SOFT)
                .asConstraint("Unused assistant");
    }
© www.soinside.com 2019 - 2024. All rights reserved.