Как определить ограничение относительно последовательных периодов в optaplanner - PullRequest
0 голосов
/ 24 февраля 2020

В моем проекте optaplanner у меня есть периоды с фиксированной продолжительностью. Для некоторых из них существует среднее ограничение: их следует планировать подряд, занимая, например, 5 непосредственно смежных временных интервалов. Я хочу использовать Java потоков ограничений, но мне не удается определить это ограничение с использованием шаблона временного интервала.

Я знаю, что это ограничение можно определить с использованием шаблона временного интервала, как предложено { ссылка }. Я сделал это, и это работает. Но я хочу сравнить шаблон временного интервала с шаблоном временного зерна, потому что они имеют другое поведение, когда дело доходит до локальных максимумов. Проблема с временным шаблоном состоит в том, что эти 5 периодов также могут быть запланированы в каждом возможном разделе 5 (например, как 2 + 2 + 1).

Есть кто-нибудь подсказка о том, как определить ограничение используя шаблон временного интервала?

1 Ответ

2 голосов
/ 25 февраля 2020

Вы можете попробовать использовать только что добавленный ifExists() строительный блок . Не зная вашей фактической модели предметной области, я представляю, что ограничение выглядит следующим образом:

private Constraint twoConsecutivePeriods(ConstraintFactory constraintFactory) {
    return constraintFactory.from(Period.class)
            .ifExists(Period.class, equal(Period::getDay, period -> period.getDay() + 1))
            .penalize("2 consecutive periods", period -> ...);
}

Следовательно, ifNotExists() может использоваться для достижения противоположного. У нас есть примеры обоих примеров в Traveling Tournament OptaPlanner .

Обратите внимание, что этот API доступен только с OptaPlanner 7.33.0. Окончательный вариант.

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