平铺(可扩展)堆叠算法

时间:2011-03-07 15:33:55

标签: algorithm tiles rectangles

这是问题所在。我有一个大小为1的矩形画布。所以它的坐标系为(0.0 ... 1.0 - x和0.0 ... 1.0 - y)。

我也有一些瓷砖。瓷砖也是矩形。它们具有不同的尺寸,并且瓷砖的数量是变量。

我想在矩形画布中堆叠切片,从0.0到1.0(从左到右,从上到下):

1)瓷砖必须适合画布(但尽可能多地填充空间)

2)瓷砖必须缩放(如果它们不合适),每个瓷砖应按相同的比例缩放(它们必须保持相同的比例)。

3)想象你手中有这个“瓷砖”,然后将它们一个接一个地放入这个画布

4)它几乎像“TreeMap算法”但是 - 瓷砖的形状必须相同(矩形)和我不需要填充画布的所有空间

here is what i want to get

有没有人可以用任何C语言(C,C ++,Java,C#)向我展示算法?

*我试过了。

1)我计算了瓷砖的面积,然后我计算了瓷砖面积的总和(例如:我有两个瓷砖,一个面积为2,其他面积为1,它们的意思是我的总和为3)< / p>

2)然后我计算每个瓷砖在“总面积”中的“比例”(例如:2/3和1/3)

3)然后通过Math.sqrt(x)计算矩形图块的大小(例如:Math.sqrt(2/3))

4)然后逐个绘制瓷砖......

但这总是不起作用。有时我会让瓷砖没有画布.. *

5 个答案:

答案 0 :(得分:4)

这似乎是一个打包问题,但是如果我们试图完全按照它描述的那样解决这个问题。换句话说,没有解决方案,因为在描述的问题中再次没有问题。如果我们只有一个盒子和一组固定的瓷砖,并且要求它们必须装入盒子中,那么就没有优化空间。 我可以看到几个相关的优化问题:

1。给定必须打包到相同或不同尺寸的盒子中的固定瓷砖组,找到最佳包装顺序,以便使用最少数量的盒子。

2。给定任意大小和一组图块的单个框,找到可以放入框中的最佳(最大)图块集。

3。给出一个盒子和一组瓷砖 - 如果可以将它们放入盒子中,则回答问题。

你想要解决哪一项?

现在设置问题的方式毫无意义,因为无论你将瓷砖放在盒子里的哪个顺序,无论它们如何排列,它们总是会使用相同数量的空间,只要它们全部适合当然。

答案 1 :(得分:2)

尝试monte-carlo算法:

Repeat until result is good enough or until you aren't seeing any improvement
  Select (with removal) a random first tile
  Place the first tile at a random position
  Repeat until no remaining tiles
    Select (with removal) a random tile
    Place it adjoining to the existing "tile blob" 
      (you might have to do a search here to find the best place to plug it in)
  Check to see if you have a new best filled-area percentage

所有随机图块选择都应该按照图块的区域进行加权,这样您就可以先放置较大的图块。

答案 2 :(得分:2)

我不认为这是一个(bin)包装问题,因为我为1D bin-packing问题写了一个。我认为这里的问题是通过2D切割库存问题解决的,也许还有一个2D-bin-packing。你想要的是尝试knappsack问题。这个问题很难解决(NP)并且没有解决方案。这有点像Travelsalesman问题,其中解决方案的数量与城市数量呈指数关系。如果你可以将ccomplexity减少到1D问题,你可以在phpclasses.org上尝试我的bin-packing算法。

答案 3 :(得分:1)

正如其他人指出的那样 - 问题描述不是很清楚。但我假设您可以根据需要缩放每个图块(至少您的示例显示可以进行图块缩放)。所以我的解决方案很简单(但可能不是你想要的也不是最优的):

  • 按因子缩放每个图块:
    EDGEspace / (EDGEtile * N ½)
  • 如果图块超出空间限制,则将每个图块放在当前行中 - 前进到下一行。

此处N最接近perfect square大于或等于磁贴总数。

P.S。如果你需要在瓷砖之间留出一些间距 - 只需要使尺寸因子稍微小一点。

希望有所帮助。

答案 4 :(得分:0)

我不确定这是否是您想要的,但您可以查看TreeMap算法。

TreeMap

Wikipedia definition

C++ implementation