Первая индивидуальная проблема - изо всех сил пытаться найти ограничения - PullRequest
0 голосов
/ 17 апреля 2020

Я новичок в 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);
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...