#optaplanner
#optaplanner
Вопрос:
————————————документ——————————-
Потоки ограничений — это функциональная программная форма вычисления инкрементных баллов на простом Java, которую легко читать, записывать и отлаживать. API должен быть знаком вам, если вы работали с потоками Java 8 или SQL.
API ConstraintStreams / ConstraintProvider является текущим проектом. Это работает, но в нем много пробелов в API. Поэтому он еще недостаточно богат для обработки сложных ограничений. Обоснования ограничений могут работать неправильно.
6.1. Введение Используя Streams API Java 8, мы могли бы реализовать простой калькулятор баллов, использующий функциональный подход:
private int doNotAssignAnn() {
int softScore = 0;
schedule.getShiftList().stream()
.filter(Shift::isEmployeeAnn)
.forEach(shift -> {
softScore -= 1;
});
return softScore;
}
Однако это плохо масштабируется, потому что не выполняет инкрементное вычисление: когда изменяется переменная планирования для одной смены, чтобы пересчитать оценку, API Normal Streams должен выполнить весь поток с нуля. API ConstraintStreams позволяет писать аналогичный код на чистом Java, получая при этом преимущества в производительности от инкрементного подсчета баллов. Это пример того же кода, использующего API потоков ограничений:
private Constraint doNotAssignAnn(ConstraintFactory factory) {
return factory.from(Shift.class)
.filter(Shift::isEmployeeAnn)
.penalize("Don't assign Ann", HardSoftScore.ONE_SOFT);
}
Этот поток ограничений перебирает все экземпляры сдвига классов в фактах проблемы и объектах планирования в задаче планирования. Он находит каждую смену, которая назначается сотруднику Ann, и для каждого такого экземпляра (также называемого совпадением) он добавляет мягкий штраф в размере 1 к общему баллу.
————————————документ——————————-
Мой вопрос:
В качестве объекта планирования, если сдвиг присваивается Ann в первый раз, будет наложено мягкое наказание в виде добавления 1 к общему баллу. Если вторая итерация оптимального решения имеет общий балл 0 и присваивается Ann2, мягкий штраф применяться не будет, но общий балл за последний раз плюс 1 мягкий штраф, как он становится 0?
Комментарии:
1. Попробуйте использовать
ScoreManager.getSummary()
илиScoreManager.explainScore()
, чтобы понять, почему общее значение равно 0.2. Другие вещи, которые нужно проверить, на всякий случай: временно включите FULL_ASSERT, чтобы исключить повреждение оценки как причину. И вы также можете включить ведение журнала трассировки, чтобы видеть каждое решение, принятое OptaPlanner.
3. Большое вам спасибо за ваш ответ, я также видел эту часть логики в исходном коде. Спасибо