我試圖模擬一個網球調度問題,因爲我在這個post解釋。我很幸運地得到了方程式的答案,這些方程式描述了允許我在Choco中實現它的問題,並且它看起來很好。如何在喬科(CSP)定義產品
那麼我將要解釋的是關於前一後的回答實施的產品。
基本上我將最終具有2三維矩陣和1兩維之一,描述如下:
// Matches schedule
// i -> players, j-> courts, k -> timeslots
// x[i][j][k] holds a value 0..1 where 0 means the player doesn't play in court_j in the timeslot_k, and 1 the opposite
IntVar[][][] x;
// Beginning of all matches
// i -> players, j-> courts, k -> timeslots
// g[i][j][k] holds a value 0..1 where 0 means the player doesn't play in court_j in the timeslot_k, and 1 the opposite
// Basically the same matrix as the previous one but it only holds the first timeslot of a match
IntVar[][][] g;
// Occupied courts
// i-> courts, j-> timeslots
// crt[i][j] holds a value 0..1 where 0 means the court_i is occupied in the timeslot_j, and 1 means the opposite
IntVar[][] crt;
通過這種方法,該調度矩陣映射到約束遊戲開始矩陣長相像這樣:
for (int p = 0; p < nPlayers; p++) {
for (int c = 0; c < nCourts; c++) {
for (int t = 0; t < nTimeslots - nTimeslotsPerMatch; t++) {
if (nTimeslotsPerMatch == 1)
solver.post(IntConstraintFactory.arithm(g[p][c][t], "=", x[p][c][t]));
else
solver.post(IntConstraintFactory.times(x[p][c][t], x[p][c][t + 1], g[p][c][t]));
}
if (nTimeslotsPerMatch == 1)
solver.post(IntConstraintFactory.arithm(g[p][c][nTimeslots - 1], "=", x[p][c][nTimeslots - 1]));
else
for (int i = 0; i < nTimeslotsPerMatch - 1; i++)
solver.post(IntConstraintFactory.arithm(g[p][c][nTimeslots - i - 1], "=", 0));
}
}
它使用times
約束招映射x[p][c][t]
和x[p][c][t + 1]
到g[p][c][t]
。
然而,該定義考慮每個已匹配的2個時隙的固定持續時間。我想改變它,以便持續時間可變。
但是,如果我想要有一個變量匹配持續時間,我將不得不映射x
中的兩個以上的值來定義g
中的值。例如,如果比賽持續時間爲3個插槽,以map g[p][c][t]
我需要做x[p][c][t] * x[p][c][t + 1] * x[p][c][t + 2]
但我不能做到這一點與times
或以類似的方式它被現在進行。
所以我的問題是,因爲是在喬科約束稱爲sum
在那裏你可以確保一組值的總和等於價值,是有一個定義產品這組值的?如果沒有,我該怎麼做?
基本上我實現做的是:
g[i][j][k] = x[i][j][k] + x[i][j][k + 1] * x[i][j][k + 2] * x[i][j][k + 3] * ... * x[i][j][nTimeslotsPerMatch - 1]
你能告訴我在一個小樣本代碼怎麼做我想用'和'和'minimum'?我只是不知道如何。此外,BoolVars的問題在於,在另一部分問題中,我需要將這些矩陣變成IntVars,因爲我需要計算每個球員進場的球場數量,並添加一個約束條件以匹配每個球員所需的比賽數量必須發揮。那麼我怎麼能做到這兩件事?無論如何,我仍然想知道如何做產品。 – dabadaba
爲了得到BX等於B1 * B2 * B3一個BoolVar: solver.post(最小(BX,新BoolVar [] {B1,B2,B3})); –
如果域爲0/1,那麼無論您將它們存儲到BoolVar矩陣還是IntVar矩陣中,都將是BoolVar對象,因此我建議將矩陣的類型設置爲BoolVar [] []。由於任何BoolVar都是IntVar,你不應該有問題。如果是這樣,請確定哪個指令不起作用。 –