我使用约束验证器来验证约束,但是第一个约束总是返回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);
}发布于 2022-08-12 12:25:44
正如Lukas所评论的,所有具有空规划变量的实体都不是用forEach()选择的。即使在过度受限的规划(nullable=true)中,这也很自然地起作用。但是,如果实体上有多个规划变量,就像在您的例子中一样,我理解这可能不太自然。不幸的是,我们无法检测到您的约束写入了哪个(子集)规划变量,因此我们无法智能地过滤forEach()上的实体。
解决方案
( A)使用forEachIncludingNullVars()而不是forEach()重写约束以包含空vars
public Constraint requiredNumberOfBuckets(ConstraintFactory constraintFactory) {
return constraintFactory.forEachIncludingNullVars(TrolleyStep.class)
...;
}( B)或者,不要使用nullable=true变量并初始化单元测试中的所有计划变量。
https://stackoverflow.com/questions/73247752
复制相似问题