/*
Model name : gunport1.mod
Description : solves Gunport puzzles - modified
Source : Martin Gardner
Date written : 3/2/06
Written by : Martin Chlond, Lancashire Business School
Email : mchlond@uclan.ac.uk
*/
int m = 4;
int n = 4;
int p = 8;
range M = 1..m;
range N = 1..n;
range P = 1..p;
dvar boolean x[M,N,P];
dvar boolean d[P];
minimize sum(k in P) d[k];
subject to {
/* each domino in adjacent cells */
forall(i in M,j in N,k in P)
sum(l in j-1..j+1 : l >= 1 && l <= n && l != j) x[i,l,k]+
sum(l in i-1..i+1 : l >= 1 && l <= m && l != i) x[l,j,k] >= x[i,j,k];
/* each domino covers two cells */
forall(k in P) sum(i in M,j in N) x[i,j,k] == 2*d[k];
/* each cell covered by, at most, one domino */
forall(i in M,j in N) sum(k in P) x[i,j,k] <= 1;
/* no two adjacent cells vacant (rows) */
forall(i in M,j in 1..n-1) sum(c in j..j+1,k in P) x[i,c,k] >= 1;
/* no two adjacent cells vacant (columns) */
forall(i in 1..m-1,j in N) sum(r in i..i+1,k in P) x[r,j,k] >= 1;
}
execute {
/* format and display output */
for(i in M) {
for(j in N) {
rt = 0;
for(k in P) {
rt = rt+k*x[i][j][k];
}
write(rt);
write(" ");
}
writeln();
}
}
|