Pour que tes sumColumns soient tous différents, il faut déjà que leur valeur soit en bijection avec ton tableau x, ce qui n'est pas le cas avec une inégalité comme tu l'écris. Si je prends ton modèle du début et que je le lance, j'obtiens cette solution (après une overdose de caféine le tant qu'Eclipse se charge…) :
x = [[1 0 1 0 0 1 1 0]
[0 1 0 1 1 0 1 0]
[0 0 1 1 0 1 1 0]
[1 0 0 1 0 1 1 0]
[0 0 1 0 1 1 1 0]
[0 0 1 1 0 1 1 0]
[1 1 0 1 0 0 1 0]
[1 1 0 0 0 1 0 1]];
sumColumns = [4 1 3 5 2 6 7 0];
La contrainte allDifferent est bien respectée, mais les valeurs de sumColumns n'ont rien à voir avec le contenu du tableau : sur la dernière colonne, les éléments ont une somme de 1, pas 0… Au contraire, si je mets une égalité :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| using CP;
int N = 8;
dvar int x[0..N-1][0..N-1] in 0..1;
dvar int+ sumColumns[0..N-1];
subject to{
forall(i in 1..N-1){
sum(j in 0..N-1) x[i][j] == sum(j in 0..N-1) x[i-1][j];
}
forall(j2 in 0..N-1){
sumColumns[j2] == sum(i2 in 0..N-1) x[i2][j2];
}
allDifferent(sumColumns);
} |
alors la solution a du sens (chaque ligne a une somme de 4) :
x = [[0 1 0 0 1 1 0 1]
[0 1 0 0 1 1 0 1]
[0 1 0 0 1 1 0 1]
[0 0 0 1 1 1 0 1]
[0 1 1 0 1 1 0 0]
[0 0 0 1 1 1 0 1]
[0 1 0 1 1 0 0 1]
[0 0 1 0 1 0 1 1]];
sumColumns = [0 5 2 3 8 6 1 7];
Sinon, pour améliorer la performance de ton modèle à plus grande échelle, je pense qu'il faut réécrire ta contrainte d'égalité sur les lignes, avec une nouvelle variable sl (mais je suis plus habitué aux formulations MILP que CP…) :
Partager