Volume 7, Number 1, September 2006
alien.mod
 
/*
 Model name   : alien.mod
 Description  : solves Alien tiles puzzles
 Source       : www.pickover.com - Clifford Pickover 
 Date written : 14/6/06
 Written by   : Martin Chlond, Lancashire Business School
 Email        : mchlond@uclan.ac.uk
*/
 
int   n = 7; 
int   fhr;
int   shr;
range  N = 1..n;

// start position
int  s[N,N] = [ [0,0,0,0,0,0,0],
                [0,0,0,0,0,0,0],
                [0,0,0,0,0,0,0],
                [0,0,0,0,0,0,0],
                [0,0,0,0,0,0,0],
                [0,0,0,0,0,0,0],
                [0,0,0,0,0,0,0]];
                
// target position                               
int  t[N,N] = [ [0,0,0,1,0,0,0],
                [0,0,1,1,1,0,0],
                [0,1,1,1,1,1,0],
                [1,1,1,1,1,1,1],
                [0,1,1,1,1,1,0],
                [0,0,1,1,1,0,0],
                [0,0,0,1,0,0,0]];               

dvar int+  x[N,N] in 0..3;

dvar int+  d[N,N] in 0..10;

execute {
   /* compute ranges for symmetry constraints */
  fhr = Math.floor(n/2);
  if (n % 2 == 0) 
    shr = fhr+1;
  else
    shr = fhr+2;  
}
  
minimize sum(i in N,j in N) x[i][j];

subject to {
  forall(i,j in N) 
    sum(l in N) x[i][l] + sum(k in N : k != i) x[k][j] == 4*d[i][j]+t[i][j]-s[i][j];
   
  /* eliminate symmetries */
  sum( i in 1..fhr, j in N) x[i,j] 
    <= sum( i in shr..n, j in N) x[i,j];
  sum( i in N, j in 1..fhr) x[i,j]
    <= sum( i in N, j in shr..n) x[i,j];
}