【问题标题】:Find smallest irregular polygon from combination of vertices (Performance Critical)从顶点组合中找到最小的不规则多边形(性能关键)
【发布时间】:2011-09-10 19:02:47
【问题描述】:

我需要在二维平面上的几个顶点中找到一个表面积最小的不规则多边形。

不,这不是家庭作业。虽然我希望我现在回到学校。

关于如何构造多边形有一些要求。假设我在 8x8 网格上绘制了 3 种不同类型的顶点(红色、绿色、蓝色)。我需要扫描这个网格中满足红、绿、蓝组合要求的所有顶点,然后选择表面积最小的那个。

获取不规则多边形的表面积很简单。我主要关心高效扫描所有可能组合的性能

请参见下图作为示例。这三种类型都用于制作多边形,但圈出的那一种表面积最小,是我的目标。

与我尝试制作原型的情况相比,这种情况得到了简化。多边形将由数十个(如果不是数百个)顶点构成,并且网格将更大。此外,这将是一个 24/7 运行的进程。

我在想也许我应该按类型组织顶点并将它们分成单独的数组。然后只需以分层方式迭代数组以计算所有组合的表面积。然而,这种方法似乎很浪费。

【问题讨论】:

    标签: c# algorithm math data-structures


    【解决方案1】:

    这是一个基于分支和绑定的版本,有一些花哨。

    1) 将网格分解为四叉树,并根据需要在节点中添加注释。

    2) 在四叉树中找到具有每种类型节点之一的最低节点。这为您提供了一个起始解决方案,它至少应该足以加快其余搜索的速度。

    3) 进行递归搜索,在我猜测的地方获取所有可能的分支,在适用的情况下首先选择最有希望的候选者:

    3a) 猜一个最不常见类型的顶点。

    3b) 使用四叉树中点的相对位置来排序你的猜测,猜测下一个最不常见类型的顶点,以便从原始点的距离递增的顺序猜测它们......

    3z) 你有一套完整的顶点。

    在每个步骤 3?您有一组部分顶点,我认为它为您提供了包括这些顶点在内的任何完整解决方案区域的下限(它是顶点凸包内的区域吗?)。您可以丢弃任何已经至少与迄今为止最大的解决方案一样大的部分解决方案。如果您可以接受 X% 不准确的答案,您可以丢弃目前最大解决方案 X% 范围内的任何部分解决方案。希望这可以修剪您在 (3) 中导航的可能性之树,使其易于处理。

    【讨论】:

    • 根据我对这个解决方案的理解,可能会评估错过的组合。在我的场景中,这不是一个选项
    • 如果您设置 X=0 并且下限是否准确,您不应该错过最佳答案 - 这完全取决于您所说的面积。只有当部分解决方案已经使用了与迄今为止最佳解决方案一样多的区域时,您才会丢弃部分解决方案。如果面积是凸包的面积,那么从丢弃的部分解决方案产生的任何完整解决方案都必须使用至少这么多面积,因此不能比目前找到的最佳解决方案更好。
    • 我真的很喜欢你的想法。
    【解决方案2】:

    如何选择具有最少顶点数的颜色,并检查每个相邻的颜色,如果在该相邻区域内没有其他颜色,则增加模板尺寸(选择顶点周围的下一个环),然后再次检查.直到至少一个顶点,在当前模具中具有所有其他颜色。如果有多个,您只需比较它们(简单的最小缩减)即可找到最小的一个。

    【讨论】:

    • 您以这种方式找到的组合可能没有最小的正方形。考虑目标多边形又窄又长的情况。
    • @Dmitry,我很担心。
    • 如果你说的是封闭区域,是的。我以为您正在寻找多边形的最小表面(边的总和)。
    【解决方案3】:

    这是在 O(n2 log n) 时间内找到最小三角形的方法。或许对你有用。

    高级想法是使用旋转扫描线。在二叉搜索树中,我们始终保持沿垂直于扫描线的轴的蓝点的顺序。当扫掠线与穿过红绿线对的线平行时,我们使用 BST 寻找最接近红绿线的蓝点。

    与往常一样,我们使用事件驱动的扫描线模拟。对于每对红绿对,为其角度制作一种事件。对于每对蓝点,当它们的相对顺序发生变化时,使另一种事件的 O(1)。对所有事件进行排序并转动曲柄。

    【讨论】:

      【解决方案4】:

      如果我们已经找到了一个区域A,我们可以缩小搜索范围。

      三角形的面积是B*h(底乘高)。

      如果你找到两个点,那么B就是它们之间的距离。

      然后我们可以搜索距离该线最多为A/B (B*h < A => h < A/B) 的点。这与在平行于我们已有的两个点的两条线之间搜索相同,它们被替换为A/B-A/B

      这应该给出O(n^2*k) 的复杂度,其中 k 是网格的宽度或高度。

      如果您不提取坐标,则必须执行 O(k^5) 搜索,这至少比您之前必须执行的 O(k^6) 更好。

      再分析一下:如果 p 是一个单元格包含一个顶点的概率,那么复杂度是:O(k^2p(k^2p(kp))) = O(k^5p^3)。 如果p=n/k^2,其中n 是节点数,我们就得到O(n^3/k)

      【讨论】:

        猜你喜欢
        • 2010-10-11
        • 1970-01-01
        • 1970-01-01
        • 2010-10-03
        • 1970-01-01
        • 2013-07-17
        • 2012-04-15
        • 2012-12-17
        • 1970-01-01
        相关资源
        最近更新 更多