这是问题所在。我有一个大小为1的矩形画布。所以它的坐标系为(0.0 ... 1.0 - x和0.0 ... 1.0 - y)。
我也有一些瓷砖。瓷砖也是矩形。它们具有不同的尺寸,并且瓷砖的数量是变量。
我想在矩形画布中堆叠切片,从0.0到1.0(从左到右,从上到下):
1)瓷砖必须适合画布(但尽可能多地填充空间)
2)瓷砖必须缩放(如果它们不合适),每个瓷砖应按相同的比例缩放(它们必须保持相同的比例)。
3)想象你手中有这个“瓷砖”,然后将它们一个接一个地放入这个画布
4)它几乎像“TreeMap算法”但是 - 瓷砖的形状必须相同(矩形)和我不需要填充画布的所有空间
有没有人可以用任何C语言(C,C ++,Java,C#)向我展示算法?
*我试过了。
1)我计算了瓷砖的面积,然后我计算了瓷砖面积的总和(例如:我有两个瓷砖,一个面积为2,其他面积为1,它们的意思是我的总和为3)< / p>
2)然后我计算每个瓷砖在“总面积”中的“比例”(例如:2/3和1/3)
3)然后通过Math.sqrt(x)计算矩形图块的大小(例如:Math.sqrt(2/3))
4)然后逐个绘制瓷砖......
但这总是不起作用。有时我会让瓷砖没有画布.. *
答案 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)