this repo has no description
1/*** 2!Test 3solvers: [gecode, chuffed] # Too slow on cbc 4expected: 5- !Result 6 solution: !Solution 7 p: [1, 9, 5, 16, 3, 7, 15, 2, 10, 6, 17, 30, 34, 26, 13, 21, 32, 19, 8, 4, 12, 23, 36, 28, 20, 31, 27, 35, 24, 11, 22, 18, 29, 33, 25, 14] 8***/ 9 10% knights.mzn 11% Ralph Becket 12% vim: ft=zinc ts=4 sw=4 et 13% Tue Aug 26 14:24:28 EST 2008 14% 15% Find a closed knight's tour of a chessboard (every square is visited exactly 16% once, the tour forms a loop). 17 18include "globals.mzn"; 19 20 % n is the length of side of the chessboard. 21 % 22int: n = 6; 23 24 % The ith square (r, c) on the path is given by p[i] = (r - 1) * n + c. 25 % 26int: nn = n * n; 27set of int: sq = 1..nn; 28array [sq] of var sq: p; 29 30set of int: row = 1..n; 31set of int: col = 1..n; 32 33 % Break some symmetry by specifying the first and last moves. 34 % 35constraint p[1] = 1; 36constraint p[2] = n + 3; 37constraint p[nn] = 2 * n + 2; 38 39 % All points along the path must be unique. 40 % 41constraint alldifferent(p); 42 43array [sq] of set of sq: neighbours = 44 [ { n * (R - 1) + C 45 | 46 i in 1..8, 47 R in {R0 + [-1, -2, -2, -1, 1, 2, 2, 1][i]}, 48 C in {C0 + [-2, -1, 1, 2, 2, 1, -1, -2][i]} 49 where R in row /\ C in col 50 } 51 | R0 in row, C0 in col 52 ]; 53 54constraint forall (i in sq where i > 1) (p[i] in neighbours[p[i - 1]]); 55 56solve 57 :: int_search( 58 p, 59 input_order, 60 indomain_min, 61 complete 62 ) 63 satisfy; 64% It has been observed that Warnsdorf's heuristic of choosing the next 65% square as the one with the fewest remaining neighbours leads almost 66% directly to a solution. How might we express this in MiniZinc? 67 68output ["p = " ++ show(p) ++ ";\n"]; 69 70% Invert the path to show the tour. 71% 72% array [sq] of var sq: q; 73% 74% constraint forall (i in sq) (q[p[i]] = i); 75% 76% output [ show(q[i]) ++ if i mod n = 0 then "\n" else " " endif 77% | i in sq 78% ] ++ 79% [ "\n" 80% ]; 81