gpt4 book ai didi

algorithm - 理解约束满足问题 : map coloring algorithm

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:13:58 31 4
gpt4 key购买 nike

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

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 语句的主体,那将是非常有用的。

最佳答案

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

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

所以,

I assume that since assignment is inputted as an empty dictionary {}, that this will return the solution, that is, the dictionary that contains states and their colors ... Would it be something like checking the size of the dictionary against the number of states?

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

The input csp class contains a list of states, I assume this could just be var equal to popping off a value in the list?

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

I'm not sure what the parameters (VARIABLES[csp], assignment, csp) are doing, given my input

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

Again, confused on what the inputs of (var, assignment, csp) are doing exactly. But I assume that it'll go through each value (neighbor) in dictionary of the state?

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

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

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

如果没有相邻节点具有该颜色,则进入 IF 主体并将具有颜色 value 的节点 var 添加到 assignment 字典中(我相信 {var = value} 是一个元组表示,我会写成 {var,value},但是哦,好吧)。然后再调用函数recursive backtracking,递归。如果递归调用返回非失败,则返回其结果(这意味着已经找到解决方案)。

如果它返回一个失败(意思是,它尝试了所有的颜色并且所有这些颜色恰好被另一个相邻节点使用),那么从分配 (解决方案) 阵列并移动到下一个颜色。如果所有颜色都用完了,返回失败。

关于algorithm - 理解约束满足问题 : map coloring algorithm,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52682417/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com