【发布时间】:2021-08-29 04:56:48
【问题描述】:
我一般不会就 SO 提出问题,所以如果这个问题似乎不适合 SO,请告诉我(当然,我们仍会感谢您的帮助)。
我还是一名学生,目前正在学习算法课程。我们最近了解了分支定界范式,由于我没有完全理解它,所以我尝试在我们的课本中做一些练习。我遇到了一个特殊的 Set Cover 问题实例:
令 U 是一组元素,S = {S1, S2, ..., Sn} 是 U 的一组子集,其中所有集合 Si 的并集等于 U。概述分支定界算法求 S 的最小子集 Q,使得对于 U 中的所有元素 u,Q 中至少有两个集合,其中包含 u。具体来说,详细说明如何将问题分解为子问题以及如何计算上下界。
我的第一个想法是按降序对 S 中的所有集合 Si 进行排序,根据它们包含的元素的数量尚未被当前选择的 S 的子集覆盖至少两次,因此我们当前的 Q 实例。然后我正在考虑递归地解决这个问题,我按排序顺序选择第一个集合 Si 并进行一个递归调用,我在其中使用这个集合 Si 和一个我没有的地方(意味着从那些递归调用开始,子集是 no考虑时间更长)。如果我选择它,我将遍历这个选定子集 Si 中的每个元素并为其所有元素增加一个计数器(在递归调用之前),这样我最终会知道,当一个元素已经被两个或更多选择的元素覆盖时子集。由于我为每个递归调用对未选择的集合 Si 进行了排序,因此理论上(至少在我看来)我总是会做出目前最好的选择。而且由于我基本上创建了递归调用的二叉树,因为我总是使用当前选择的最佳子集进行一次调用,而在我没有选择的情况下,我最终会涵盖所有 2^n 种可能性,这意味着最终我会找到最佳的解决方案。
我现在的问题是我不知道或者更确切地说我将如何实现上限和下限的启发式,所以算法可以丢弃二叉树中的一些路径,这永远不会比当前最好的路径更好问:如果能得到任何帮助,我将不胜感激。
【问题讨论】:
-
一个通用的答案是使用线性规划来获得下限,并使用贪心算法来获得上限。实际上,我通常甚至不会费心评估独立的上限,而是支持使用最佳优先回溯的深度优先搜索。
标签: algorithm divide-and-conquer branch-and-bound set-cover