Попытка добавить значение к баллу в Optaplanner (используя Drools)

1

У меня очень простое (возможно слишком простое) правило, которое я хочу применить в Drools, чтобы добавить значение в мой Hard score в Optaplanner. В принципе, в классе решения TaskAssignment я генерирую taskConflictList, который добавляет к taskConflictLog каждый раз, когда возникает конфликт:

public List<TaskConflict> calculateTaskConflictList(){
   List<TaskConflict> taskConflictList=new ArrayList<TaskConflict>();
   taskConflictLog=0;
    for(Task leftTask:taskList){
        for(Task rightTask:taskList){
            if(leftTask.solutionEquals(rightTask)==!true){
                if(leftTask.getAssignedDevAsString().equals(rightTask.getAssignedDevAsString())){
                if((rightTask.getAllottedStartTime()<=leftTask.getAllottedStartTime()) //long bit of code here....//){
                    taskConflictList.add(new TaskConflict(leftTask,rightTask));
                    taskConflictLog++;
                }
                }
            }
        }
    }
    return taskConflictList;       
   }

Все, что я тогда хочу сделать, это отрицание этой taskConflictLog действует как Hard Score в Drools. В настоящее время я ввел это:

rule "OnlyDoOneTaskAtTime"
when
    $TA:TaskAssignment($tCL:taskConflictLog)

then
    scoreHolder.addHardConstraintMatch(kcontext,-$tCL);

end

Но я получаю сообщение об ошибке $tCL cannot be resolved to a variable

Это похоже на довольно легкую вещь, но по какой-то причине я не могу обойти ее. Нет ли простого решения для этого

  • 0
    Это единственная ошибка, которую вы получаете? - Есть ли public int getTaskConfigLog() в вашем классе TaskAssignment ?
Теги:
optaplanner
drools

1 ответ

1

В примерах найдите классы, заканчивающиеся Parametrization, например, в экзаменационной версии, в наборе данных:

public class InstitutionParametrization extends AbstractPersistable { // SINGLETON per Solution

    private int twoInARowPenalty;
    private int twoInADayPenalty;
    private int periodSpreadLength;
    private int periodSpreadPenalty;
    private int mixedDurationPenalty;
    private int frontLoadLargeTopicSize;
    private int frontLoadLastPeriodSize;
    private int frontLoadPenalty;

    ...
}

Затем в DRL:

rule "twoExamsInADay"
    when
        $institutionParametrization : InstitutionParametrization(twoInADayPenalty != 0)
        $topicConflict : TopicConflict($leftTopic : leftTopic, $rightTopic : rightTopic)
        $leftExam : Exam(topic == $leftTopic, $leftDayIndex : dayIndex, $leftPeriodIndex : periodIndex, period != null)
        $rightExam : Exam(topic == $rightTopic, dayIndex == $leftDayIndex,
            Math.abs($leftPeriodIndex - periodIndex) > 1)
    then
        scoreHolder.addSoftConstraintMatch(kcontext,
                $topicConflict.getStudentSize() * (- $institutionParametrization.getTwoInADayPenalty()));
end

// Exams which share students have to few periods between them
rule "periodSpread"
    when
        $institutionParametrization : InstitutionParametrization(periodSpreadPenalty != 0)
        ...
    then
        scoreHolder.addSoftConstraintMatch(kcontext,
                ... * (- $institutionParametrization.getPeriodSpreadPenalty()));
end
  • 0
    Я сделаю видео о пользователях, играющих с объектами параметризации через неделю или две, и выложу его G + / twitter.
  • 0
    Вы делали видео об использовании объектов параметризации?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню