Optaplanner约束验证器



我正在使用constraintverifier来验证约束,但第一个约束总是返回0,其他约束都可以。

@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分在此处输入图像描述

public Constraint requiredNumberOfBuckets(ConstraintFactory constraintFactory) {
return constraintFactory.forEach(TrolleyStep.class)
.penalizeLong(" Required number of buckets ",
HardSoftLongScore.ONE_SOFT,
trolleyStep -> 10);
}

正如Lukas所评论的,所有具有任何空计划变量的实体都不会使用forEach()进行选择。即使在过度约束规划的情况下(nullable=true(,这也能很自然地工作。但是,如果实体上有多个规划变量,就像你的情况一样,我理解这可能感觉不那么自然。不幸的是,我们无法检测您的约束被写入到哪个(子集(规划变量,因此我们无法智能筛选forEach()上的实体。

解决方案

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

public Constraint requiredNumberOfBuckets(ConstraintFactory constraintFactory) {
return constraintFactory.forEachIncludingNullVars(TrolleyStep.class)
...;
}

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

最新更新