我通常不会就 SO 提出问题,所以如果这个问题似乎不适合 SO,请告诉我(当然,我们仍然会感谢您的帮助)。
我还是一名学生,目前正在学习算法课程。我们最近了解了分支定界范式,由于我没有完全理解它,所以我尝试在我们的课本中做一些练习。我遇到了一个特殊的 Set Cover 问题实例:
令 U 是一组元素,S = {S1, S2, ..., Sn} 是 U 的一组子集,其中所有集合 Si 的并集等于 U。概述分支定界算法以找到最小S 的子集 Q,因此对于 U 中的所有元素 u,Q 中至少有两个集合,其中包含 u。具体来说,详细说明如何将问题分解为子问题以及如何计算上限和下限。
我的第一个想法是按降序对 S 中的所有集合 Si 进行排序,根据它们包含的元素数量,这些元素还没有被当前选择的 S 的子集覆盖至少两次,所以我们当前的 Q 实例。考虑递归解决这个问题,我按排序顺序选择第一个集合 Si 并进行一次递归调用,在其中我取这个集合 Si 和一个我没有的地方(意味着从那些递归调用开始,不再考虑子集) . 如果我选择它,我将遍历这个所选子集 Si 中的每个元素并为其所有元素增加一个计数器(在递归调用之前),这样我最终会知道,当一个元素已经被两个或更多选择的元素覆盖时子集。由于我为每个递归调用对未选择的集合 Si 进行排序,理论上(至少在我看来)我会一直做出目前最好的选择。而且由于我基本上创建了递归调用的二叉树,因为我总是使用当前选择的最佳子集进行一次调用,而我最终会覆盖所有 2^n 的可能性,这意味着最终我会找到最佳的解决方案。
我现在的问题是我不知道或者更确切地说我将如何实现上限和下限的启发式算法,因此算法可以丢弃二叉树中的一些路径,这永远不会比当前最好的 Q 更好。将不胜感激我能得到的任何帮助。