# Code written by Andy Huchala # Computes a(n) for OEIS A352426 # (the maximal number of nonattacking # white-square queens on an n x n board) # Requires installing Gurobi # Select board size (n>1) n = 19 from gurobipy import * m = Model("ip") # initialize all variables of form x_j_i for i in range(n): for j in range(n): exec("x_" + str(j) + "_" + str(i)+" = m.addVar(lb=0,ub=1,vtype=GRB.INTEGER, name=\"x_" + str(j) + "_" + str(i) + "\")") # Set objective: minimize sum of x_i_j's t = "x_0_0" for j in range(n): for i in range(n): if i + j != 0: t += "+x_" + str(j) + "_" + str(i) exec("obj = " + t) m.setObjective(obj, GRB.MAXIMIZE) # specify constraints for j in range(n): for i in range(n): # black tile if (i+j)%2 != 0: # find all the locations from which (i,j) could be attacked, add each one to the constraint # for (i,j): (i,j) must be attacked or occupied s = "m.addGenConstrIndicator(" s += "x_" + str(j) + "_" + str(i) + ",1," for k in range(n): if k != j: s += "x_" + str(k) + "_" + str(i) + "+" if k != i: s += "x_" + str(j) + "_" + str(k) + "+" if i-j+k>=0 and i-j+k=0 and 2*i-(i-j+k)