Optaplanner 6.1.0 cr1

时间:2014-06-19 12:55:41

标签: optaplanner

我正在尝试为实体计划变量实现值范围。变量定义为

@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)

任何人都可以指出我正确的方向。谢谢。

2 个答案:

答案 0 :(得分:0)

&#34;是否需要将CountableValueRange集合添加到问题事实中?&#34;不需要。这需要枚举它们,这对于大值范围(例如所有可能的长度)来说是不现实的。

&#34;但是,这会引发运行时错误,指出xCenter在实体中没有getter。&#34;我怀疑您的问题与使用CountableValueRange<BigDecimal>无关,但与变量属性名称xCenter有关。这个理论的动机:

  1. 错误消息说明没有找到计划变量(=步骤2),而不是找不到值范围(=步骤3)。它确实成功找到了计划实体(=步骤1)。

  2. 如果我没记错的话,与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)