是否有办法限制变量的特定值的赋值数量?
我正在用Choco [4.0.1]编写一个带有课程、教师和时隙的时间表问题。同一个老师可以教很多课程,我需要确定他/她可以教的课程的数量。我在考虑计算时隙的数量,比如B老师可以工作12 hours (12 timeslots),所以我可以发布一个像arithm()这样的约束来确保这一点。有什么想法吗?
更新的
以下是一些代码:
IntVar [] teachers;
IntVar [][] teacherTimeslots;
IntVar [] courses;每门课程都有一个教师和N时间序列,所以A老师可以教{1,2,3,4}和B老师{3,4,5},每门课程每周有4个小时。现在假设A可以工作12个小时。我希望A只教12小时(3门课程),而B只教剩下的课程;
我不能说一个老师有多少门课,但他/她能教多少门课,所以我在用
Tuples tuples = new Tuples(true);
tuples.add(1, 1);
...
tuples.add(2, 5);
model.table(teacher, course, tuples).post();限制,以确保他/她能够教授某些课程。
teacherTimeslots充满了所有可能的时隙,我使用model.allDifferent(teacherTimeslots[teacher]).post()来保持每个教师时隙的独特性。
我的课程是固定的
course[0] = 1;
...
course[4] = 5;我曾想过要为一位老师弄到所有的时隙,但是当我建立我的模型时,没有选择时隙,所以我得到了所有的可能性。
发布于 2017-01-14 15:10:52
这是我的解决方案。我创建了一个Timeslot类来表示一个讲座,其中包括1名教师、1门课程、m机房和n时隙(m=n),因此在我的模型中,所有课程都有一个timeslot对象集合。我用model.count(...)来检查有多少个时隙有一个老师,我把零作为下界,因为一个老师可以被选择或者不可以选择,并且是上界的12倍。
List<IntVar> teachersTimeslotList = new ArrayList<IntVar>();
List<IntVar> teachersList = new ArrayList<IntVar>();
for (int i = 0; i < timeslots.size(); i++) {
for (int j = 0; j < timeslots.get(i).getTimeslots().size(); j++) {
IntVar timeslot = timeslots.get(i).getTimeslots().get(j);
IntVar teacher = timeslots.get(i).getTeacher();
IntVar sumTeacher = model.intVar("sumTeacher", 0, 100000);
teachersList.add(teacher);
model.sum(new IntVar[]{model.intScaleView(timeslot, 1000), teacher}, "=", sumTeacher).post();
teachersTimeslotList.add(sumTeacher);
}
}
for (int i = 0; i < teacheresId.length; i++) {
model.count(teacheresId[i], teachersList.toArray(new IntVar[teachersList.size()]), model.intVar(0, 12)).post();
}
model.allDifferent(teachersTimeslotList.toArray(new IntVar[teachersTimeslotList.size()]), "NEQS").post();我不知道这是否是一个优化的解决方案,但目前它正在为我工作,甚至通过编码来提高分辨率。谢谢!
https://stackoverflow.com/questions/41617919
复制相似问题