【问题标题】:understanding constraint satisfaction problem: map coloring algorithm理解约束满足问题:地图着色算法
【发布时间】:2018-10-06 19:01:47
【问题描述】:

我正在尝试为给定算法的约束满足问题实现这个递归回溯函数:

function BACKTRACKING-SEARCH(csp) returns solution/failure
    return RECURSIVE-BACKTRACKING({},csp)
function RECURSIVE-BACKTRACKING(assignment,csp) returns soln/failure
    if assignment is complete then return assignment
    var <- SELECT-UNASSIGNED-VARIABLE(VARIABLES[csp],assignment,csp)
    for each value in ORDER-DOMAIN-VALUES(var,assignment,csp) do
        if value is consistent with assignment given CONSTRAINT[csp] then
            add {var = value} to assignment
            result <- RECURSIVE-BACKTRACKING(assignment, csp)
            if result != failure then return result
            remove {var = value} from assignment
    return failure    

BACKTRACKING-SEARCH(csp) 中 csp 的输入是一个 csp 类,它包含 a) 状态列表,b) 颜色列表,以及 c) 以状态为键且值为该州不能具有相同颜色的邻居列表。

问题是我很难理解算法是如何正确工作的。如果有人能给我这个算法的正确解释,将不胜感激。我的一些具体问题是:

    if assignment is complete then return assignment

我假设由于赋值是作为空字典 {} 输入的,因此这将返回解决方案,即包含状态及其颜色的字典。但是,我不明白如何检查作业是否完成?是否类似于根据状态数量检查字典的大小?

    var <- SELECT-UNASSIGNED-VARIABLE(VARIABLES[csp],assignment,csp)

输入 csp 类包含一个状态列表,我假设这可能只是 var 等于弹出列表中的一个值?我想,让我感到困惑的是,考虑到我的输入,我不确定参数 (VARIABLES[csp], assignment, csp) 在做什么。

    for each value in ORDER-DOMAIN-VALUES(var,assignment,csp) do

再一次,对 (var, assignment, csp) 的输入到底在做什么感到困惑。但我假设它会遍历状态字典中的每个值(邻居)?

        if value is consistent with assignment given CONSTRAINT[csp] then
            add {var = value} to assignment
            result <- RECURSIVE-BACKTRACKING(assignment, csp)
            if result != failure then return result
            remove {var = value} from assignment

如何正确检查值是否与给定约束[csp] 的赋值一致?我认为约束应该是我尚未实现的 csp 类的一部分?我不明白这个 if 语句在检查方面做了什么。如果有人能清楚地解释这个 if 语句和 if 语句的主体,那将是非常有用的。

【问题讨论】:

  • 这是某种深奥的语言,还是只是书中的算法?如果是后者,引用来源可能会有所帮助,因为这里似乎缺少很多上下文。书籍通常会在前面的章节中解释他们用于伪代码的符号。
  • 取自演讲幻灯片

标签: algorithm artificial-intelligence recursive-backtracking


【解决方案1】:

因此,在重新整理了一些大学文献(Peter Norvig 的人工智能:一种现代方法)之后,事实证明,您手中的问题是应用递归 Backtracking 作为为 Graph Coloring Problem 找到解决方案的一种方法,它也称为地图着色(鉴于其解决绘制地图所需颜色最小化问题的历史)。将地图中每个国家/地区的节点及其边界替换为边将为您提供一个图表,我们可以在其中应用递归回溯来找到解决方案。

递归回溯将向下图节点作为深度优先树搜索,检查每个节点是否可以使用颜色。如果不是,则尝试下一个颜色,如果是,则尝试下一个未访问的相邻节点。如果对于给定的节点,没有颜色满足条件,它将后退(回溯)并移动到兄弟节点(如果该节点没有兄弟节点,则为父节点的兄弟节点)。

所以,

我假设由于赋值是作为空字典 {} 输入的,这将返回解决方案,即包含状态及其颜色的字典 ... 是否类似于根据状态数量检查字典的大小?

是的,是的。一旦字典包含带有颜色的图形的所有节点,您就会有一个解决方案。

输入 csp 类包含一个状态列表,我假设这可能只是 var 等于弹出列表中的一个值?

这种伪代码语法令人困惑,但总体思路是,您将有办法找出尚未着色的图形节点。一种简单的方法是从字典中返回一个没有分配值的节点。因此,如果我正确理解语法,var 将存储一个节点。 VARIABLES[csp] 在我看来就像是 CSP 结构中节点列表的表示。

根据我的输入,我不确定参数 (VARIABLES[csp], assignment, csp) 在做什么

assignment 参数是一个字典,包含到目前为止评估的节点(以及未来的解决方案),如上所述,csp 是包含 a、b 和 c 的结构。

再一次,对 (var, assignment, csp) 的输入到底在做什么感到困惑。但我假设它会遍历状态字典中的每个值(邻居)?

ORDER-DOMAIN-VALUES 似乎是一个函数,它将返回 CSP 结构中的有序颜色集。 FOR 循环将遍历每种颜色,以便对其进行测试以满足该级别的问题。

 if value is consistent with assignment given CONSTRAINT[csp] then

在这里,您所做的是使用该值测试约束,以确保其为真。在这种情况下,您要检查与该节点相邻的任何节点是否已经没有该颜色。如果相邻节点具有该颜色,则跳过 IF 并迭代 for 循环以尝试下一种颜色。

如果没有相邻节点具有该颜色,则输入 IF 正文并将颜色为 value 的节点 var 添加到 assigment 字典中(我相信 {var = value} 是一个元组表示,我会写 {var,value},但是很好)。 然后再次递归地调用函数递归回溯。 如果递归调用返回非失败,则返回其结果(表示已找到解决方案)。

如果它返回失败(意思是,它尝试了所有颜色并且所有颜色都恰好被另一个相邻节点使用),则从assignment(解决方案)数组中删除该节点({var,value})并继续下一个颜色。如果所有颜色都用完了,返回失败。

【讨论】:

  • PS:我上面的文本中的“节点”等同于“状态” - 根据您的标签artificial intelligence,文献倾向于将可能的状态建模为图中的节点,因为状态是通常相互连接。
  • 感谢您的回复,您澄清了很多。我尝试根据您的回复实现该功能。但是,我在 Python 中实现它时遇到了最大递归深度问题。我不太明白这个算法是如何返回正确的解决方案的?
  • 通过最大递归深度,我假设您的意思是您遇到了堆栈溢出?我猜这是因为图表有循环,和/或不知何故你没有将节点标记为已访问?
  • 没关系,经过一番挫折后,我想通了。我的 if 语句没有正确检查条件。感谢您的帮助!
  • 感谢您的回复。你很擅长解释概念。
猜你喜欢
  • 2017-04-13
  • 2012-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-03
  • 1970-01-01
相关资源
最近更新 更多