【问题标题】:Packing rectangles for compact representation包装矩形以实现紧凑表示
【发布时间】:2010-09-14 06:22:15
【问题描述】:

我正在寻找解决以下问题的指针:我有一组矩形,它们的高度和 x 位置也是已知的,我想将它们打包成更紧凑的形式。通过一点绘图(所有矩形的宽度相同,但在现实生活中宽度可能会有所不同),我想要,而不是。

-r1-
  -r2--
     -r3--
       -r4-
        -r5--

类似的东西。

-r1-  -r3-- 
  -r2-- -r4-
         -r5--

所有提示将不胜感激。我不一定在寻找“最好的”解决方案。

【问题讨论】:

  • 所以基本上你想确定第一个可用的 y 位置来绘制一个矩形?
  • 您是要打包还是优化打包?
  • 看起来 x 位置不可更改,但 y 位置是?
  • 我很难理解这个问题。也许更好的图形会有所帮助。
  • 我认为整个想法是最小化行数,并有效地利用每一行的空间。假设所有矩形的高度相同。给定所有矩形的 X 位置并固定。但是,可以更改 Y 坐标。

标签: algorithm packing rectangles


【解决方案1】:

这样的?

  • 按 x 位置对矩形集合进行排序
  • 编写一个方法来检查在 x 轴的某个间隔上存在哪些矩形

    Collection<Rectangle> overlaps (int startx, int endx, Collection<Rectangle> rects){
    ...
    }
    
  • 遍历矩形集合

    Collection<Rectangle> toDraw;
    Collection<Rectangle> drawn;
    foreach (Rectangle r in toDraw){
    Collection<Rectangle> overlapping = overlaps (r.x, r.x+r.width, drawn);
    int y = 0;
    foreach(Rectangle overlapRect in overlapping){
    y += overlapRect.height;
    }
    drawRectangle(y, Rectangle);
    drawn.add(r);
    }
    

【讨论】:

  • 除此之外,是的,我认为这是一个正确的算法。我认为这是最优的,如果矩形高度相同并且 x 坐标(我认为是调度算法中的开始时间?)是固定的。
  • 我的矩形的高度并不完全相同,x 坐标是真正的空间坐标,没有时间坐标,但你说得对,它对问题没有任何改变。
  • 四个空格不起作用,但是 pre 和 code 标签可以。至于内部for循环中确定的高度问题。如果高度是固定的,您还可以将高度乘以重叠元素的数量来计算 y 位置。
  • 区分矩形的左边缘还是右边缘很重要。按其右边缘排序对于相应的调度问题是最优的。
【解决方案2】:

我以前曾解决过这样的问题。最直观的图片可能是大矩形在底部,较小的矩形在顶部,有点像将它们全部放入容器中并摇晃它,使重的矩形落到底部。因此,要做到这一点,首先按面积(或宽度)递减的顺序对数组进行排序——我们将首先处理大项目并构建图片。

如果我理解正确的话,现在的问题是将 y 坐标分配给一组给出了 x 坐标的矩形。

遍历矩形数组。对于每个矩形,将矩形的 y 坐标初始化为 0。然后通过增加该矩形的 y 坐标进行循环,直到它不与任何先前放置的矩形相交(您需要跟踪先前放置的矩形)。提交您刚刚找到的 y 坐标,然后继续处理下一个矩形。

【讨论】:

    【解决方案3】:

    Topcoder 有一个比赛来解决这个问题的 3D 版本。获胜者讨论了他的方法here,这对你来说可能是一本有趣的书。

    【讨论】:

      【解决方案4】:

      您的问题是一个更简单的变体,但您可能会获得一些关于为“装箱”问题开发的启发式方法的提示。关于这方面的文章很多,但this page 是一个好的开始。

      【讨论】:

      • 我第一次投票给你,但再次阅读问题,如果他的 x 坐标已设置,他没有 NP 难题。根据矩形的高度是否都相同,可以通过类似Jasper的算法来解决。
      【解决方案5】:

      矩形的高度是否相同?如果它们是,问题只是将每个矩形放在哪一行,那么问题归结为对所有矩形对 (X,Y) 的一系列约束,形式为“矩形 X 不能与当矩形 X 在 x 方向与矩形 Y 重叠时,矩形 Y"。

      用于此的“贪心”算法从左到右对矩形进行排序,然后将每个矩形依次分配给它适合的编号最小的行。因为矩形是从左到右处理的,所以只需要关心当前矩形的左手边是否会与其他矩形重叠,这在一定程度上简化了重叠检测算法。

      我无法证明这是给出了最优解,但另一方面也想不出任何反例。有人吗?

      【讨论】:

      • 具体来说,当“从左到右”对矩形进行排序时,您应该按照它们的 最右边 端点进行排序。我也不确定这是否为相同高度问题提供了最佳解决方案,但它为密切相关的调度问题提供了最佳解决方案,即最大化可以完成的任务数量。
      【解决方案6】:

      将类似俄罗斯方块的游戏放入您的网站。根据您的参数生成掉落的块和游戏区域的大小。根据设计的紧凑性(更少的可用空间 = 更多积分)向玩家奖励积分。让您的网站访问者为您执行工作。

      【讨论】:

      • 最好的分布式计算 :) 让我们称之为“人脑云”:)
      • 这可能是一个很好的解决方案,但我怀疑我是否能找到足够的工人,有足够的时间。谢谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-23
      • 2015-03-26
      • 2022-01-24
      • 2012-01-07
      • 1970-01-01
      相关资源
      最近更新 更多