回溯

Backtracking

回溯是一种普通的算法,用来寻找 所有解

经典的 教科书版的列子 是 用回溯解决 八皇后问题

回溯可以应用于这样的问题: 他承认这个概念“部分候选解”和一个快速的测试它是否是一个完整解。

回溯不能应用在这样的问题: 把一个数字无序的放在一个表格里。

但是回溯总是很快 比起 强行美剧所有可能解, 因为回溯可以形成一定数量的候选解,通过简单的测试。

回溯是解决 约束问题 的重要工具, 例如: 填字游戏, 口头算数, 数独, 和一些困扰人的问题。

他通常非常方便(如果不要求效率)的技术,用来解析, 背包问题, 和一些其他的组合优化问题。

它是一些编程语言的 语言逻辑, 例如Icon, Planner,Prolog.

回溯语言还被应用于不同的机器中,例如MediaWiki软件。

回溯以来与用户给的“黑盒子处理”, 它描述了问题, 给了自然的候选解, 并且他们如何扩展成完整解。

所以相对具体的算法, 他是一个启发式算法 — 并且,他不像一些传统的元启发式, 他保证找到所有解,在有限的时间里。

Description of the method

回溯算法 枚举 给出一个 候选解集合, 原则上, 可以用不同的方法 给出完整的 可能的解。

通过递增式的完成, 通过一个有序的 候选扩展步骤

剩下的候选是不能被扩展的 更远的其他解。

回溯算法 通过递归 进行 深度优先 查询。

在每个node c, 查看,如果不是可用候选解, 则整跳过整个后续树。 

如果是可用候选解, 查看是解,如果是打印出给用户

                          如果不是解,则检查后续子树

Pseudocode

 

procedure bt(c)
if reject(P,c) then return
if accept(P,c) then output(P,c)
s ← first(P,c)
while s ≠ Λ do
bt(s)
s ← next(P,s)

Usage considerations

reject来判断 当前情况,是否有可能发展成正确解。

所以reject决定了减枝程度,也就是算法效率。

如果reject一直返回false,等于退化到了全搜索

accept来判断 当前情况,是一个解。他的祖先需要先全通过reject检测。

Note that the general pseudo-code above does not assume that the valid solutions are always leaves of the potential search tree. In other words, it admits the possibility that a valid solution for P can be further extended to yield other valid solutions.



posted on 2011-03-06 13:30  oleeceo  阅读(279)  评论(0)    收藏  举报

导航