Volume 6, Number 2, January 2006
gunport1.mod
 
 
/* 
 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();
  }

}