Статьи

Счет ДХО: быстрее и проще в OptaPlanner

Для OptaPlanner (= Drools Planner) 6.0.0.Beta1 я заменил ConstraintOccurrence более элегантной системой ConstraintMatch. В результате ваши DRL-файлы получают:

  • намного быстрее
  • легче читать и писать
  • гораздо менее подвержен ошибкам, потому что они значительно усложняют процесс оценки

Давайте сначала посмотрим на результаты, прежде чем мы рассмотрим улучшения читабельности кода.

Быстрее

«Покажите мне критерии!»

Среднее количество вычислений, то есть количество очков, которые OptaPlanner вычисляет в секунду, резко возросло.

  • N королев: + 39% к счету для 256 королев
  • Баланс облаков: в среднем рассчитывается на 27%
  • Маршрут транспортного средства: + 40% к счету в среднем
  • Планирование курса: в среднем рассчитывается + 20%
  • График сдачи экзамена: в среднем рассчитывается + 23%
  • Составление медсестры: в среднем на 7% рассчитывается

Однако это не обязательно означает значительное улучшение результата, особенно если старый результат уже (почти) оптимален. Это означает, что вы можете получить точно такой же результат за гораздо меньшее время . Но — как и во всех других улучшениях производительности — не обещает значительно лучших результатов в то же время. Это помогает при масштабировании.

  • Баланс облачности: + 0,58% возможного мягкого счета в среднем за 5 минут
  • Маршрут транспортного средства: + 0,14% возможного мягкого счета в среднем за 5 минут
  • Планирование курса: + 2,28% возможного мягкого результата в среднем за 7 минут
  • График сдачи экзамена: + 0,53% возможной мягкой оценки в среднем за 7 минут

Несколько из 30 наборов данных о маршрутизации транспортных средств уже были оптимально решены за 5 минут, поэтому они снижают среднее значение, несмотря на большое ускорение маршрутизации транспортных средств. Все тесты используют одну и ту же версию Drools и OptaPlanner, поэтому эти цифры показывают только улучшения изменения ConstraintMatch. В 6.0 есть несколько других улучшений.

Как средняя рассчитывает шкалу счета?

Вот некоторые диаграммы, сравнивающие старый ConstraintOccurrence с новым ConstraintMatch. Текущая реализация новой ConstraintMatch не была полностью оптимизирована, поэтому иногда упоминается, что она находится в «медленном» режиме (хотя и быстрее).

CloudBalance:

Маршрут транспортного средства:

Планирование курса:

Составление экзамена:

Полегче

«Покажите мне код!

Для начала правила накапливать HardScore и накапливать SoftScore удаляются. Меньше шаблонного. Далее, каждое из RHS правила оценки (= тогда сторона) проще:

Перед:

1
2
3
4
5
6
7
8
rule "conflictingLecturesSameCourseInSamePeriod"
        when
            ...
        then
            insertLogical(new IntConstraintOccurrence("conflictingLecturesSameCourseInSamePeriod", ConstraintType.HARD,
                    -1,
                    $leftLecture, $rightLecture));
    end

После:

1
2
3
4
5
6
rule "conflictingLecturesSameCourseInSamePeriod"
        when
            ...
        then
            scoreHolder.addHardConstraintMatch(kcontext, -1);
    end

Обратите внимание, что вам больше не нужно повторять имя правила или причины (лекции). OptaPlanner сам вычисляет это через переменную kcontext. Drools автоматически выставляет переменную kcontext в RHS, поэтому вам не нужен дополнительный код для нее. Кроме того, ограниченное перечисление ConstraintType было заменено методом, специфичным для типа Score, чтобы позволить OptaPlanner лучше поддерживать многоуровневые типы оценок, например HardMediumSoftScore и BendableScore. Вам также больше не нужно взламывать API, чтобы получить список всех ConstraintOcurrence: объекты ConstraintMatch (и их итоги по ограничению) доступны непосредственно в API ScoreDirector.

Ссылка: оценка DRL: быстрее и проще в OptaPlanner от нашего партнера по JCG Джеффри Де-Смета в блоге Drools & jBPM .