java - 第一个定制问题——努力寻找约束
问题描述
我是 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);
}
正如我所展示的,它不像我预期的那样工作,我无法找到我的错误。如果有人能弄清楚我哪里出错了,那将是一个很大的帮助。
解决方案
推荐阅读
- git - 任何想法来控制设置文件?
- scala - 如何将csv文件中可用的列名作为标题分配给orc文件
- mysql - 如何在 vue js 和 Laravel 中显示来自多个表的数据?
- java - 将 SessionFactory 添加到 DAO 导致 java.lang.IllegalStateException: Failed to load ApplicationContext
- android - 当我单击按钮在我的应用程序中注册时,FireBase 中没有任何反应
- python - Pandas:对于大于 1 的值,如何舍入最接近整数的值?
- hyperlink - 是否有脚本可以从 txt 中提取特定链接并将其写入另一个 txt 文件?
- swift - 使用 ContainerView 中的操作隐藏 ViewController 中的条形按钮项的 Swift 命令?
- python - 散景服务器 - 在回调返回之前强制刷新客户端图形?
- python - __init__() 接受 3 个位置参数,但给出了 4 个