1

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

我正在使用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;

我想过为老师获取所有时间段,但是当我构建模型时,没有选择时间段,所以我得到了所有的可能性。

4

1 回答 1

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

我不知道这是否是一个优化的解决方案,但目前它对我有用,甚至解决时间也通过编码得到改善。谢谢!

于 2017-01-14T15:10:52.993 回答