首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >限制赋值- Choco

限制赋值- Choco
EN

Stack Overflow用户
提问于 2017-01-12 16:10:32
回答 1查看 128关注 0票数 1

是否有办法限制变量的特定值的赋值数量?

我正在用Choco [4.0.1]编写一个带有课程、教师和时隙的时间表问题。同一个老师可以教很多课程,我需要确定他/她可以教的课程的数量。我在考虑计算时隙的数量,比如B老师可以工作12 hours (12 timeslots),所以我可以发布一个像arithm()这样的约束来确保这一点。有什么想法吗?

更新的

以下是一些代码:

代码语言:javascript
复制
IntVar [] teachers;
IntVar [][] teacherTimeslots;
IntVar [] courses;

每门课程都有一个教师和N时间序列,所以A老师可以教{1,2,3,4}和B老师{3,4,5},每门课程每周有4个小时。现在假设A可以工作12个小时。我希望A只教12小时(3门课程),而B只教剩下的课程;

我不能说一个老师有多少门课,但他/她能教多少门课,所以我在用

代码语言:javascript
复制
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()来保持每个教师时隙的独特性。

我的课程是固定的

代码语言:javascript
复制
course[0] = 1;
...
course[4] = 5;

我曾想过要为一位老师弄到所有的时隙,但是当我建立我的模型时,没有选择时隙,所以我得到了所有的可能性。

EN

回答 1

Stack Overflow用户

发布于 2017-01-14 15:10:52

这是我的解决方案。我创建了一个Timeslot类来表示一个讲座,其中包括1名教师、1门课程、m机房和n时隙(m=n),因此在我的模型中,所有课程都有一个timeslot对象集合。我用model.count(...)来检查有多少个时隙有一个老师,我把零作为下界,因为一个老师可以被选择或者不可以选择,并且是上界的12倍。

代码语言:javascript
复制
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();

我不知道这是否是一个优化的解决方案,但目前它正在为我工作,甚至通过编码来提高分辨率。谢谢!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41617919

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档