coin-or / python-mip

Python-MIP: collection of Python tools for the modeling and solution of Mixed-Integer Linear programs
Eclipse Public License 2.0
540 stars 95 forks source link

Incorrect n-Queens Constraints? #344

Open EthanJamesLew opened 1 year ago

EthanJamesLew commented 1 year ago

Describe the bug I was able to get the solution [[0 0 Q 0] [0 Q 0 0] [0 0 0 Q] [Q 0 0 0]] For a 4x4 4-Queens problem. I believe this is because the "diagonal /" constraints are slightly off.

I believe the correct code is

diff --git a/benchmarks/queens-pulp.py b/benchmarks/queens-pulp.py
index 0768dbf..f6d5323 100644
--- a/benchmarks/queens-pulp.py
+++ b/benchmarks/queens-pulp.py
@@ -45,7 +45,7 @@ def gen_model(n):
                         if i - j == k) <= 1, 'diag1({})'.format(p)

     # diagonal /
-    for p, k in enumerate(range(3, n + n)):
+    for p, k in enumerate(range(1, n + n - 2)):
         queens += lpSum(x[i][j] for i in range(n) for j in range(n)
                         if i + j == k) <= 1, 'diag2({})'.format(p)

At least, this seemed to produce correct solutions to me.

To Reproduce Solve the n-Queens problem with PuLP and the example will be present in the solutions.

Expected behavior I was expecting no queens to share diagonals, like [[0 Q 0 0] [0 0 0 Q] [Q 0 0 0] [0 0 Q 0]]

Desktop (please complete the following information):

Additional context I was looking for a PuLP n-Queens problem to test my SMT solvers backend.

sebheger commented 1 year ago

@EthanJamesLew more than happy if you do a PR with the corrected test and ideally an additional assertation for the solution