“回溯”和“分支和绑定”之间的区别

Posted

技术标签:

【中文标题】“回溯”和“分支和绑定”之间的区别【英文标题】:Difference between 'backtracking' and 'branch and bound' 【发布时间】:2015-05-04 08:07:43 【问题描述】:

在回溯中,我们同时使用 bfs 和 dfs。即使在分支定界中,我们也会同时使用 bfs 和 dfs 来进行最低成本搜索。

那么我们什么时候使用回溯,什么时候使用分支和绑定

使用分支定界会降低时间复杂度吗?

什么是分支定界中的最低成本搜索?

【问题讨论】:

【参考方案1】:

回溯

    它用于查找问题的所有可能解决方案。 以DFS(深度优先搜索)方式遍历状态空间树。 它意识到自己做出了错误的选择,并通过备份撤消了最后的选择。 它搜索状态空间树,直到找到解决方案。 涉及可行性函数

分支绑定

    用于解决优化问题。 它可以以任何方式遍历树,DFS 或 BFS。 它意识到它已经有了预解决方案导致的更好的最优解决方案,因此它放弃了该预解决方案。 它完全搜索状态空间树以获得最优解。 它涉及一个边界函数

【讨论】:

回溯是否总能找到最优解? 是的,总是给出最好的解决方案。 @AbhishekDey 实际上,回溯会给出 a 解决方案,不一定是最佳解决方案。回溯最适合约束满足问题,分支定界最适合优化问题。 @CameronGagnon 明确地说,回溯保证理论上的最优性,因为它会探索所有解决方案,只修剪那些它确实知道的解决方案不可能是最优的。当然,在实践中,如果组合的数量是指数的并且不可能进行智能修剪,那么该算法可能会永远用于中型到大型实例。【参考方案2】:

回溯

回溯是解决离散约束满足问题 (CSP) 的一般概念。它使用 DFS。一旦到了很明显无法构建解决方案的地步,它就会回到有选择的最后一点。这样它会迭代所有潜在的解决方案,有时可能会提前中止。

分支绑定

Branch-and-Bound (B&B) 是解决离散约束优化问题 (COP) 的概念。它们与 CSP 类似,但除了具有约束之外,它们还具有优化标准。与回溯相比,B&B 使用广度优先搜索。

名称的一部分,即 bound,指的是 B&B 修剪可能解决方案空间的方式:它获得了一个获得上限的启发式方法。如果无法改进,可以丢弃 sup-tree。

除此之外,我看不出与回溯有什么不同。

其他来源

网络上还有其他答案的说法截然不同:

Branch-and-Bound 正在回溯修剪 (source)

【讨论】:

【参考方案3】:

回溯

回溯是一种通用算法,用于找到一些计算问题的所有(或部分)解决方案,特别是约束满足问题,它逐步构建解决方案的候选者,并放弃每个部分候选者 c(“回溯”)作为一旦它确定 c 不可能完成到一个有效的解决方案。 它列举了一组部分候选者,原则上,这些部分候选者可以以各种方式完成,从而为给定问题提供所有可能的解决方案。完成是通过一系列候选扩展步骤逐步完成的。 从概念上讲,部分候选者表示为树结构潜在搜索树的节点。每个部分候选者是与其相差一个扩展步骤的候选者的父节点,树的叶子是不能进一步扩展的部分候选者。 它以深度优先顺序 (DFS) 从根向下递归遍历此搜索树。它意识到自己做出了错误的选择,并通过备份撤消了最后的选择。 更多详情:Sanjiv Bhatia's presentation on Backtracking for UMSL.

分支和绑定

分支定界算法由通过状态空间搜索的候选解的系统枚举组成:候选解的集合被认为是形成一个以完整集为根的有根树。 算法探索此树的分支,这些分支代表解决方案集的子集。在枚举一个分支的候选解之前,该分支会根据最优解的估计上限和下限进行检查,如果它不能产生比目前由算法。 它可以通过以下任何方式遍历树:
    BFS (Breath First Search)或(FIFO)分支定界 D-Search(LIFO) Branch and Bound 最少计数搜索(LC)分支定界
欲了解更多信息:Sanjiv Bhatia's presentation on Branch and Bound for UMSL。

【讨论】:

【参考方案4】:

回溯: -从解空间中选择最优解。 - 遍历 DFS。 分支和绑定: -BFS 遍历。 - 这里只生成富有成效的解决方案,而不是生成所有可能的解决方案。

【讨论】:

以上是关于“回溯”和“分支和绑定”之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

背包分支和绑定

值和绑定之间的区别

“使用”和“重新绑定”变量之间的含义和区别是啥?

WSDL中SOAP绑定和HTTP绑定之间的区别

common-lisp:绑定和符号之间的区别

数据表和绑定源/数据适配器之间的区别?