有没有办法限制特定变量值的分配数量?
我正在使用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;
我考虑过为老师准备所有时间段,但是当我正在构建我的模型时,没有选择时间段,所以我得到了所有可能性。
答案 0 :(得分:0)
嗯,这是我的解决方案。我创建了一个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();
我不知道这是否是一个优化的解决方案,但目前它正在为我工作,甚至通过编码来改善解决时间。谢谢!