Я новичок в OptaPlanner (и Программировании удовлетворенности ограничений), и после учебного курса по балансировке облаков я хотел смоделировать свою первую настраиваемую проблему, но изо всех сил стараюсь найти правильные ограничения для решателя.
Проблема :
У меня есть группа людей, которую я хочу разделить на две разные группы в зависимости от их семестра и способности.
В этом конкретном случае c каждый человек в группе один должен иметь один семестр (и способность) как семестр и преподавательская группа, и все остальные должны быть во второй группе.
Мои данные c данные:
Группа_1: reqSemester: 7, reqFaculty: 2
Группа_2: reqSemester: 0 , reqFaculty: 0
Person_1: семестр: 7, факультет: 2
Person_2: семестр: 6, факультет: 1
Person_3: семестр: 8, факультет: 3
My ограничения:
int semesterDiff = group.getSemester() - semester;
if (semesterDiff == 0){
hardScore += semester;
}
int facultyDiff = group.getFaculty() - faculty;
if (facultyDiff == 0){
hardScore += faculty;
}
ожидаемый результат:
Group_1: Person_1
Group_2: Person_2, Person_3
Результат, который я получил:
Gro up_1: Person_2, Person_1
Group_2: Person_3
Примечание: переключение ограничений с == на! = решит мою проблему, но когда я добавлю больше людей, это "провалится" снова.
Редактировать: добавлен полный (и расширенный) код правил оценки.
public class LoudBalancingScoreRules implements EasyScoreCalculator<Problem> {
public HardSoftScore calculateScore(Problem problem) {
int softScore = 0;
int hardScore = 0;
for (Group group : problem.getListGroup()) {
int semester = 0;
int faculty = 0;
for (Person person : problem.getPersonList()) {
if (group.equals(person.getGroup())) {
semester = person.getSemester();
faculty = person.getFb();
}
}
int semesterDiff = group.getSemester() - semester;
if (semesterDiff == 0){
hardScore += semester;
}
int facultyDiff = group.getFb() - faculty;
if (facultyDiff == 0){
hardScore += faculty;
}
if (semesterDiff != 0){
hardScore += -Math.abs(semesterDiff);
}
if (facultyDiff != 0){
hardScore += -Math.abs(facultyDiff);
}
}
return HardSoftScore.of(hardScore, softScore);
}
Как я уже показал, это не совсем работает как я и ожидал, и я не смог найти свою ошибку. Если кто-нибудь сможет понять, где я иду не так, это будет очень полезно.