回溯算法

回溯算法简介

先来看看百度百科对于回溯算法的解释:
回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。
回溯算法的英文是”Backtracking”意思很直接就是原路返回,回溯是一种通用算法,用于发现某些计算问题(特别是约束满足问题)的所有(或某些)解,这些增量满足问题的解决方案,并在确定候选不可能的情况下放弃候选(“回溯”)。

使用回溯的经典教科书例子是八皇后难题,它要求所有棋盘上的八个象棋皇后的所有安排,以便没有皇后攻击任何其他棋盘。在常见的回溯方法中,部分候选是k个皇后在板的第一k行中的排列,都在不同的行和列中。任何包含两个相互攻击皇后的部分解决方案都可以放弃。

回溯只能应用于承认“部分候选解”概念的问题,并且可以对其是否可能完成有效的解决方案进行相对快速的测试。例如,在无序表中定位给定值是没有用的。然而,当它适用时,回溯通常比所有完整候选的蛮力枚举快得多,因为它可以通过一次测试消除大量的候选。

回溯是解决约束满足问题的一个重要工具,如填字游戏、动词算术、数独和许多其他难题。它通常是最方便的(如果不是最有效的(引文需要))解析技术,背包问题和其他组合优化问题。它也是所谓的逻辑编程语言的基础。它是一种元启发式算法,而不是一种特定的算法——尽管与许多其他元启发式算法不同,它保证在有限的时间内找到一个有限问题的所有解。

回溯方法描述:

回溯算法列举了一组部分候选,原则上可以以各种方式完成,以给出给定问题的所有可能的解决方案。通过一系列候选扩展步骤增量完成完成。
概念上,部分候选被表示为树结构的节点,即潜在搜索树。每一个部分候选者都是由单个扩展步骤与它不同的候选者的父;树的叶子是不能进一步扩展的部分候选。
回溯算法递归地遍历这个搜索树,从根向下,深度一阶。在每个节点C,算法检查C是否可以完成一个有效的解决方案。如果不能,则根除C的整个子树被跳过(修剪)。否则,算法(1)检查C本身是否是一个有效的解决方案,如果是这样,则将其报告给用户;(2)递归枚举C的所有子树。每个测试和每个节点的子节点由用户给定的程序定义。
因此,通过该算法遍历的实际搜索树仅仅是潜在树的一部分。算法的总成本是实际树次数的节点数,获取和处理每个节点的成本。当选择潜在的搜索树和实现修剪测试时,应该考虑这一事实。

回溯算法伪代码:

为了应用回溯到特定类别的问题,必须为要解决的问题的特定实例提供数据P,以及六个过程参数,根、拒绝、接受、第一、下一个和输出。这些过程应以实例数据P作为参数,并应执行以下操作:
根(p):返回搜索树根上的部分候选。
拒绝(p,c):只有部分候选C不值得完成时才返回真。
接受(p,c):如果C是P的解,则返回true,否则为false。
第一(p,c):生成候选C的第一扩展。
下一步(p,s):在扩展S之后生成候选的下一个可选扩展。
输出(P,C):使用P的解决方案C,适用于应用程序。
其实递归过程如下:

procedure bt(c)
  if reject(P,c) then return
  if accept(P,c) then output(P,c)
  sfirst(P,c)
  while s ≠ Λ do
    bt(s)
    snext(P,s)

使用注意事项:

拒绝过程应该是布尔值函数,只有当确定C没有可能的扩展是P的有效解时才返回真值。如果程序不能得到明确的结论,则它应该返回false。错误的真实结果可能导致BT过程错过一些有效的解决方案。该过程可以假定拒绝(P,T)返回搜索树中C的每个祖先T的假。

另一方面,回溯算法的效率依赖于拒绝尽可能接近根的候选返回真。如果拒绝总是返回false,该算法仍然会找到所有的解决方案,但它将等同于蛮力搜索。
如果C是问题实例P的完整且有效的解决方案,则接受过程应该返回true,否则为false。它可以假定部分候选C及其树中的所有祖先都已通过拒绝测试。

一般的伪代码不假设有效的解决方案总是潜在搜索树的叶子。换言之,它承认P的有效解可以进一步扩展以产生其他有效解的可能性。

回溯算法经典例子:

1.如八皇后拼图,纵横字谜,口头算术,数独[NB 1 ],和PEG纸牌游戏。
2.组合优化问题,如解析和背包问题。
3.逻辑编程语言,如Icon,PrimeNeR和Prolog,它使用内部回溯来生成答案。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值