У меня очень простое (возможно слишком простое) правило, которое я хочу применить в 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
Это похоже на довольно легкую вещь, но по какой-то причине я не могу обойти ее. Нет ли простого решения для этого
В примерах найдите классы, заканчивающиеся 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
public int getTaskConfigLog()
в вашем классеTaskAssignment
?