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 | # 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. """ Magic squares in Google CP Solver. Magic square problem. 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(n = 4 ): # Create the solver. solver = pywrapcp.Solver( 'n-queens' ) # # data # # # declare variables # x = {} for i in range (n): for j in range (n): x[(i, j)] = solver.IntVar( 1 , n * n, 'x(%i,%i)' % (i, j)) x_flat = [x[(i,j)] for i in range (n) for j in range (n)] # the sum # s = ( n * (n*n + 1)) / 2 s = solver.IntVar( 1 , n * n * n, 's' ) # # constraints # # solver.Add(s == ( n * (n*n + 1)) / 2) solver.Add(solver.AllDifferent(x_flat)) [solver.Add(solver. Sum ([x[(i,j)] for j in range (n)]) = = s) for i in range (n)] [solver.Add(solver. Sum ([x[(i,j)] for i in range (n)]) = = s) for j in range (n)] solver.Add(solver. Sum ([ x[(i,i)] for i in range (n)]) = = s) # diag 1 solver.Add(solver. Sum ([ x[(i,n - i - 1 )] for i in range (n)]) = = s) # diag 2 # symmetry breaking # solver.Add(x[(0,0)] == 1) # # solution and search # solution = solver.Assignment() solution.Add(x_flat) solution.Add(s) # db: DecisionBuilder db = solver.Phase(x_flat, #solver.INT_VAR_DEFAULT, solver.CHOOSE_FIRST_UNBOUND, #solver.CHOOSE_MIN_SIZE_LOWEST_MAX, solver.ASSIGN_CENTER_VALUE #solver.ASSIGN_MIN_VALUE ) solver.NewSearch(db) num_solutions = 0 while solver.NextSolution(): print "s:" , s.Value() for i in range (n): for j in range (n): print "%2i" % x[(i,j)].Value(), print print num_solutions + = 1 solver.EndSearch() print print "num_solutions:" , num_solutions print "failures:" , solver.Failures() print "branches:" , solver.Branches() print "WallTime:" , solver.WallTime() n = 4 if __name__ = = '__main__' : if len (sys.argv) > 1 : n = string.atoi(sys.argv[ 1 ]) main(n) |