【问题标题】:Approximate Minimal Set Cover Python近似最小集覆盖 Python
【发布时间】:2014-11-16 22:06:36
【问题描述】:

我有一个列表列表,每个列表都包含多边形的边长。例如:

[[0, 1, 2],
 [0, 1.1, 2],
 [0, 1.2, 2],
 [0, 1.3, 2],
 [4.5, 1.1],
 [4.4, 1.1],
 [5, 1, 2],
 [5, 1.1, 2],
 [5, 1.2, 2]
 [6, 1, 7, 4],
 [6, 1.1, 7, 4.1]]

我希望能够找到一个近似最小的“覆盖”,因为对于“覆盖”的每个元素,它的所有值都在它所覆盖的元素的指定容差范围内。例如,如果给定上面的列表,我想得到的公差是 0.1:

[[0, 1, 2],
 [0, 1.2, 2],
 [4, 1],
 [4.5, 1.1],
 [5, 1.1, 2],
 [6, 1, 7, 4],]

我对 python 有点陌生,所以希望我对术语的使用不会太远。也许解释我的动机会有所帮助。我是一名试图优化给定表面面板的建筑师。由于制造公差,边缘长度相差某个固定值的面板可以被认为是相同的(在上面的示例中,所有边缘可以相差 0.1 并且仍然被认为是相同的)。我正在尝试找到可以生产的最少面板集,并且仍然可以对表面进行面板化。

【问题讨论】:

  • 您有没有尝试解决这个问题?请记住,这不是代码编写服务。
  • 您有一个子列表[4,1]。这意味着一个双边多边形。现在我很困惑
  • 您的所有最终值是否都是您的容差值的倍数(或者您愿意将它们转换成这样)?如果是这样,您可以简单地对值进行四舍五入,然后创建 set 以消除重复项。
  • inpectorG4dget - 我删除了你提到的那个子列表。我制作的列表仅显示输入和输出的示例,并非来自我的数据集。 [4,1] 子列表的主要原因是表明输入值在维度上有所不同。很抱歉造成混乱。
  • 罗杰,是的。我有一个解决方案,但它不是一个最小的列表。我的解决方案会给我 [5,1,2] 和 [5,1.2] 而不是 [5,1.1,2]。我环顾四周,这个问题似乎类似于几何圆盘覆盖问题(除了我的圆盘必须是最暗的球),不管我不明白我找到的关于这个问题的文件

标签: python set cover


【解决方案1】:

在这里找到最佳解决方案在计算上非常困难——您似乎在要求什么,但它不一定是完美的。

接下来,我将讨论针对 1D 情况提出的算法,理由是它更易于描述,但您可以将算法扩展到 3d。我将“范围”声明为 [min,max]。

对于每个点,请执行以下操作:
--检查范围列表以查看该点是否属于其中之一
----如果确实如此,请立即将该范围设为 [max(min,point-interval), min(max,point+interval)]。
----如果没有,添加一个新的范围[point-interval, point+interval]
完成后,您的输出点列表就是每个范围的中心。

这里的想法是将每个点表示为它适合的可接受范围。一旦你有了它,任何重叠范围都可以减少到它们的交点,因为该交点中的任何地方都是两个初始点都可以接受的。这个过程可以一直持续到剩下的范围不重叠为止。

【讨论】:

    猜你喜欢
    • 2016-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-18
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多