Я пытаюсь решить проблему CSP для ортогонального латинского квадрата с помощью minizinc. Это мой код:
array[1..n,1..n] of var 1..n: mat1;
array[1..n,1..n] of var 1..n: mat2;
constraint forall(i in 1..n)(alldifferent([mat1[i,j] | j in 1..n]));
constraint forall(j in 1..n)(alldifferent([mat1[i,j] | i in 1..n]));
constraint forall(i in 1..n)(alldifferent([mat2[i,j] | j in 1..n]));
constraint forall(j in 1..n)(alldifferent([mat2[i,j] | i in 1..n]));
constraint forall(i,j in 1..n)(forall(l,k in 1..n)(alldifferent([union([mat1[i,j],mat2[i,j]),union(mat1[l,k],mat2[l,k])])));
solve satisfy;
код действительно генерирует два латинских квадрата, но для того, чтобы сделать их ортогональными, в этой строке:
constraint forall(i,j in 1..n)(forall(l,k in 1..n)(alldifferent([union([mat1[i,j],mat2[i,j]),union(mat1[l,k],mat2[l,k])])));
Мне нужно написать ограничение, которое гарантирует, что не будет двух пар, таких как [mat1(i,j),mat2(i,j)]
и [mat1(m,n),mat2(m,n)]
, которые для m!=i
и n!=j
эти пары не должны быть равными. но код, содержащий union
, не работает должным образом (или даже вызывает ошибки). Интересно, может ли кто-нибудь помочь мне с кодом этого последнего ограничения в minizinc. Спасибо