/*
Model name : tripuzzle.mod
Author : M J Chlond
Description : tri-puzzle
Source : Lagoon Games
Date written : 27/8/05
*/
int trin = 16;
int posn = 16;
int orient = 3;
int spot = 3;
int color = 6;
range T = 1..trin;
range P = 1..posn;
range O = 1..orient;
range S = 1..spot;
int piece_col[P,O,S]=...;
dvar boolean x[T,P,O];
dvar int+ y[P,S];
minimize 0;
subject to {
// each position occupied by one triangle in one orientation
forall(j in P)
sum(i in T, k in O) x[i,j,k] == 1;
// each triangle in one position and one orientation
forall(i in T)
sum(j in P, k in O) x[i,j,k] == 1;
// spot colours consistent with piece positions and orientations
forall(i in T, j in P, k in O, m in S) {
y[j,m] >= piece_col[i,k,m] - color*(1-x[i,j,k]);
y[j,m] <= piece_col[i,k,m] + color*(1-x[i,j,k]);
}
// list of additional constraints
// color matches (outer)
y[1,1] == 2;
y[2,1] == 2;
y[5,1] == 3;
y[10,1] == 2;
y[1,2] == 6;
y[4,2] == 3;
y[9,2] == 1;
y[16,2] == 3;
y[10,3] == 5;
y[12,3] == 2;
y[14,3] == 1;
y[16,3] == 4;
// color matches (inner)
y[1,3] == y[3,1];
y[2,3] == y[6,1];
y[4,3] == y[8,1];
y[5,3] == y[11,1];
y[7,3] == y[13,1];
y[9,3] == y[15,1];
y[14,2] == y[15,3];
y[7,2] == y[8,3];
y[12,2] == y[13,3];
y[2,2] == y[3,3];
y[5,2] == y[6,3];
y[10,2] == y[11,3];
y[15,2] == y[16,1];
y[8,2] == y[9,1];
y[13,2] == y[14,1];
y[3,2] == y[4,1];
y[6,2] == y[7,1];
y[11,2] == y[12,1];
}
|