理解约束满足问题:地图着色算法

时间:2018-10-06 19:01:48

标签: algorithm artificial-intelligence recursive-backtracking

我正在尝试针对给定算法的约束满足问题实现此递归回溯功能:

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],赋值,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语句的正文,那么这将非常有用。

1 个答案:

答案 0 :(得分:0)

因此,在重新整理了一些大学文献(彼得·诺维格的《人工智能:一种现代方法》)之后,事实证明,您手中的问题是使用递归Backtracking作为找到{{3 }},也称为“地图着色”(根据其历史来解决将地图绘制所需的颜色最小化的问题)。在地图中的每个国家/地区替换一个节点,并在其边界处带边框,将为您提供一个图形,我们可以在其中应用递归回溯来找到解决方案。

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

所以

  

我假设由于分配是作为空字典{}输入的,因此这将返回解决方案,即包含状态及其颜色的字典   ...   是否会像根据状态数检查字典的大小一样?

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

  

输入的csp类包含一个状态列表,我认为这可能等同于弹出列表中的一个值?

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

  

根据我的输入,我不确定参数(变量[csp],赋值,csp)在做什么

如上所述,赋值参数是一个字典,其中包含到目前为止评估的节点(以及将来的解决方案),而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主体,然后将颜色为var的节点value添加到assigment字典中(我相信{var = value}是一个元组表示形式,我会写成{var,value},但是很好)。 然后,以递归方式再次调用函数递归回溯。 如果递归调用返回失败,则返回其结果(这意味着已找到解决方案)。

如果返回失败(表示它尝试了所有颜色,而所有颜色恰巧被另一个相邻节点使用),则从assignment中删除该节点({var,value})(解决方案)数组,然后移至下一个颜色。如果所有颜色均已淡化,则返回失败。