Является ли drl-версия ProjectJobScheduling непригодной для использования? - PullRequest
1 голос
/ 15 апреля 2019

запуск примера ProjectJobScheduling с конфигурацией drl, кажется, занимает на несколько порядков больше времени, чтобы прийти к реальному решению.Для версии "ProjectJobSchedulingIncrementalScoreCalculator" он находит выполнимое решение сложной примерной проблемы за пару минут, версия drl не находит ее за два часа.

Есть ли способ сделать версию drl пригодной для использованияили этот тип проблемы требует добавочного значения java?

Единственное изменение, которое я сделал, это:

<scoreDirectorFactory>
     <!--<incrementalScoreCalculatorClass>org.optaplanner.examples.projectjobscheduling.solver.score.ProjectJobSchedulingIncrementalScoreCalculator</incrementalScoreCalculatorClass>-->
   <scoreDrl>org/optaplanner/examples/projectjobscheduling/solver/projectJobSchedulingScoreRules.drl</scoreDrl>
  </scoreDirectorFactory>

РЕДАКТИРОВАТЬ: комментирование правила с помощью insertLogical увеличило оценку / спримерно в 20 раз для проблемы, которую я использовал.

Итак, я попробовал несколько вариантов, которые не используют insertLogical, каждый с одним правилом, чтобы заменить два, которые я удалил (правило вставки инакопление вставленного логика) Они были быстрее, но все же непрактично медленны.

«Лучшая» версия drl для меня - это добавить проблемный факт для каждого возможного дня с нуля до истечения срока, но выбираясрок исполнения меняет дело:

rule "renewableResourceCapacity"
    salience 3
    when
        ResourceDay(  $day: usedDay)    
        $resource : Resource(renewable == true, $capacity:capacity)      

        accumulate(
            ResourceRequirement(resource == $resource,
                    $executionMode : executionMode,
                    $requirement : requirement)
            and Allocation(executionMode == $executionMode, $day >= startDate, $day < endDate);
            $used : sum($requirement);
            $used > $capacity
        )
    then
        scoreHolder.addHardConstraintMatch(kcontext, 0, $capacity - $used);
end

Самое быстрое решение drl все еще примерно в 100 раз медленнее, чем версия javaGH.И чтобы быть ясным, модифицированный drl примерно в 20 раз быстрее, чем существующий drl, который в 100 раз медленнее, чем java.

1 Ответ

1 голос
/ 18 апреля 2019

В ДХО, вероятно, есть правило узкого места. Один из способов определить, какой из них - закомментировать правило, запустить его в течение 1 минуты и посмотреть, как отличается счетчик подсчета очков. Сделайте это для каждого правила (их 4 или 5), и вы узнаете, какие из них дорогие.

Есть одно правило, использующее insertLogical, которое никогда не сказывается на производительности. Это был бы мой главный подозреваемый.

...