0

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

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

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

4

2 回答 2

1

“是否需要将 CountableValueRange 集合添加到问题事实中?” 不,这需要枚举它们,这对于大值范围(例如所有可能的多头)是不现实的。

“但是,这会引发运行时错误,说明 xCenter 在实体中没有吸气剂。” 我怀疑您的问题与使用的无关CountableValueRange<BigDecimal>,而是与变量属性名称有关xCenter。这个理论的动机:

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

  2. getXCenter()如果我没记错的话,与getAFoo()and的 getter 相关的 JavaBeans 规范getHTTPSomething()很奇怪/不合逻辑。我怀疑getXCenter()会导致属性名称XCenter而不是xCenter(是的,JavaBeans 规范在这方面很糟糕,但 OptaPlanner 必须遵守 JavaBeans 规范)。

于 2014-06-23T06:39:59.417 回答
1

我已经改进了 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)
于 2014-06-23T13:41:56.370 回答