限制分配值 - Choco

时间:2017-01-12 16:10:33

标签: java constraints 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 :(得分: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();

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