Поставщик диапазона значений Optaplanner не вызывается - PullRequest
0 голосов
/ 01 января 2019

Я хотел бы знать, как работает поставщик диапазона значений.

У меня есть класс с именем Entity, в этом классе есть несколько экземпляров, все они сопоставлены в Solution, как показано ниже

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

Теперь я хочу иметь значения диапазона Differentnet дляразные Entity объекты .Например.один будет иметь от 0 до 50, другой может иметь от 20 до 100, как.Итак, я реализовал @ValueRangeProvider внутри Entity Class.

@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 никогда не вызывается, также Оптапланер не учитывает диапазон при генерации результатов, но все правила слюней работают нормально, как и предполагалось.Все, что мне нужно, это статически назначать диапазоны для каждого объекта сущности.

Примечание: я использую InvestmentQuantityTransferMove.java для перехода от примера investments , найденного в репо-планировщике Репо.Поскольку мое решение также похоже, то сумма всей сущности должна быть точно равна определенной величине.

1 Ответ

0 голосов
/ 01 января 2019

Вероятно, ваша сущность не анализируется OptaPlanner, или вы получите явное исключение - иначе наступит точка останова.Таким образом, одно из этих двух условий не выполняется:

  • Ваша организация должна иметь аннотацию @PlanningEntity.Это четко соблюдается.
  • Ваша организация должна быть зарегистрирована в solverConfig.xml (или эквиваленте java API) с <entityClass>.Вероятно, это проблема.

(Если оба из них выполнены, и ваша точка останова не достигнута, то это ошибка. Создайте jira с репродуктором.)

Это распространенная ошибка, но, к сожалению, OptaPlanner не может обнаружить, если объект не зарегистрирован (насколько я знаю, без больших затрат производительности Boostrap) ...

...