【问题标题】:How to select the minimal set of circles that covers another circle?如何选择覆盖另一个圆圈的最小圆圈集?
【发布时间】:2019-07-26 06:49:36
【问题描述】:

我正在寻找一些解决方案,给定一组具有 2D 中心点和半径的圆 S,在 S 中返回一个最小子集 M,该子集完全覆盖具有 2d- 的特定圆中心点和半径。最后一个圈子不在S

我选择了圆形,但我们将它们改为正方形、六边形等都没关系。

【问题讨论】:

  • 由于您添加了 cplex 标签:一个非常简单的近似是对圆进行光栅化,为每个输入圆添加一个布尔变量,并在目标圆覆盖的所有像素都为的约束下最小化它们的总和也被启用的任何其他圈子覆盖。

标签: python optimization geometry mathematical-optimization cplex


【解决方案1】:

你有两个不同的问题:你需要把几何问题变成一个组合问题,然后你需要解决这个组合问题。对于后者,您正在查看minimum set cover problem,并且应该有大量关于此的文献。就我个人而言,我喜欢 Knuth 的 Dancing Links 方法来枚举一组封面的所有解决方案,但我想对于单个最小解决方案你可以做得更好。 CPLEX 公式(以匹配您的标签)将为每一行使用一个二进制变量,并为每列使用一个 ≥1 的约束。

现在关于将几何学变成组合学。你所有圆圈的所有线条将飞机分成一堆区域。这些区域由线分隔。特别相关的是两个或多个圆圈相交的点。这些点之间的线的确切形状不太相关,您可能会想象将这些弧线拉直以提出更经典的平面图表示。因此,计算所有圆圈之间的所有成对交点。对单个圆by angle 的所有交点进行排序,并按该顺序将它们与图形边连接起来。对所有圈子都这样做。然后你可以做一种桶填充来确定每个圆的哪些图形面在里面,哪些在外面。

现在您有了用于设置覆盖的矩阵:大圆圈内的每个图形面都是您需要覆盖的列。每个圆圈都是一排,覆盖了其中一些面孔,你知道是哪一个。

【讨论】:

    猜你喜欢
    • 2021-11-04
    • 2011-03-10
    • 1970-01-01
    • 2018-12-15
    • 2021-06-24
    • 1970-01-01
    • 2012-11-12
    • 1970-01-01
    • 2019-04-25
    相关资源
    最近更新 更多