Вознаграждение Optaplanner 7 ConstraintStream в соответствии со значением функции для каждого экземпляра - PullRequest
0 голосов
/ 28 мая 2020

Я планирую расписание, используя Optaplanner 7.37, и реализую положительное мягкое ограничение, так что задачи с более высоким приоритетом будут планироваться первыми. Я хочу произвести инкрементный подсчет очков, который вознаграждается в соответствии со значением приоритета.

Я пробовал следующее, но, как вы можете видеть, он просто добавит одну мягкую единицу оценки для каждой запланированной задачи (так что она выиграла '' t варьируются в зависимости от приоритета задачи.

private Constraint scheduleHighPriorityTasks(ConstraintFactory factory) {
    return factory.from(ShiftAssignment.class)
            .reward('High priority work done', HardSoftScore.ONE_SOFT);
}

Я бы хотел что-то примерно вроде этого вымышленного кода:

private Constraint scheduleHighPriorityTasks(ConstraintFactory factory) {
    return factory.from(ShiftAssignment.class)
            .multiply(ShiftAssignment::getTaskPriority)
            .reward('High priority work done', HardSoftScore.ONE_SOFT);
}

, чтобы, если getTaskPriority вернет приоритет 3, тогда мягкая оценка будет вознагражден трехкратным превышением настроенного веса.

Я не думаю, что мои требования настолько сложны, поэтому я думаю, что, вероятно, есть способ сделать это.

Есть идеи?

1 Ответ

1 голос
/ 28 мая 2020

Если других мягких ограничений нет, вы можете просто использовать перегруженный метод вознаграждения, который принимает matchWeigher:

private Constraint scheduleHighPriorityTasks(ConstraintFactory factory) {
    return factory.from(ShiftAssignment.class)
            .reward('High priority work done', HardSoftScore.ONE_SOFT, ShiftAssignment::getTaskPriority);
}

Если есть другие мягкие ограничения, но это всегда более важно то, что это не мягкое ограничение, а среднее ограничение (и других средних ограничений нет).

Если есть другие мягкие ограничения, которые могут перевесить или не перевесить это ограничение приоритета, тогда оно становится немного сложнее. В этом случае я бы, вероятно, использовал getTaskPrioritySoftWeight вместо getTaskPriority.

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