我对分支和绑定算法进行了测试。我从理论上理解了该算法的工作原理,但是找不到能说明该算法如何实际实施的示例。
我发现了一些例子,如这一个 ,但我仍然感到困惑了。我也寻找旅行商的问题,我听不懂。
我需要的是一些问题,以及如何通过使用分支定界法来解决这些问题。
我对分支和绑定算法进行了测试。我从理论上理解了该算法的工作原理,但是找不到能说明该算法如何实际实施的示例。
我发现了一些例子,如这一个 ,但我仍然感到困惑了。我也寻找旅行商的问题,我听不懂。
我需要的是一些问题,以及如何通过使用分支定界法来解决这些问题。
Answers:
让我们将Branch and Bound应用于Knapsack,希望这会使您明白这个概念。
我们有项目,标记为1到n。v 我是的值我个项,和瓦特我其重量。我们尝试将它们装在一个背包中,该背包总共可容纳最多T的重量,并且尝试将放入背包中的物品的价值之和最大化。
普通的回溯方法是我们的基础。我们首先将放入包中,然后通过递归解决其余n − 1项的问题。然后,从包装中删除v 1并再次解决其余n − 1项的问题,然后返回找到的最佳配置。
回溯是Branch and Bound的“分支”部分。您有两种情况(就背包问题而言):“项目是解决方案的一部分”和“项目i不属于解决方案的一部分”。您可以将其可视化为二叉树,其中左子级是一种情况,右子级是另一种情况。该树是搜索树(或搜索空间):其深度为n,因此具有O (2 n)个节点。因此,该算法的运行时间与项目数成指数关系。
现在我们进入“绑定”部分:我们试图找到标准,以便我们可以说“此配置永远无法实现,因此我们也不必理会它”。这样的标准的一个例子是“我们已经放入背包的物品的重量超过 ”:如果我们向背包中添加了前n / 2个物品,因此它已经满了,没有点试图把项目ñ / 2 + 1通过对ñ在背包为好,但也有在努力适应的任何子集没有一点ñ / 2 + 1通过对ñ在背包里,因为已经装满了,所以我们节省了大约箱。另一个例子是“ 即使我把所有剩余的物品都放进去,我放进去的物品的价值也不会超过我到目前为止找到的最佳配置 ”。
这些条件实质上是切断了搜索树的一部分:例如,在某个节点上,“左子树不会为我提供更好的配置,因为X”,因此您会忘记该子树,而不会进行探索。这样切出的深度为的子树可以节省O (2 d)个节点,如果幸运的话,这可以大大提高速度。
请注意,这被称为“ 边界 ”,因为它通常涉及某种下限或上限:对于准则“,即使我输入了所有其余项目,我输入的项目的价值也不会超过最佳配置到目前为止,我已经发现 ',到目前为止,最佳配置的值是最佳配置的下限,因此,永远不会超过该下限的任何事物注定会失败。
您可以根据需要使“边界”部分复杂。例如,整数编程问题通常是使用松弛来解决的:将程序松弛为线性程序,可以在多项式时间内求解,然后就可以丢弃很多情况,因为二进制变量永远都不会起作用。然后,您将转到其余选项。
请注意,Branch and Bound通常只会在实践中加快速度,而在理论上却不会:很难确切地说出使用启发式方法可以减少多少搜索树。实践中针对此类问题使用的不同启发式方法的数量证明了这一点。如果您不走运,即使有很多边界,其余的搜索树仍然很大。
考虑调度,这是将具有一定持续时间和期限的作业分配给计算机的任务。我们假设时间是离散的。许多此类问题都是NP(O)难题。
该问题的决策版本是NP-hard;这可以从3PARTITION中减少看到。
有趣的是,如果我们允许抢占,即交换现役工作,则可以通过最早到期日优先启发式(在修改的到期日)以二次时间解决问题。不难看出,此变体的最优解不会比原始问题的最优解差。
现在,为了将Branch&Bound应用于此问题,我们需要修复一些参数:
您必须针对B&B的每个应用程序执行此操作。
执行上面指定的B&B,会发生以下情况:
此GIF不会循环播放。将其重新加载到新标签中,从头开始查看。
[ 来源 ] [ 静态版本 ]
请注意,在41个节点中,只有四个被正确访问,并且仅十个节点计算了下限。