fromgurobipyimport*importosn=8x={}model=Model()foriinrange(n):forjinrange(n):x[i+1,j+1]=model.addVar(vtype=GRB.BINARY,obj=1,name="x_{}{}".format(i+1,j+1))model.update()model.addConstr(quicksum(x[i+1,j+1]foriinrange(n)forjinrange(n))==n)foriinrange(n):model.addConstr(quicksum(x[i+1,j+1]forjinrange(n))<=1)forjinrange(n):model.addConstr(quicksum(x[i+1,j+1]foriinrange(n))<=1)forkinrange(1-n,n):model.addConstr(quicksum(x[i+1,j+1]foriinrange(n)forjinrange(n)ifi-j==k)<=1)forlinrange(0,2*n-1):model.addConstr(quicksum(x[i+1,j+1]foriinrange(n)forjinrange(n)ifi+j==l)<=1)# Gurobi Settingsmodel.params.LogToConsole=0# Quiet Gurobimodel.params.PoolSearchMode=2# Force Gurobi to search for multiple optimal solutionsmodel.params.PoolSolutions=10**8# Store max 10**8 Solutions in the solution poolmodel.params.PoolGap=0# All Solutions in the pool have 0 % Gap = optimal solutionsmodel.optimize()print(x)print(f"For n = {n} there are {model.SolCount} possible solutions")# if model.status == GRB.status.OPTIMAL:# model.write("Queens.lp")# os.system("imshow Queens.lp")# model.write("Queens.sol")# os.system("imshow Queens.sol")# elif model.status == GRB.status.INFEASIBLE:# model.computeIIS() # IIS tells you which constraints, when removed, makes the model feasible# model.write('inf.ilp')
Solution 2 Fastest Solution can handle large values of n
importgurobipyasgpfromgurobipyimportGRBn=8# Size of the chessboard# Create a Gurobi modelmodel=gp.Model("nqueens")# Define binary decision variablesx=model.addMVar((n,n),vtype=GRB.BINARY,name="x")# At most one queen per row; this adds n linear constraintsmodel.addConstr(x.sum(axis=1)<=1,name="row_constraints")# At most one queen per column; this adds n linear constraintsmodel.addConstr(x.sum(axis=0)<=1,name="col_constraints")# At most one queen on each diagonalforiinrange(-n+1,n):# At most one queen on diagonal imodel.addConstr(x.diagonal(i).sum()<=1,name=f"diag_pos_{i}")foriinrange(-n+1,n):# At most one queen on anti-diagonal imodel.addConstr(x[:,::-1].diagonal(i).sum()<=1,name=f"diag_neg_{i}")# Objective function (maximize number of queens placed)model.setObjective(x.sum(),GRB.MAXIMIZE)# Solve the modelmodel.optimize()# Print the solutionifmodel.status==GRB.OPTIMAL:print("Solution found:")print("Board View")print(x.X)print(f"Queens position on board:")foriinrange(n):forjinrange(n):ifx[i,j].X>0.5:print(f"({i+1}, {j+1})")else:print("No solution found.")