matrix2.py


matrix2.py


#!/usr/bin/env python3.7 # Copyright 2021, Gurobi Optimization, LLC # This example uses the Python matrix API to formulate the n-queens # problem; it maximizes the number queens placed on an n x n # chessboard without threatening each other. # # This example demonstrates NumPy slicing. import numpy as np import scipy.sparse as sp import gurobipy as gp from gurobipy import GRB # Size of the n x n chess board n = 8 try: # Create a new model m = gp.Model("matrix2") # Create a 2-D array of binary variables # x[i,j]=1 means that a queen is placed at square (i,j) x = m.addMVar((n, n), vtype=GRB.BINARY, name="x") # Set objective - maximize number of queens m.setObjective(x.sum(), GRB.MAXIMIZE) # Add row and column constraints for i in range(n): # At most one queen per row m.addConstr(x[i, :].sum() <= 1, name="row"+str(i)) # At most one queen per column m.addConstr(x[:, i].sum() <= 1, name="col"+str(i)) # Add diagonal constraints for i in range(1, 2*n): # At most one queen per diagonal diagn = (range(max(0, i-n), min(n, i)), range(min(n, i)-1, max(0, i-n)-1, -1)) m.addConstr(x[diagn].sum() <= 1, name="diag"+str(i)) # At most one queen per anti-diagonal adiagn = (range(max(0, i-n), min(n, i)), range(max(0, n-i), min(n, 2*n-i))) m.addConstr(x[adiagn].sum() <= 1, name="adiag"+str(i)) # Optimize model m.optimize() print(x.X) print('Queens placed: %g' % m.ObjVal) except gp.GurobiError as e: print('Error code ' + str(e.errno) + ": " + str(e)) except AttributeError: print('Encountered an attribute error')