Skip to content

Commit 0a1bc9b

Browse files
committed
nqueens
1 parent 80341a2 commit 0a1bc9b

File tree

2 files changed

+48
-1
lines changed

2 files changed

+48
-1
lines changed

pycona/benchmarks/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,4 @@
55
from .job_shop_scheduling import construct_job_shop_scheduling_problem
66
from .nurse_rostering import construct_nurse_rostering
77
from .zebra import construct_zebra_problem
8-
8+
from .nqueens import construct_nqueens_problem

pycona/benchmarks/nqueens.py

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
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

Comments
 (0)