我想知道值范围提供程序的工作原理。
我有一个名为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存储库中的投资示例。以来 我的解决方案也类似,所有实体的总和应为 完全等于特定值。
答案 0 :(得分:0)
您的实体可能没有被OptaPlanner解析,否则您将获得明确的例外-否则将达到断点。因此无法满足以下两个条件之一:
solverConfig.xml
在<entityClass>
(或等效的Java API)中注册。这可能是问题所在。(如果这两个条件都满足并且没有达到您的断点,那么这是一个错误。请创建带有复制器的jira。)
这是一个常见的陷阱,但是不幸的是,OptaPlanner无法检测到某个实体是否未注册(据我所知,没有增加大量的boostrap性能成本)...