首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Optaplanner ConstraintVerifier

Optaplanner ConstraintVerifier
EN

Stack Overflow用户
提问于 2022-08-05 09:43:26
回答 1查看 45关注 0票数 0

我使用约束验证器来验证约束,但是第一个约束总是返回0,而其他约束则没有问题。

代码语言:javascript
复制
@Test
public void requiredNumberOfBucketsTest() {
    Trolley trolley = new Trolley();
    trolley.setBucketCapacity(1000);
    trolley.setBucketNum(1);
    trolley.setTrolleyId(IdWorker.getIdStr());

    TrolleyStep trolleyStep = new TrolleyStep();
    trolleyStep.setId(IdWorker.getIdStr());
    trolleyStep.setProductVolume(20000000);
    trolleyStep.setOrderNumber("order-0");
    verifier.verifyThat(OrderPickingConstraintProvider::requiredNumberOfBuckets)
            .given(trolleyStep).penalizesBy(1);
}

无论我的约束是如何写的,我总是得到0分在这里输入图像描述

代码语言:javascript
复制
 public Constraint requiredNumberOfBuckets(ConstraintFactory constraintFactory) {
    return constraintFactory.forEach(TrolleyStep.class)
            .penalizeLong(" Required number of buckets ",
                    HardSoftLongScore.ONE_SOFT,
                    trolleyStep -> 10);
 }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-12 12:25:44

正如Lukas所评论的,所有具有空规划变量的实体都不是用forEach()选择的。即使在过度受限的规划(nullable=true)中,这也很自然地起作用。但是,如果实体上有多个规划变量,就像在您的例子中一样,我理解这可能不太自然。不幸的是,我们无法检测到您的约束写入了哪个(子集)规划变量,因此我们无法智能地过滤forEach()上的实体。

解决方案

( A)使用forEachIncludingNullVars()而不是forEach()重写约束以包含空vars

代码语言:javascript
复制
 public Constraint requiredNumberOfBuckets(ConstraintFactory constraintFactory) {
    return constraintFactory.forEachIncludingNullVars(TrolleyStep.class)
            ...;
 }

( B)或者,不要使用nullable=true变量并初始化单元测试中的所有计划变量。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73247752

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档