【问题标题】:Object Positioning Algorithm对象定位算法
【发布时间】:2009-11-25 20:13:19
【问题描述】:

我想知道这个问题是否有“最佳”解决方案:

我有一个 n x m(像素)大小的空间,上面有 p 个预先存在的矩形 - 上面有各种大小的对象。现在我想在这个空间中放置 q 个(相同大小的)新对象,而不会有任何重叠。

我想出的算法:

  1. 创建大小为[(n)/(size_of_object_from_q)]x[(n)/(size_of_object_from_q)]的数组A[][]
  2. 从 p 中迭代所有元素并为每个元素:

    mark all fields in A[][] as occupied, where the element "lies"

  3. 将 q 中的所有元素放在 A[][] 中的字段未标记的相应位置

(男孩,我希望我能理解这一点......)

有没有更好的方法来做到这一点?任何帮助将不胜感激!

【问题讨论】:

  • 澄清一下,您不能重新定位现有对象,对吗?
  • 您的“q 个相同大小的新对象”是什么形状?它们都是矩形吗?你可以旋转它们吗?

标签: algorithm object partitioning


【解决方案1】:

从互联网上的简短搜索来看,最佳矩形包装似乎是一个NP-hard 问题。 我猜学术界的聪明人为此找到了一些近似算法,所以它是谷歌搜索的一个选择。

但我会先尝试使简单的方法起作用:

  1. 根据对象的宽度将对象分成大小
  2. 尝试将它们从最大到最小逐行放置。

我的猜测是,在许多情况下,这种幼稚的解决方案会奏效。

【讨论】:

    【解决方案2】:

    如果我理解这个问题,听起来您正在寻找一种“最佳”装箱算法(又名背包问题)。这是一个 NP 完全问题,尽管您的描述听起来像是您可能会蛮力地找到最佳解决方案。

    【讨论】:

      【解决方案3】:

      我知道这不是您问题的具体答案,但它可能对研究和/或深入研究graphviz 源代码很有用。 graphviz 提供了许多布局模型,包括尝试最小化全局能量函数的neato。

      维基百科有一些force-base algorithms 的伪代码。

      【讨论】:

        猜你喜欢
        • 2010-11-06
        • 1970-01-01
        • 1970-01-01
        • 2019-08-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-19
        相关资源
        最近更新 更多