Оптапланнер - Список правил слюни <> memberOf List <>? - PullRequest
0 голосов
/ 11 декабря 2018

Я наслаждаюсь путешествием через Оптапланнер.Ява не мой "родной" язык, но к моему удивлению (крутая?) Кривая обучения Optaplanner & Drools не заставила меня сдаться!

То, что у меня так далеко: у меня естьсделал проект с необходимыми занятиями.Ради моего вопроса я упрощу: класс Employee, класс Job, класс Skills и класс Schedule, где я хотел бы получить свой идеальный оптапланированный график.

В классе моих сотрудников есть переменная List<Skill> skills, содержащая как минимум 1 навык.Мой класс заданий содержит ту же переменную List<Skill> reqSkills (req = обязательный).Он содержит как минимум 1 навык, необходимый для выполнения этой работы.

Я инициализировал некоторые фиктивные данные.Затем я запускаю следующее правило:

rule "requiredSkills"
    when
        Employee($skills : skills)
        Job(reqskills not memberOf $skills)
    then
        scoreHolder.addHardConstraintMatch(kcontext, -1);
end

Я подумал (но здесь крутая кривая для Drools бьет меня) это казалось логичным: когда навык сотрудника не является членом навыка (ов), необходимых длятогда работа - это жесткое ограничение ..

Результат для моего "планирования" всегда таков: первый сотрудник, которого я ввел в качестве фиктивных данных, связан со всеми заданиями ...

Мне кажется, что использование memberOf не работает для списков против списков.Но как мне это исправить, поскольку оба моих сотрудника, так же как и мои рабочие места, могут иметь / требовать нескольких навыков?

1 Ответ

0 голосов
/ 11 декабря 2018

Я никогда не использую конструкцию drools not memberOf в случаях OptaPlanner.Возможно из-за привычки, может быть потому, что она медленная или хрупкая).

FWIW, это очень похоже на требование к навыку в optaweb-employee-rostering , который просто использует простые Java-конструкции кода внутриShift шаблон DRL:

rule "Required skill for a shift"
    when
        Shift(
                employee != null,
                !getEmployee().hasSkills(getSpot().getRequiredSkillSet()))
    then
        scoreHolder.addHardConstraintMatch(kcontext, -100);
end
...