我正在尝试根据给定的算法实现这个递归回溯函数来解决约束满足问题:
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
我假设由于assignment输入为空字典{},这将返回解决方案,即包含状态及其颜色的字典。然而,我不明白如何检查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
如何正确检查value是否与给定constraints[csp]的assignment一致?我假设constraints应该是我的csp类的一部分,但我还没有实现。我不明白这个if语句在检查方面做了什么。如果有人能详细解释这个if语句及其主体部分,将非常有帮助。
回答:
在重新阅读了一些大学文献(Peter Norvig的《人工智能:现代方法》)后,发现你手头的问题是将递归回溯应用于解决图着色问题,这也被称为地图着色(鉴于其历史是为了解决绘制地图所需的最小颜色问题)。将地图上的每个国家替换为节点,并用边表示它们的边界,这样你就得到了一个图,我们可以应用递归回溯来寻找解决方案。
递归回溯将以深度优先树搜索的方式遍历图节点,在每个节点检查是否可以使用某种颜色。如果不能,它会尝试下一种颜色,如果可以,则尝试下一个未访问的相邻节点。如果对于给定节点没有颜色满足条件,它将回溯(backtrack)并移动到兄弟节点(如果该节点没有兄弟节点,则移动到父节点的兄弟节点)。
所以,
我假设由于assignment输入为空字典{},这将返回解决方案,即包含状态及其颜色的字典…是否需要检查字典的大小与状态数量是否一致?
是的,是的。一旦字典包含了图的所有节点及其颜色,你就有了解决方案。
csp类输入包含一个状态列表,我假设这可以简单地将var设置为从列表中弹出的值?
那个伪代码语法可能有些 confusing,但总体思路是你需要找到一个尚未着色的图节点。一个简单的方法是从字典中返回一个没有分配值的节点。所以,如果我正确理解了语法,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语句主体,并将该节点var
和颜色value
添加到assignment
字典中(我认为{var = value}是一个元组表示,我会写成{var,value},但无所谓)。然后再次调用递归回溯函数。如果递归调用返回非失败结果,则返回其结果(这意味着找到了解决方案)。
如果它返回失败(意味着它尝试了所有颜色,而所有颜色都被另一个相邻节点使用了),那么从assignment
(解决方案)数组中移除该节点({var,value})并继续尝试下一种颜色。如果所有颜色都已用尽,则返回失败。