当前位置: 首页 > 知识库问答 >
问题:

使用约束库的跨世界谜题求解器

吴同
2023-03-14

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

    # -*- 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)

但它给了我这个错误

runfile('C:/Users/aliya/.spyder-py3/temp.py',wdir='C:/Users/aliya/.spyder-py3')回溯(最后一次最近调用):

文件“”,第1行,在runfile('C:/Users/aliya/.spyder-py3/temp.py',wdir='C:/Users/aliya/.spyder-py3'中)

文件"C:\Program Data\Anaconda3\lib\site-包\spyder_kernels\定制\spydercustomize.py",第668行,在运行文件执行文件(文件名,命名空间)

文件“C:\ProgramData\Anaconda3\lib\site packages\spyder\u kernels\customize\spydercustomize.py”,第108行,在execfile exec中(compile(f.read(),文件名,'exec'),命名空间)

文件“C:/Users/aliya/.spyder-py3/temp.py”,第50行,在solution=problem中。getSolutions()

在getSolutions中的文件"C:\Program Data\Anaconda3\lib\site-pack\constraint__init__. py",第271行,返回自己。_solver.get解决方案(域、约束、v约束)

getSolutions返回列表(self.getSolutionIter(域、约束、vconstraints))中的第567行文件“C:\ProgramData\Anaconda3\lib\site packages\constraint\uuuuu init\uuuuu.py”

文件"C:\Program Data\Anaconda3\lib\site-包\constraint__init__. py",第544行,在getSolutionIter中,如果没有约束(变量,域,赋值,pushDomain):

文件"C:\Program Data\Anaconda3\lib\site-包\constraint__init__. py",第991行,调用self.forward检查(变量,域,赋值)

文件"C:\Program Data\Anaconda3\lib\site-包\constraint__init__. py",第935行,在向前检查如果不是自我(变量,域,赋值):

文件“C:\ProgramData\Anaconda3\lib\site packages\constraint\uuuu init\uuuuuu.py”,第993行,在call return self中_func(*parms)

TypeError: lambda()需要2个位置参数,但给出了8个

有什么帮助吗!

共有3个答案

景光赫
2023-03-14

嗨,亲爱的纵横字谜是一个非常复杂的问题,我有这个任务的解决方案,但通过谷歌的或工具库实现。以下是使用此库的要求:要求:

**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()
夏侯嘉荣
2023-03-14

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])

致:

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])
罗凯
2023-03-14

在所有以problem.addConstraint开头的行中,您都使用以数字开头的变量名,例如1ACROSS2DOWN。这在Python中是不允许的。例如,尝试将它们称为ONEACROSSTWODOWNVAR1ACROSSVAR2DOWN,它应该工作得更好。

 类似资料:
  • 我正在和choco solver一起解决一些任务调度问题。 我有几个工作和可能的时间段(可以执行一个工作)。有一些限制,比如: 每个插槽只能有一个作业(C.1) 作业需要一定的时间,并且插槽有一个可用的持续时间。作业必须符合可用的持续时间:

  • 那么当http2被广泛采用的时候,世界将会成什么样呢?或者说,它会被真正的采用吗? 8.1. http2会如何影响普通人? 到目前为止,http2还没被大范围部署使用,我们也无法确定到底会发生什么变化,但至少可以参考SPDY的例子和曾经做过的实验来进行大概的估计。 http2减少了网络往返传输的数量,并且用多路复用和快速丢弃不需要的流的办法来完全避免了head of line blocking(线

  • 我试图解决的优化模型有点混乱。这是一个小型模型,可以最大限度地降低两台机组的成本。我刚刚开始优化,我不确定我是否能很好地将问题解释为AMPL。特别是关于最小化约束及其界。 我的模型中有两个决策变量作为单位。u1的成本为10,u2的成本为13。u1的限制是不能超过100台,u2的限制是50台。通过颠倒这个最小化问题的界限,我得到了不同的结果。有人能帮我解释一下发生了什么事吗? var u1 最小化c

  • 问题内容: 给定Postgres数据库中的以下三列:第一,第二,第三;我如何创建一个约束使得排列是唯一的? 例如,如果数据库中存在,则将其作为非唯一变量排除在外。 问题答案: 您可以使用hstore创建唯一索引: 更新 实际上

  • 问题内容: 我有三张桌子- 我想确保当它们自然连接时,product_id +文件名是唯一的。到目前为止,我拥有的最佳解决方案是将文件名添加到product_attachment表中,但是我想知道是否有避免这种情况的方法。 问题答案: 如果文件名列不是唯一的,则可以在表上添加自定义约束。请注意,这将在每次插入和更新时执行以下查询,这并不是理想的性能。

  • 问题内容: 我有几个关于hibernate的问题。 许多问题中,有好几个人都说hibernate对于非常复杂的数据库不是一个好选择。如果我们有非常复杂的数据库,hibernate是不正确的选择。它更适合于绿色项目,但对于复杂的遗留数据库却不是那么好。 这是真的? hibernate也会生成查询。每个项目经理都希望拥有优化的查询(hibernate所生成的优化查询比sql专家还要多!)。因此,对于大