Download
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;