В настоящее время я работаю над созданием задачи планирования на основе диаграммы Ганта, при которой пользователь может выбрать, какие задачи он хочет запланировать, а 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 будет использовать идентификатор задачи, но похоже, что ему нужен идентификатор для каждой из переменных планирования. Я могу добавить идентификатор на Машину, но не на Мгновенный.