/*
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];
}
|