没有致电Optaplanner价值范围提供商

时间:2019-01-01 09:38:59

标签: drools optaplanner

我想知道值范围提供程序的工作原理。

我有一个名为Entity的类,在该类中有多个实例,所有实例都映射在Solution中,如下所示

@PlanningEntityCollectionProperty
public List<Entity> getEntityList() {
    return entityList;
}

现在,我想为不同的Entity 对象使用不同的网络范围值。例如。一个将具有0到50,另一个可能具有20到100。因此,我在@ValueRangeProvider类中实现了Entity

@PlanningEntity()
public class Entity {

@PlanningVariable(valueRangeProviderRefs = {"quantityRange"})
public Long getAllocatedWeight() {
    return allocatedWeight;
}

@ValueRangeProvider(id = "quantityRange")
public CountableValueRange<Long> getQuantityRange() {
    return ValueRangeFactory.createLongValueRange(minWeights, maxWeights);
}

}

永远不会调用getQuantityRange处的断点,而且Optaplanner在生成结果时也没有考虑范围,但是所有流口水规则都可以正常工作。我所需要做的就是为每个实体对象静态分配范围。

  

注意:我正在使用InvestmentQuantityTransferMove.java进行步进   来自optaplanner存储库中的投资示例。以来   我的解决方案也类似,所有实体的总和应为   完全等于特定值。

1 个答案:

答案 0 :(得分:0)

您的实体可能没有被OptaPlanner解析,否则您将获得明确的例外-否则将达到断点。因此无法满足以下两个条件之一:

  • 您的实体需要具有@PlanningEntity批注。显然可以满足。
  • 您的实体需要使用solverConfig.xml<entityClass>(或等效的Java API)中注册。这可能是问题所在。

(如果这两个条件都满足并且没有达到您的断点,那么这是一个错误。请创建带有复制器的jira。)

这是一个常见的陷阱,但是不幸的是,OptaPlanner无法检测到某个实体是否未注册(据我所知,没有增加大量的boostrap性能成本)...