|
| 1 | +import cpmpy as cp |
| 2 | +from cpmpy.transformations.normalize import toplevel_list |
| 3 | +from ..answering_queries.constraint_oracle import ConstraintOracle |
| 4 | +from ..problem_instance import ProblemInstance, absvar |
| 5 | + |
| 6 | + |
| 7 | + |
| 8 | +def construct_nqueens_problem(n): |
| 9 | + |
| 10 | + parameters = {"n": n} |
| 11 | + |
| 12 | + queens = cp.intvar(1, n, shape=n, name="queens") |
| 13 | + |
| 14 | + # Model |
| 15 | + model = cp.Model() |
| 16 | + |
| 17 | + # Constraints list |
| 18 | + CT = [] |
| 19 | + |
| 20 | + CT += list(cp.AllDifferent(queens).decompose()) |
| 21 | + |
| 22 | + for i in range(n): |
| 23 | + for j in range(i + 1, n): # Compare each queen with every other queen once |
| 24 | + CT += [(queens[i] - i != queens[j] - j)] # Different major diagonals |
| 25 | + CT += [(queens[i] + i != queens[j] + j)] # Different minor diagonals |
| 26 | + |
| 27 | + |
| 28 | + # Add all collected constraints to the model |
| 29 | + model += CT |
| 30 | + |
| 31 | + C_T = toplevel_list(CT) |
| 32 | + |
| 33 | + AV = absvar(2) |
| 34 | + #lang = [AV[0] == AV[1], AV[0] != AV[1], AV[0] < AV[1], AV[0] > AV[1], AV[0] >= AV[1], AV[0] <= AV[1]] + |
| 35 | + lang = [AV[0] - AV[1] == constant for constant in range(-n, 2*n)] + [AV[0] - AV[1] != constant for constant in range(-n, 2*n)] |
| 36 | + |
| 37 | + instance = ProblemInstance(variables=queens, params=parameters, language=lang, name="nqueens") |
| 38 | + |
| 39 | + oracle = ConstraintOracle(list(set(toplevel_list(C_T)))) |
| 40 | + |
| 41 | + print("oracle constraints: ", len(oracle.constraints)) |
| 42 | + for c in oracle.constraints: |
| 43 | + print(c) |
| 44 | + |
| 45 | + input("Press Enter to continue...") |
| 46 | + |
| 47 | + return instance, oracle |
0 commit comments