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 87 88 89 90 91 92 93 94 95 96 97 98 99 100 | /* Traffic lights problem in Comet. 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. """ Compare with the MiniZinc model http://www.hakank.org/minizinc/traffic_lights.mzn This Comet model was created by Hakan Kjellerstrand (hakank@gmail.com) Also, see my Comet page: http://www.hakank.org/comet */ // Licenced under CC-BY-4.0 : http://creativecommons.org/licenses/by/4.0/ import cotfd; int t0 = System.getCPUTime(); int n = 4; int r = 1; // red int ry = 2; // red-yellow int g = 3; // green int y = 4; // yellow int allowed[1..n, 1..n] = [ [r,r,g,g], [ry,r,y,r], [g,g,r,r], [y,r,ry,r] ]; Solver<CP> m(); var <CP>{ int } V[1..n](m, 1..n); var <CP>{ int } P[1..n](m, 1..n); Integer num_solutions(0); // explore<m> { exploreall <m> { // TODO: * using table/FunctionTable? forall (i in 1..n, j in 1..n : j == (1+i) % n) { var <CP>{ int } a(m, 1..n); m.post(V[i] == allowed[a,1]); m.post(P[i] == allowed[a,2]); m.post(V[j] == allowed[a,3]); m.post(P[j] == allowed[a,4]); } } using { labelFF(m); num_solutions := num_solutions + 1; forall (i in 1..4) cout << V[i] << " " << P[i] << " " ; cout << endl; } cout << "\nnum_solutions: " << num_solutions << endl; int t1 = System.getCPUTime(); cout << "time: " << (t1-t0) << endl; cout << "#choices = " << m.getNChoice() << endl; cout << "#fail = " << m.getNFail() << endl; cout << "#propag = " << m.getNPropag() << endl; |