我正在尝试为实体计划变量实现值范围。变量定义为
@PlanningVariable(valueRangeProviderRefs = {"xPosRange"})
public BigDecimal getXCenter()
{
return xCenter;
}
ValueRangeProvider指定为
@ValueRangeProvider(id = "xPosRange")
public CountableValueRange<BigDecimal> getXPositions()
{
return ValueRangeFactory.createBigDecimalValueRange(new BigDecimal(0.0,
MathContext.DECIMAL64), new BigDecimal(maxLength, MathContext.DECIMAL64));
}
理想情况下,我希望在规划实体中拥有此功能。但是,在解决方案时,这些值永远不会改变。将“ValueRangeProvider”添加到解决方案时也是如此。
是否需要将“CountableValueRange”集合添加到问题事实中? 如果是这样,添加
facts.addAll(getXPositions());
引发了一个参数不匹配错误。
我尝试将以下内容添加到xml配置文件
<changeMoveSelector>
<valueSelector>
<variableName>xCenter</variableName>
</valueSelector>
</changeMoveSelector>
但是,这会引发运行时错误,指出xCenter在实体中没有“getter”。
The selectorConfig (ValueSelectorConfig(xCenter)) has a variableName (xCenter) for
entityClass (packetName.Part) that does not have that as a getter.
Check the spelling of the variableName (xCenter)
任何人都可以指出我正确的方向。谢谢。
答案 0 :(得分:0)
&#34;是否需要将CountableValueRange集合添加到问题事实中?&#34;不需要。这需要枚举它们,这对于大值范围(例如所有可能的长度)来说是不现实的。
&#34;但是,这会引发运行时错误,指出xCenter在实体中没有getter。&#34;我怀疑您的问题与使用CountableValueRange<BigDecimal>
无关,但与变量属性名称xCenter
有关。这个理论的动机:
错误消息说明没有找到计划变量(=步骤2),而不是找不到值范围(=步骤3)。它确实成功找到了计划实体(=步骤1)。
如果我没记错的话,与getXCenter()
和getAFoo()
以及getHTTPSomething()
的getter相关的JavaBeans规范是奇怪/不合逻辑的。我怀疑getXCenter()
会导致属性名称 XCenter
而不是xCenter
(是的,JavaBeans规范在这方面很糟糕,但OptaPlanner必须坚持JavaBeans规范)。
答案 1 :(得分:0)
我已经改进了6.1.0.CR2的错误消息,因此您可以得到以下内容:
Exception in thread "main" java.lang.IllegalArgumentException: The selectorConfig (ValueSelectorConfig(pEriod)) has a variableName (pEriod) which is not a valid planning variable on entityClass (class org.optaplanner.examples.curriculumcourse.domain.Lecture).
The variableName (pEriod) for entityClass (class org.optaplanner.examples.curriculumcourse.domain.Lecture) does not exists as a property (getter/setter) on that class.
Check the spelling of the variableName (pEriod). It probably needs to be correctedVariableName (PEriod) instead because the JavaBeans spec states the first letter should be a upper case if the second is upper case.
at org.optaplanner.core.config.heuristic.selector.SelectorConfig.deduceVariableDescriptor(SelectorConfig.java:100)
at org.optaplanner.core.config.heuristic.selector.value.ValueSelectorConfig.buildValueSelector(ValueSelectorConfig.java:198)
at org.optaplanner.core.config.heuristic.selector.move.generic.ChangeMoveSelectorConfig.buildBaseMoveSelector(ChangeMoveSelectorConfig.java:68)
at org.optaplanner.core.config.heuristic.selector.move.MoveSelectorConfig.buildMoveSelector(MoveSelectorConfig.java:187)