Использование нотации @PlanningId в Instant @PlanningVariable - PullRequest
0 голосов
/ 28 марта 2019

В настоящее время я работаю над созданием задачи планирования на основе Ганта, где пользователь может выбирать, какие задачи он хочет планировать, и OptaPlanner будет делать это для них.

Я использую вычисление инкрементного показателя Javaа не слюни двигателя.Моя проблема в том, что OptaPlanner не будет принимать Instant в качестве переменной планирования, поскольку он не может найти для него PlanningId.

Я застрял при получении OptaPlanner для использования нескольких потоков.Моя текущая модель кажется некорректной, или я не понимаю, как правильно использовать OptaPlanner.

Я пытался замаскировать Instant за другим классом, но это все равно не помогло.

Моя модель используеттолько один PlanningEntity, который является задачей.

Вот упрощенная версия моего @PlanningEntity:

@PlanningEntity(difficultyComparatorClass = TaskDifficultyComparator.class)
public class Task extends AbstractTask {
    private Machine machine;
    private Instant start;

    @PlanningId
    private Integer id;

    @PlanningVariable(valueRangeProviderRefs = {"machineRange"}, nullable = true, strengthComparatorClass = MachineStrengthComparator.class)
    public Machine getMachine() {
        return machine;
    }

    @PlanningVariable(valueRangeProviderRefs = {"timeRange"}, nullable = true, strengthComparatorClass = StartStengthComparator.class)
    public Instant getStart() {
        return start;
    }
}

В моей конфигурации я добавил это в тег решателя:

<moveThreadCount>AUTO</moveThreadCount>

Это дает мне исключение:

Exception in thread "Thread-6" java.lang.IllegalStateException: The move thread with moveThreadIndex (0) has thrown an exception. Relayed here in the parent thread.
    at org.optaplanner.core.impl.heuristic.thread.OrderByMoveIndexBlockingQueue.take(OrderByMoveIndexBlockingQueue.java:142)
    at org.optaplanner.core.impl.localsearch.decider.MultiThreadedLocalSearchDecider.forageResult(MultiThreadedLocalSearchDecider.java:187)
    at org.optaplanner.core.impl.localsearch.decider.MultiThreadedLocalSearchDecider.decideNextStep(MultiThreadedLocalSearchDecider.java:157)
    at org.optaplanner.core.impl.localsearch.DefaultLocalSearchPhase.solve(DefaultLocalSearchPhase.java:70)
    at org.optaplanner.core.impl.solver.AbstractSolver.runPhases(AbstractSolver.java:87)
[...]
Caused by: java.lang.IllegalArgumentException: The externalObject (2019-04-16T20:31:17.162Z) cannot be looked up.
Maybe give the class (class java.time.Instant) a PlanningId annotation or change the PlanningSolution annotation's LookUpStrategyType or don't rely on functionality that depends on ScoreDirector.lookUpWorkingObject().
    at org.optaplanner.core.impl.domain.lookup.NoneLookUpStrategy.lookUpWorkingObject(NoneLookUpStrategy.java:47)
    at org.optaplanner.core.impl.domain.lookup.LookUpManager.lookUpWorkingObject(LookUpManager.java:74)
[...]

Я ожидал, что OptaPlanner будет использовать идентификатор задач, но, похоже, ему нужен идентификатор для каждой из PlanningVariables.Я могу добавить идентификатор на машине, но не на мгновение.

1 Ответ

0 голосов
/ 29 марта 2019

A java.time.Instant является неизменным, поэтому любой поиск может просто вернуть тот же экземпляр объекта.Как и Integer, Double, LocalDate и т. Д., Для начала не требуется @PlanningId.Это раскрывает 3 проблемы в OptaPlanner:

  1. Встроенный кеш решений LookUpStrategyResolver.java также должен включать в себя Instant. Я исправил эту проблему в этом PR на 7.20.
  2. Должна быть возможность настроить дополнительные неизменяемые классы.
  3. Должна быть возможность настроить @PlanningId внешне приЗанятия сторонних организаций.

Пожалуйста, создайте jira для 2. и 3. на PLANNER проекта questions.jboss.org.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...