【问题标题】:Solving N-Queens Using Python constraint Resolver使用 Python 约束解析器求解 N-Queens
【发布时间】:2015-04-22 11:03:52
【问题描述】:

以下是使用来自LabixPython-Constraint 解析器的N-queens problem 解决方案。有人可以向我解释一下,或者让我参考任何解释此代码最后 3 行含义的网页吗?

此外,我如何使用AllDifferentConstraint 约束来缩短下面的代码?

from constraint import *

problem = Problem()
size = 8
cols = range(size)
rows = range(size)
problem.addVariables(cols, rows)
for col1 in cols:
    for col2 in cols:
        if col1 < col2:
            problem.addConstraint(lambda row1, row2, col1=col1, col2=col2:
                                    abs(row1-row2) != abs(col1-col2) and
                                    row1 != row2, (col1, col2))

【问题讨论】:

  • @Bhargav 如果 OP 不理解代码,那么为他们审查它真的没有意义。
  • @Bhargav 代码解释与Code Review 无关。在提出建议之前,请阅读他们的帮助中心。此外,如果您觉得这个问题不适合 Stack Overflow,请考虑解释原因并提出可以使这个问题更适合的建议。
  • 在不知道Problem 类的定义或它定义在什么模块中的情况下,无法解释该代码 sn-p 正在做什么。我猜测它正在使用python-constraint。所以你需要阅读他们的文档和相关文献;恕我直言,目前形式的这个问题不适合 Stackoverflow。
  • 那个 lambda 函数描述了防止皇后互相攻击的约束。你知道它是如何工作的吗?
  • 看来我猜对了模块,因为您已经接受了 Poke 的回答。 :) 我已将相关信息添加到您的问题中,但以后在您提出问题时提供此类信息。

标签: python constraint-programming n-queens


【解决方案1】:
problem.addConstraint(lambda row1, row2, col1=col1, col2=col2:
                        abs(row1-row2) != abs(col1-col2) and
                        row1 != row2, (col1, col2))

这大致等价于:

def constraintFunction (col1, col2):
    def innerFunction (row1, row2):
        return abs(row1 - row2) != abs(col1 - col2) and row1 != row2
    return innerFunction

problem.addConstraint(constraintFunction(col1, col2), (col1, col2))

最后一行等价于:

func = constraintFunction(col1, col2)
problem.addConstraint(func, (col1, col2))

【讨论】:

  • 我不确定 row1 和 row2 的值是什么,因为上面没有定义。请注意,我是 Python 新手。
  • row1row2 是内部函数的参数(最终返回)。显然,addConstraint 需要一个具有两个参数(我们称之为 row1row2)和一个 2 元组列的函数。
  • 谢谢!! ...我很感激。
  • 据我了解,row1 和 row2 的 col1 和 col2 的值相同,因为它是从 col1 和 dcol2 传递过来的……但显然它具有不同的值……为什么?
  • 不,constraintFunction 是用这两列调用的,但是 constraintFunction 然后返回一个不同的函数——innerFunction——它有 row1row2 作为参数。并且该函数被传递给addConstraint 函数,因此当稍后评估约束时,可能会传递与col1/2 不同的值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-20
  • 1970-01-01
  • 2014-11-02
  • 1970-01-01
相关资源
最近更新 更多