首页 > 解决方案 > 第一个定制问题——努力寻找约束

问题描述

我是 OptaPlanner(和约束满足编程)的新手,在遵循云平衡教程之后,我想对我的第一个自定义问题进行建模,但我很难为求解器找到正确的约束。

问题:
我有一群人,我想根据他们的学期和教师分成两个不同的组。
在这种特定情况下,第一组中的每个人都应与该组拥有的学期和教员具有相同的学期(和教员),而其他所有人都应在第二组中。

我的具体数据:
Group_1 : reqSemester : 7 , reqFaculty : 2
Group_2 : reqSemester : 0 , reqFaculty : 0

Person_1:学期:7,教师:2
Person_2:学期:6,教师:1
Person_3:学期:8,教师:3

我的限制:

 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

我得到的结果:
Group_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);
}

正如我所展示的,它不像我预期的那样工作,我无法找到我的错误。如果有人能弄清楚我哪里出错了,那将是一个很大的帮助。

标签: javaoptaplanner

解决方案


推荐阅读