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
$
$ Traffic lights problem in Essence'
$
$ 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.
$ """
$
$ This Essence' model was created by Hakan Kjellerstrand, hakank@gmail.com
$ See also my Essence' page: http://www.hakank.org/savile_row/
$
 
$ Licenced under CC-BY-4.0 : http://creativecommons.org/licenses/by/4.0/
 
language ESSENCE' 1.0
 
 
letting be 4
letting range be domain int(1..n)
 
letting be 1 $ red
letting ry be 2 $ red-yellow
letting be 3 $ green
letting be 4 $ yellow
 
letting allowed =
   [
     [r,r,g,g],
     [ry,r,y,r],
     [g,g,r,r],
     [y,r,ry,r]
   ]
 
letting Cars be domain int(r,ry,g,y)
letting Pedestrians be domain int(r,g)
 
$ decision variables
find V: matrix indexed by [range] of Cars
find P: matrix indexed by [range] of Pedestrians
 
such that
  forall i, j: range .
       (j = (1+i) % 4) => table([V[i], P[i], V[j], P[j]], allowed)