Volume 6, Number 1, September 2005
tripuzzle.mod
 
/* 
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];  
}