1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 | % % Traffic lights problem in MiniZinc. % % CSPLib problem 16 % """ % Specification: % Consider a four way traffic junction with eight traffic lights. Four of the traffic % lights are for the vehicles and can be represented by the variables V1 to V4 with domains % {r,ry,g,y} (for red, red-yellow, green and yellow). The other four traffic lights are % for the pedestrians and can be represented by the variables P1 to P4 with domains {r,g}. % % The constraints on these variables can be modelled by quaternary constraints on % (Vi, Pi, Vj, Pj ) for 1<=i<=4, j=(1+i)mod 4 which allow just the tuples % {(r,r,g,g), (ry,r,y,r), (g,g,r,r), (y,r,ry,r)}. % % It would be interesting to consider other types of junction (e.g. five roads % intersecting) as well as modelling the evolution over time of the traffic light sequence. % ... % % Results % Only 2^2 out of the 2^12 possible assignments are solutions. % % (V1,P1,V2,P2,V3,P3,V4,P4) = % {(r,r,g,g,r,r,g,g), (ry,r,y,r,ry,r,y,r), (g,g,r,r,g,g,r,r), (y,r,ry,r,y,r,ry,r)} % [(1,1,3,3,1,1,3,3), ( 2,1,4,1, 2,1,4,1), (3,3,1,1,3,3,1,1), (4,1, 2,1,4,1, 2,1)} % % % The problem has relative few constraints, but each is very tight. Local propagation % appears to be rather ineffective on this problem. % % """ % % Licenced under CC-BY-4.0 : http://creativecommons.org/licenses/by/4.0/ % % This MiniZinc model was created by Hakan Kjellerstrand, hakank@gmail.com % See also my MiniZinc page: http://www.hakank.org/minizinc % int : n = 4; int : r = 1; % red int : ry = 2; % red-yellow int : g = 3; % green int : y = 4; % yellow set of int : Cars = {r,ry,g,y}; set of int : Pedestrians = {r,g}; array [1..4, 1..4] of Cars: allowed; array [1..n] of var Cars: V; % ; array [1..n] of var Pedestrians: P; %; predicate cp1d( array [ int ] of var int : x, array [ int ] of var int : y) = assert ( index_set (x) = index_set (y), "cp1d: x and y have different sizes" , forall (i in index_set (x)) ( x[i] = y[i] )) ; % solve satisfy; solve :: int_search(V ++ P, first_fail, indomain_min, complete) satisfy ; constraint forall (i in 1..n, j in 1..n where j = (1+i) mod 4) ( exists (a in 1..4) ( cp1d([V[i], P[i], V[j], P[j]], [allowed[a,k] | k in 1..4]) ) ) ; allowed = array2d (1..4, 1..4, [ r,r,g,g, ry,r,y,r, g,g,r,r, y,r,ry,r ]); output [ show (V[i]) ++ " " ++ show (P[i]) ++ " " | i in 1..n ] ++ [ "\n" ]; |