Python 使用约束库的跨世界谜题求解器
我有一个问题要解决,如图所示。我已经尝试了下面给出的代码Python 使用约束库的跨世界谜题求解器,python,constraint-programming,Python,Constraint Programming,我有一个问题要解决,如图所示。我已经尝试了下面给出的代码 # -*- coding: utf-8 -*- """ Spyder Editor This is a temporary script file. """ from constraint import * problem = Problem() problem.addVariable('oneACROSS',['HOSES','LASER','SAILS','SHEET','STEER']) problem.addVari
# -*- coding: utf-8 -*-
"""
Spyder Editor
This is a temporary script file.
"""
from constraint import *
problem = Problem()
problem.addVariable('oneACROSS',['HOSES','LASER','SAILS','SHEET','STEER'])
problem.addVariable('fourACROSS',['HEEL','HIKE','KEEL','KNOT','LINE'])
problem.addVariable('sevenACROSS',['AFT','ALE','EEL','LEE','TIE'])
problem.addVariable('eightACROSS',['HOSES','LASER','SAILS','SHEET','STEER'])
problem.addVariable('twoDOWN', ['HOSES','LASER','SAILS','SHEET','STEER'])
problem.addVariable('threeDOWN', ['HOSES','LASER','SAILS','SHEET','STEER'])
problem.addVariable('fiveDOWN',['HEEL','HIKE','KEEL','KNOT','LINE'])
problem.addVariable('sixDOWN',['AFT','ALE','EEL','LEE','TIE'])
problem.addConstraint(lambda oneACROSS,twoDOWN : oneACROSS[3]==twoDOWN[1])
problem.addConstraint(lambda oneACROSS,threeDOWN : oneACROSS[5]==threeDOWN[1])
problem.addConstraint(lambda fourACROSS,twoDOWN : fourACROSS[2]==twoDOWN[3])
problem.addConstraint(lambda fourACROSS,fiveDOWN : fourACROSS[3]==fiveDOWN[1])
problem.addConstraint(lambda threeDOWN,fourACROSS : fourACROSS[4]==threeDOWN[3])
problem.addConstraint(lambda twoDOWN,sevenACROSS : sevenACROSS[1]==twoDOWN[4])
problem.addConstraint(lambda sevenACROSS,fiveDOWN : sevenACROSS[2]==fiveDOWN[2])
problem.addConstraint(lambda threeDOWN,sevenACROSS : sevenACROSS[3]==threeDOWN[4])
problem.addConstraint(lambda sixDOWN,eightACROSS : eightACROSS[1]==sixDOWN[2])
problem.addConstraint(lambda twoDOWN,eightACROSS : eightACROSS[3]==twoDOWN[5])
problem.addConstraint(lambda fiveDOWN,eightACROSS : eightACROSS[4]==fiveDOWN[3])
problem.addConstraint(lambda threeDOWN,eightACROSS : eightACROSS[5]==threeDOWN[5])
solution=problem.getSolutions()
print(solution)
但它给了我这个错误
运行文件('C:/Users/aliya/.spyder-py3/temp.py',wdir='C:/Users/aliya/.spyder-py3')
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
运行文件('C:/Users/aliya/.spyder-py3/temp.py',wdir='C:/Users/aliya/.spyder-py3')
文件“C:\ProgramData\Anaconda3\lib\site packages\spyder\u kernels\customize\spyderrcustomize.py”,第668行,在runfile中
execfile(文件名、命名空间)
文件“C:\ProgramData\Anaconda3\lib\site packages\spyder\u kernels\customize\spydercustomize.py”,第108行,在execfile中
exec(编译(f.read(),文件名,'exec'),命名空间)
文件“C:/Users/aliya/.spyder-py3/temp.py”,第50行,在
解决方案=问题。getSolutions()
文件“C:\ProgramData\Anaconda3\lib\site packages\constraint\uuuu init\uuuuu.py”,第271行,在getSolutions中
返回self.\u solver.getSolutions(域、约束、vconstraints)
文件“C:\ProgramData\Anaconda3\lib\site packages\constraint\uuuu init\uuuuuu.py”,第567行,在getSolutions中
返回列表(self.getSolutionIter(域、约束、vconstraints))
文件“C:\ProgramData\Anaconda3\lib\site packages\constraint\uuuu init\uuuuu.py”,第544行,位于getSolutionIter中
如果不是约束(变量、域、赋值、域):
文件“C:\ProgramData\Anaconda3\lib\site packages\constraint\uuuu init\uuuuu.py”,第991行,在调用中
self.forwardCheck(变量、域、赋值)
文件“C:\ProgramData\Anaconda3\lib\site packages\constraint\uuuu init\uuuuuu.py”,第935行,在forwardCheck中
如果不是self(变量、域、赋值):
文件“C:\ProgramData\Anaconda3\lib\site packages\constraint\uuuu init\uuuuu.py”,第993行,在调用中
返回自我功能(*parms)
TypeError:lambda()接受2个位置参数,但给出了8个
有什么帮助吗 在所有以
problem.addConstraint
开头的行上,您使用的变量名以数字开头,例如1ACROSS
和2DOWN
。这在Python中是不允许的。例如,尝试调用它们onecross
和TWODOWN
或VAR1ACROSS
和VAR2DOWN
,应该会更好。Python解析器禁止以这种方式命名变量,以便分别解析数字和变量,因为命名变量1e1
会造成混乱-是数字10.0
还是变量1e1
“Python,请为我输出1e1
!”——“为什么是10.0?我在那里存储了100!”
但是变量实际上是以一种允许将以数字开头的字符串绑定到值的方式存储的,因为这种特性在任何类型的哈希映射中都没有坏处,因此使用这种“技巧”,您可以在不损害解析器可分离性的情况下实现所需的数字前缀名称变量
我想说,从技术上讲,以这种方式命名变量并不违反python准则,但这是非常不鼓励的,而且通常是不必要的。使用全局变量注入变量被认为是一种非常糟糕的做法,这种情况不应该是一个突出的问题
所以改变
problem.addConstraint(lambda 1ACROSS,2DOWN: 1ACROSS in range((1,1),(1,5)) and 2DOWN in range ((1,3),(5,3)) and 1ACROSS[2]==2DOWN[0])
problem.addConstraint(lambda 3DOWN,1ACROSS: 3DOWN in range((1,5),(5,5)) and 1ACROSS[4]==3DOWN[0])
problem.addConstraint(lambda 4ACROSS,5DOWN: 4ACROSS in range((3,2),(3,5)) and 5DOWN in range ((3,4),(6,4)) and 4ACROSS[1]==2DOWN[2] and 4ACROSS[2]==5DOWN[0] and 4ACROSS[3]==3DOWN[2])
problem.addConstraint(lambda 6DOWN,8ACROSS: 6DOWN in range((4,1),(6,1)) and 8ACROSS in range((5,1),(5,5)) and 6DOWN[1]==8ACROSS[0])
致:
您好,亲爱的纵横字谜是一个非常复杂的问题,我有这个任务的解决方案,但由谷歌的ortools库实现。 以下是使用此库的要求: 要求:
**Library:** ortools by google
**Requirements for this library:**
**1-you have to install/update your pip forcefully by 2 commands:**
1- "conda config --add channels conda-forge"
2- "conda insatll pip=18.0"
**2-you have to update or install protobuf library version=3.6.1 using following command:**
1- "pip insatll protobuf=3.6.1"
**3-if protobuf cannot istall following libraries with it you have to also install them:**
1- six 1.11.1 (Query: pip install six=1.11.0).
2- setuptools 40.6.2 (Query: pip install setuptools=40.6.2)
3- ortools 6.10.6025 (Query: pip install ortools=6.10.6025)
**"pywrapcp"** this function will help for the creation of the solver.
**.IntVar() **function is used to add the varriable and domains
**.Add()** function is used to add constraints.
以下是此问题的代码:
## Author: Ahsan Azeem
## Solution of Crossword using ortools library
from ortools.constraint_solver import pywrapcp
def main():
solver = pywrapcp.Solver("Problem")
alpha = "_abcdefghijklmnopqrstuvwxyz"
a = 1
b = 2
c = 3
d = 4
e = 5
f = 6
g = 7
h = 8
i = 9
j = 10
k = 11
l = 12
m = 13
n = 14
o = 15
p = 16
q = 17
r = 18
s = 19
t = 20
u = 21
v = 22
w = 23
x = 24
y = 25
z = 26
num_words = 15
word_len = 5
AA = [
[h, o, s, e, s], # HOSES
[l, a, s, e, r], # LASER
[s, a, i, l, s], # SAILS
[s, h, e, e, t], # SHEET
[s, t, e, e, r], # STEER
[h, e, e, l, 0], # HEEL
[h, i, k, e, 0], # HIKE
[k, e, e, l, 0], # KEEL
[k, n, o, t, 0], # KNOT
[l, i, n, e, 0], # LINE
[a, f, t, 0, 0], # AFT
[a, l, e, 0, 0], # ALE
[e, e, l, 0, 0], # EEL
[l, e, e, 0, 0], # LEE
[t, i, e, 0, 0] # TIE
]
num_overlapping = 12
overlapping = [
[0, 2, 1, 0], # s
[0, 4, 2, 0], # s
[3, 1, 1, 2], # i
[3, 2, 4, 0], # k
[3, 3, 2, 2], # e
[6, 0, 1, 3], # l
[6, 1, 4, 1], # e
[6, 2, 2, 3], # e
[7, 0, 5, 1], # l
[7, 2, 1, 4], # s
[7, 3, 4, 2], # e
[7, 4, 2, 4] # r
]
n = 8
A = {}
for I in range(num_words):
for J in range(word_len):
A[(I, J)] = solver.IntVar(0, 26, "A(%i,%i)" % (I, J))
A_flat = [A[(I, J)] for I in range(num_words) for J in range(word_len)]
E = [solver.IntVar(0, num_words, "E%i" % I) for I in range(n)]
solver.Add(solver.AllDifferent(E))
for I in range(num_words):
for J in range(word_len):
solver.Add(A[(I, J)] == AA[I][J])
for I in range(num_overlapping):
# This is what I would do:
# solver.Add(A[(E[overlapping[I][0]], overlapping[I][1])] == A[(E[overlapping[I][2]], overlapping[I][3])])
# But we must use Element explicitly
solver.Add(
solver.Element(
A_flat, E[overlapping[I][0]] * word_len + overlapping[I][1]) ==
solver.Element(
A_flat, E[overlapping[I][2]] * word_len + overlapping[I][3]))
solution = solver.Assignment()
solution.Add(E)
db = solver.Phase(E + A_flat,
solver.INT_VAR_SIMPLE,
solver.ASSIGN_MIN_VALUE)
solver.NewSearch(db)
num_solutions = 0
while solver.NextSolution():
print(E)
print_solution(A, E, alpha, n, word_len)
num_solutions += 1
solver.EndSearch()
print()
print("num_solutions:", num_solutions)
print("failures:", solver.Failures())
def print_solution(A, E, alpha, n, word_len):
for ee in range(n):
print("%i: (%2i)" % (ee, E[ee].Value()), end=' ')
print("".join(["%s" % (alpha[A[ee, ii].Value()]) for ii in range(word_len)]))
if __name__ == "__main__":
main()
希望您得到了answerexec(compile(f.read(),filename,'exec'),命名空间)文件“C:/Users/aliya/.spyder-py3/temp.py”,第6行,来自约束导入*ModuleNotFoundError:没有名为“constraint”的模块,现在它给我这个错误!我已经安装了它,但在运行problem.addConstraint(sevenACROSS in range((4,3),(4,5))第20行代码文件“C:/Users/aliya/.spyder-py3/temp.py”时仍然出错,sevenACROSS[0]==twoDOWN[3]和sevenACROSS[1]==fiveDOWN[1]和sevenACROSS[2]==twoDOWN[3])NameError:首次读取时未定义名称“sevenACROSS”错误消息:NameError:未定义名称“sevenACROSS”。这意味着前一个错误已被删除,下一个错误已被删除。好的,当前的错误告诉我们:没有定义名称“sevenACROSS”-python找不到这个变量,所以请检查使用“sevenACROSS”变量的行。因此,您可以在这里看到您错过了
lambda
。请更加注意。我已经解决了命名问题,但现在它给出了这个错误,我不能给lambda提供两个以上的参数。但我有两个以上的限制要定义。。。我怎么能做到这一点?好的,男人:1)任何人都不会为你编码2)我没有灵性或迷思技能,所以我需要错误消息(至少)3)如果你有另一个问题-打开另一个问题,因为它已成功完成。我已经更改了它,但仍然给出了错误文件“C:/Users/aliya/.spyder-py3/temp.py”,第6行,在from constraint import*ModuleNotFoundError中:没有名为“constraint Jolindbe”的模块我已解决了命名问题。。。现在它是游戏我的问题类型错误:()需要2个位置参数,但8个是给定的,但我只给出两个检查我编辑的代码。这个论坛不是为了帮助你调试代码的每一步-你不能只编辑你遇到的每一个新问题的问题,并希望你能得到更多的答案。如果您有一个新问题,我建议您这样发布。TypeError:()接受2个位置参数,但给出了8个。。。但我只给lambda函数两个!使用python约束库给出解决方案。。。顺便说一句,谢谢你的回答!
## Author: Ahsan Azeem
## Solution of Crossword using ortools library
from ortools.constraint_solver import pywrapcp
def main():
solver = pywrapcp.Solver("Problem")
alpha = "_abcdefghijklmnopqrstuvwxyz"
a = 1
b = 2
c = 3
d = 4
e = 5
f = 6
g = 7
h = 8
i = 9
j = 10
k = 11
l = 12
m = 13
n = 14
o = 15
p = 16
q = 17
r = 18
s = 19
t = 20
u = 21
v = 22
w = 23
x = 24
y = 25
z = 26
num_words = 15
word_len = 5
AA = [
[h, o, s, e, s], # HOSES
[l, a, s, e, r], # LASER
[s, a, i, l, s], # SAILS
[s, h, e, e, t], # SHEET
[s, t, e, e, r], # STEER
[h, e, e, l, 0], # HEEL
[h, i, k, e, 0], # HIKE
[k, e, e, l, 0], # KEEL
[k, n, o, t, 0], # KNOT
[l, i, n, e, 0], # LINE
[a, f, t, 0, 0], # AFT
[a, l, e, 0, 0], # ALE
[e, e, l, 0, 0], # EEL
[l, e, e, 0, 0], # LEE
[t, i, e, 0, 0] # TIE
]
num_overlapping = 12
overlapping = [
[0, 2, 1, 0], # s
[0, 4, 2, 0], # s
[3, 1, 1, 2], # i
[3, 2, 4, 0], # k
[3, 3, 2, 2], # e
[6, 0, 1, 3], # l
[6, 1, 4, 1], # e
[6, 2, 2, 3], # e
[7, 0, 5, 1], # l
[7, 2, 1, 4], # s
[7, 3, 4, 2], # e
[7, 4, 2, 4] # r
]
n = 8
A = {}
for I in range(num_words):
for J in range(word_len):
A[(I, J)] = solver.IntVar(0, 26, "A(%i,%i)" % (I, J))
A_flat = [A[(I, J)] for I in range(num_words) for J in range(word_len)]
E = [solver.IntVar(0, num_words, "E%i" % I) for I in range(n)]
solver.Add(solver.AllDifferent(E))
for I in range(num_words):
for J in range(word_len):
solver.Add(A[(I, J)] == AA[I][J])
for I in range(num_overlapping):
# This is what I would do:
# solver.Add(A[(E[overlapping[I][0]], overlapping[I][1])] == A[(E[overlapping[I][2]], overlapping[I][3])])
# But we must use Element explicitly
solver.Add(
solver.Element(
A_flat, E[overlapping[I][0]] * word_len + overlapping[I][1]) ==
solver.Element(
A_flat, E[overlapping[I][2]] * word_len + overlapping[I][3]))
solution = solver.Assignment()
solution.Add(E)
db = solver.Phase(E + A_flat,
solver.INT_VAR_SIMPLE,
solver.ASSIGN_MIN_VALUE)
solver.NewSearch(db)
num_solutions = 0
while solver.NextSolution():
print(E)
print_solution(A, E, alpha, n, word_len)
num_solutions += 1
solver.EndSearch()
print()
print("num_solutions:", num_solutions)
print("failures:", solver.Failures())
def print_solution(A, E, alpha, n, word_len):
for ee in range(n):
print("%i: (%2i)" % (ee, E[ee].Value()), end=' ')
print("".join(["%s" % (alpha[A[ee, ii].Value()]) for ii in range(word_len)]))
if __name__ == "__main__":
main()