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 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 | # Copyright 2010 Hakan Kjellerstrand hakank@gmail.com # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Traffic lights problem in Google CP Solver. CSPLib problem 16 http://www.cs.st-andrews.ac.uk/~ianm/CSPLib/prob/prob016/index.html ''' 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. ''' Note: In this model we use only the constraint solver.AllowedAssignments(). Compare with these models: * ECLiPSe : http://www.hakank.org/eclipse/traffic_lights.ecl * Gecode : http://hakank.org/gecode/traffic_lights.cpp * SICStus : http://hakank.org/sicstus/traffic_lights.pl This model was created by Hakan Kjellerstrand (hakank@gmail.com) Also see my other Google CP Solver models: http://www.hakank.org/google_or_tools/ """ import string, sys from constraint_solver import pywrapcp def main(base = 10 , start = 1 , len1 = 1 , len2 = 4 ): # Create the solver. solver = pywrapcp.Solver( 'Traffic lights' ) # # data # n = 4 r, ry, g, y = range (n) lights = [ "r" , "ry" , "g" , "y" ] # The allowed combinations allowed = pywrapcp.IntTupleSet( 4 ) allowed.InsertAll([(r,r,g,g), (ry,r,y,r), (g,g,r,r), (y,r,ry,r)]) # # declare variables # V = [solver.IntVar( 0 , n - 1 , 'V[%i]' % i) for i in range (n)] P = [solver.IntVar( 0 , n - 1 , 'P[%i]' % i) for i in range (n)] # # constraints # for i in range (n): for j in range (n): if j = = ( 1 + i) % n: solver.Add(solver.AllowedAssignments((V[i], P[i], V[j], P[j]), allowed)) # # Search and result # db = solver.Phase(V + P, solver.INT_VAR_SIMPLE, solver.INT_VALUE_DEFAULT) solver.NewSearch(db) num_solutions = 0 while solver.NextSolution(): for i in range (n): print "%+2s %+2s" % (lights[V[i].Value()], lights[P[i].Value()]), print num_solutions + = 1 solver.EndSearch() print print "num_solutions:" , num_solutions print "failures:" , solver.Failures() print "branches:" , solver.Branches() print "WallTime:" , solver.WallTime() print if __name__ = = '__main__' : main() |