Optaplanner: оценить решение

В настоящее время я работаю над проектом Java, который использует Optaplanner и пускает слюни для решения проблемы удовлетворения ограничений.

Решение работает нормально. Но после solver дал мне решение, я хочу оценить решение: я хочу знать, какие ограничения были нарушены, то есть какие правила были задействованы и сколько раз.

Возможно ли это, и как мне начать с этого?


person Pieter Meiresone    schedule 27.04.2014    source источник


Ответы (2)


См. Раздел документации. Повторное использование расчета оценок вне решателя < / а>. Это предоставляет все необходимые данные в простой форме.

for (ConstraintMatchTotal constraintMatchTotal : guiScoreDirector.getConstraintMatchTotals()) {
    String constraintName = constraintMatchTotal.getConstraintName();
    Number weightTotal = constraintMatchTotal.getWeightTotalAsNumber();
    for (ConstraintMatch constraintMatch : constraintMatchTotal.getConstraintMatchSet()) {
        List<Object> justificationList = constraintMatch.getJustificationList();
        Number weight = constraintMatch.getWeightAsNumber();
        ...
    }
}

См. Ответ Лауне, чтобы узнать о более продвинутых приемах / приемах слюни.

person Geoffrey De Smet    schedule 28.04.2014
comment
В примерах OptaPlanner после решения набора данных нажмите нижнюю левую кнопку Соответствие ограничений, чтобы увидеть этот материал в действии. - person Geoffrey De Smet; 28.04.2014
comment
Правильно ли я говорю, что justificationList содержит переменные, которые были в LHS правила, когда правило было сопоставлено? - person Pieter Meiresone; 28.04.2014
comment
Да, за 1 соответствие правила. - person Geoffrey De Smet; 29.04.2014
comment
Принял ответ, ввиду простоты решения. - person Pieter Meiresone; 29.04.2014

Срабатывание правил можно наблюдать, реализовав org.kie.api.event.rule.AgendaEventListener и прикрепив его с помощью KieSession.addEventListener(AgendaEventListener listener).

Механизм правил не оборудован, чтобы объяснить, почему какое-то правило не сработало.

Это зависит от сложности имеющихся у вас правил, но один из способов - написать правила, которые оценивают ограничения по отдельности и накапливают «набор выполненных», после чего можно определить «все выполнено» и дополнением неполного набора является ответ на ваш вопрос.

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

rule abc when A() B() C() then ... end

ты должен написать

rule not_a when not A() then ... end
rule a_not_B when A() not B() then ... end
rule ab_not_c when A() B() not C() then ... end 

Это, однако, не скажет вам все отсутствующие условия: если not_a срабатывает, также B и C могут не совпадать.

person laune    schedule 28.04.2014