2017-01-12 34 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(); 

我不知道這是否是一個優化的解決方案,但現在它爲我工作,甚至通過編碼來改善解析時間。謝謝!