我需要帮助构建一个针对以下问题的算法。
我有一组 G 点可以“看到”其他点 C 。需要一个算法来查找 G 中涵盖所有 C 的最小集合( G 不一定是 C 的一部分)。
我觉得这应该通过动态编程来解决。但我对任何可以帮助我的解决方案/想法持开放态度。
谢谢!
修改1:
我可能没有完全理解这个问题。
这些点位于三维表面上 - 具有地形高度。地形可能会在点之间达到一定高度,使得它无法看到另一点。只要有直接的视线,无论距离多远,这些点都可以看到对方。
如果点 a (来自 G )可以看到点 b (来自 C ) - 并指向 b 可以看到 d (来自 C ),然后 a 可以看到 d 。不确定这会产生什么影响。
如果只有 a (来自 G )可以看到 b (来自 C ),我们必须选择 a 以覆盖所有 C - 所以在使用贪婪算法之前最好这样做。
仍然在考虑新信息是否存在其他差异。
答案 0 :(得分:2)
您的问题称为Set cover problem。它是NP完全的。
我会使用贪婪的日志( n )近似算法。它在每个步骤中选取(G)中的元素,其中包含(C)中仍未覆盖的最大点数。
互联网上发现的大多数讲义只显示了上述的近似算法。
很难比上面的算法做得更好,正如Lund& amp; Yannakakis(1994)。您可以在维基百科文章中找到参考文献。
您还可以使用集合覆盖问题的等效整数线性问题公式。但是你再次获得了log(n)近似算法。
还有其他近似算法,但大多数是在研究论文中,所以他们的描述并不是很容易理解。你可以找到他们只是谷歌搜索“近似算法集盖”
我不知道是否有经验法则可以知道问题是NP完全的还是已知问题的变体,而现有的解决方案使用动态编程。但我发布了一个问题here。
关于仅 a (来自 G )可以看到 b (来自 C )的情况,贪婪算法无论如何都会选择 a ,因为只有在看到 C 的所有点时它才会停止。算法选择点的顺序不会改变解决方案。
如果点 a (来自 G )可以看到点 b (来自 C ) - 并指向 b 可以看到 d (来自 C ),然后可以看到 d ,不允许出现问题要建模广告planar graph。对于您的问题,平面图具有更好的近似算法,优于贪婪算法。