gpt4 book ai didi

python - 尝试用 cvxpy 解决数独问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:57:34 27 4
gpt4 key购买 nike

我正在尝试使用 cvxpy 优化包解决数独问题。我对优化和 cvxpy 都很陌生。

约束是:

  1. 所有的值都在1到9之间
  2. 所有行的总和 = 45
  3. 所有列的总和 = 45
  4. 所有平方和 = 45
  5. 给定的数字(我正在尝试解决 17 条线索的数独问题)。

所以,这是我的代码:

from cvxpy import *
import numpy as np

x = Variable((9, 9), integer=True)
obj = Minimize(sum(x)) #whatever, if the constrains are fulfilled it will be fine
const = [x >= 1, #all values should be >= 1
x <= 9, #all values should be <= 9
sum(x, axis=0) == 45, # sum of all rows should be 45
sum(x, axis=1) == 45, # sum of all cols should be 45
sum(x[0:3, 0:3]) == 45, sum(x[0:3, 3:6]) == 45, #sum of all squares should be 45
sum(x[0:3, 6:9]) == 45,
sum(x[3:6, 0:3]) == 45, sum(x[3:6, 3:6]) == 45,
sum(x[3:6, 6:9]) == 45,
sum(x[6:9, 0:3]) == 45, sum(x[6:9, 3:6]) == 45,
sum(x[6:9, 6:9]) == 45,
x[0, 7] == 7, #the values themselves
x[0, 8] == 1,
x[1, 1] == 6,
x[1, 4] == 3,
x[2, 4] == 2,
x[3, 0] == 7,
x[3, 4] == 6,
x[3, 6] == 3,
x[4, 0] == 4,
x[4, 6] == 2,
x[5, 0] == 1,
x[5, 3] == 4,
x[6, 3] == 7,
x[6, 5] == 5,
x[6, 7] == 8,
x[7, 1] == 2,
x[8, 3] == 1]

prob = Problem(objective=obj, constraints=const)
prob.solve()

我从cvxpy得到的是

prob.status
Out[2]: 'infeasible_inaccurate'

这肯定是一个有效的数独,我检查了数百万次。

为什么我没有得到答案?

任何帮助将不胜感激!

最佳答案

这是您默认使用的 ECOS_BB 问题。它不是一个可靠的整数规划求解器,我建议不要使用它。

其他建议:不要使用import *。最好使用 import cvxpy as cp 以避免与其他同名函数混淆。另外,这里不需要 numpy。

以下脚本用GUROBI返回一个可行解(如果没有GUROBI许可证也可以使用GLPK):

import cvxpy as cp

x = cp.Variable((9, 9), integer=True)

# whatever, if the constrains are fulfilled it will be fine
objective = cp.Minimize(cp.sum(x))
constraints = [x >= 1, # all values should be >= 1
x <= 9, # all values should be <= 9
cp.sum(x, axis=0) == 45, # sum of all rows should be 45
cp.sum(x, axis=1) == 45, # sum of all cols should be 45
# sum of all squares should be 45
cp.sum(x[0:3, 0:3]) == 45, cp.sum(x[0:3, 3:6]) == 45,
cp.sum(x[0:3, 6:9]) == 45,
cp.sum(x[3:6, 0:3]) == 45, cp.sum(x[3:6, 3:6]) == 45,
cp.sum(x[3:6, 6:9]) == 45,
cp.sum(x[6:9, 0:3]) == 45, cp.sum(x[6:9, 3:6]) == 45,
cp.sum(x[6:9, 6:9]) == 45,
x[0, 7] == 7, # the values themselves
x[0, 8] == 1,
x[1, 1] == 6,
x[1, 4] == 3,
x[2, 4] == 2,
x[3, 0] == 7,
x[3, 4] == 6,
x[3, 6] == 3,
x[4, 0] == 4,
x[4, 6] == 2,
x[5, 0] == 1,
x[5, 3] == 4,
x[6, 3] == 7,
x[6, 5] == 5,
x[6, 7] == 8,
x[7, 1] == 2,
x[8, 3] == 1]

prob = cp.Problem(objective, constraints)
prob.solve(solver=cp.GUROBI)

print(x.value)

这就是输出

In [2]: run sudoku.py
[[1. 6. 1. 4. 7. 9. 9. 7. 1.]
[6. 6. 1. 1. 3. 9. 9. 9. 1.]
[8. 7. 9. 1. 2. 9. 1. 7. 1.]
[7. 7. 1. 9. 6. 1. 3. 2. 9.]
[4. 9. 5. 9. 5. 1. 2. 1. 9.]
[1. 2. 9. 4. 9. 1. 9. 1. 9.]
[8. 1. 1. 7. 8. 5. 2. 8. 5.]
[9. 2. 9. 9. 4. 1. 1. 1. 9.]
[1. 5. 9. 1. 1. 9. 9. 9. 1.]]

关于python - 尝试用 cvxpy 解决数独问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54679188/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com