python 使用约束库的交叉世界难题求解器

rt4zxlrg  于 2023-01-08  发布在  Python
关注(0)|答案(4)|浏览(83)

我有这个问题要解决,如图所示。我已经尝试了下面给出的代码

# -*- 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:/用户/aliya/. spyder-py 3/temp.py',wdir ='C:/用户/aliya/. spyder-py 3')追溯(最近调用最后):
运行文件中的文件“",第1行(”C:/用户/aliya/. spyder-py 3/temp.py“,wdir =”C:/用户/aliya/. spyder-py 3“)
运行文件执行文件(文件名、命名空间)中的文件“C:\ProgramData\Anaconda 3\lib\站点包\spyder_kernels\customize\spydercustomize.py”,第668行
文件“C:\ProgramData\Anaconda 3\lib\site-packages\spyder_kernels\customize\spydercustomize.py”,第108行,在执行文件exec(编译(f.read(),文件名,'exec'),命名空间)中
文件“C:/用户/aliya/. spyder-py 3/temp.py“,第50行,在解决方案=问题.getSolutions()中
文件“C:\ProgramData\Anaconda 3\lib\site-packages\constraint__init__.py”,第271行,在getSolutions中返回self.solver.getSolutions(域、约束、vconstraint)
文件“C:\ProgramData\Anaconda 3\lib\站点包\约束__init
_.py”,第567行,在getSolutions返回列表中(自定义.getSolutionIter(域,约束,v约束))
文件“C:\ProgramData\Anaconda 3\lib\site-packages\constraint__init__.py”,第544行,如果没有约束(变量、域、赋值、推送域),则在getSolutionIter中:
文件“C:\ProgramData\Anaconda 3\lib\site-packages\constraint__init__.py”,第991行,在调用self.forwardCheck(变量、域、赋值)中
文件“C:\ProgramData\Anaconda 3\lib\site-packages\constraint__init__.py”,第935行,向前检查是否不是self(变量、域、赋值):
文件“C:\程序数据\Anaconda 3\库\站点包\约束__初始化__.py”,第993行,在调用返回自身._函数(* 参数)中
TypeError:lambda()接受2个位置参数,但实际给出了8个
任何关于这个的帮助!

gcxthw6b

gcxthw6b1#

在所有以problem.addConstraint开头的行中,你都使用了以数字开头的变量名,例如1ACROSS2DOWN,这在Python中是不允许的,例如,尝试将它们命名为ONEACROSSTWODOWN,或者VAR1ACROSSVAR2DOWN,这样会更好。

brtdzjyr

brtdzjyr2#

Python语法分析器禁止用这种方式命名变量,这是为了分别分析数字和变量,因为命名变量1e1会造成混乱--是数字10.0还是变量1e1
"Python,请为我输出1e1!"-"为什么是10.0?我在那里存储了100!"
但是变量实际上是以一种允许将以数字开头的字符串绑定到值的方式存储的,因为这种特性对任何类型的散列Map都没有害处,所以使用这种"技巧",您可以在不损害解析器可分割性的情况下实现所需的数字前缀名称变量。
我想说的是,从技术上讲,用这种方式命名变量并不违反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])

收件人:

problem.addConstraint(lambda ACROSS,DOWN: ACROSS in range((1,1),(1,5)) and DOWN in range ((1,3),(5,3)) and ACROSS[2]==DOWN[0])
problem.addConstraint(lambda DOWN,ACROSS: DOWN in range((1,5),(5,5)) and ACROSS[4]==DOWN[0])
problem.addConstraint(lambda ACROSS,DOWN: ACROSS in range((3,2),(3,5)) and DOWN in range ((3,4),(6,4)) and ACROSS[1]==DOWN[2] and ACROSS[2]==DOWN[0] and ACROSS[3]==DOWN[2])
problem.addConstraint(lambda DOWN,ACROSS: DOWN in range((4,1),(6,1)) and ACROSS in range((5,1),(5,5)) and DOWN[1]==ACROSS[0])
wooyq4lh

wooyq4lh3#

你好,亲爱的填字游戏是一个非常复杂的问题,我有一个解决这个问题的方法,但是是用谷歌的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()

希望你得到答案

lymnna71

lymnna714#

将lambda函数中的所有变量名相加,并且列表的索引为零,因此索引从0开始。

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(AllDifferentConstraint())

problem.addConstraint(lambda  oneACROSS,fourACROSS,sevenACROSS,eightACROSS,twoDOWN,threeDOWN,fiveDOWN, sixDOWN:oneACROSS[2] == twoDOWN[0])

problem.addConstraint(lambda  oneACROSS,fourACROSS,sevenACROSS,eightACROSS,twoDOWN,threeDOWN,fiveDOWN, sixDOWN:oneACROSS[4]==threeDOWN[0])

problem.addConstraint(lambda  oneACROSS,fourACROSS,sevenACROSS,eightACROSS,twoDOWN,threeDOWN,fiveDOWN, sixDOWN:fourACROSS[1]==twoDOWN[2])

problem.addConstraint(lambda  oneACROSS,fourACROSS,sevenACROSS,eightACROSS,twoDOWN,threeDOWN,fiveDOWN, sixDOWN:fourACROSS[2]==fiveDOWN[0])

problem.addConstraint(lambda  oneACROSS,fourACROSS,sevenACROSS,eightACROSS,twoDOWN,threeDOWN,fiveDOWN, sixDOWN:fourACROSS[3]==threeDOWN[2])

problem.addConstraint(lambda  oneACROSS,fourACROSS,sevenACROSS,eightACROSS,twoDOWN,threeDOWN,fiveDOWN, sixDOWN:sevenACROSS[0]==twoDOWN[3])

problem.addConstraint(lambda  oneACROSS,fourACROSS,sevenACROSS,eightACROSS,twoDOWN,threeDOWN,fiveDOWN, sixDOWN:sevenACROSS[1]==fiveDOWN[1])

problem.addConstraint(lambda  oneACROSS,fourACROSS,sevenACROSS,eightACROSS,twoDOWN,threeDOWN,fiveDOWN, sixDOWN:sevenACROSS[2]==threeDOWN[3])

problem.addConstraint(lambda  oneACROSS,fourACROSS,sevenACROSS,eightACROSS,twoDOWN,threeDOWN,fiveDOWN, sixDOWN:eightACROSS[0]==sixDOWN[1])

problem.addConstraint(lambda  oneACROSS,fourACROSS,sevenACROSS,eightACROSS,twoDOWN,threeDOWN,fiveDOWN, sixDOWN:eightACROSS[2]==twoDOWN[4])

problem.addConstraint(lambda  oneACROSS,fourACROSS,sevenACROSS,eightACROSS,twoDOWN,threeDOWN,fiveDOWN, sixDOWN:eightACROSS[3]==fiveDOWN[2])

problem.addConstraint(lambda  oneACROSS,fourACROSS,sevenACROSS,eightACROSS,twoDOWN,threeDOWN,fiveDOWN, sixDOWN:eightACROSS[4]==threeDOWN[4])

solution=problem.getSolutions()

print(solution)

相关问题