2017-01-12 37 views
1

有没有办法限制某个变量的特定值的赋值次数?限制赋值 - Choco

我正在写课程问题,使用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; 

我想过让所有时隙的老师,但是当我建立我的模型是没有选择的时隙,所以我让所有的可能性。

+1

你可以与我们分享任何代码吗?如果没有,那么你的问题可能太宽泛,你应该先尝试一些事情。 –

+0

只需将课程分配到每个时间段,并且如果之前分配的任何内容相应地执行,即每个时间段和教师只允许一个课程,那么您应该很好。 – Thomas

+0

@TimBiegeleisen我已经在我的问题上放了一些代码,你可以看看吗? –

回答

0

那么,这是我的解决方案。我创建了一个Timeslot课程来表示一个讲座,包含1位老师,1个课程,m间和n位置(m=n),所以在我的模型中,所有课程都有一个timeslot对象的集合。我用model.count(...)来检查老师有多少个时隙,我把零作为下限,因为老师可以选择或不选择,而上限是十二倍。

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(); 

我不知道这是否是一个优化的解决方案,但现在它为我工作,甚至通过编码来改善解析时间。谢谢!