Algorithm 平铺(可伸缩)堆叠算法

Algorithm 平铺(可伸缩)堆叠算法,algorithm,tiles,rectangles,Algorithm,Tiles,Rectangles,问题就在这里。我有长方形的画布,大小为1。所以它的坐标系是(0.0…1.0-x和0.0…1.0-y) 我还有一些瓷砖。瓷砖也是长方形。他们有不同的大小和瓷砖的数量是一个变量 我想在矩形画布中堆叠瓷砖,从0.0到1.0(从左到右,从上到下): 1) 瓷砖必须适合画布(但要尽可能填满空间) 2) 瓷砖必须缩放(如果它们不合适),每个瓷砖应按相同的比例缩放(它们必须保持相同的比例) 3) 想象一下,你手里拿着这个“瓷砖”,然后你把它们一个接一个地放到画布上 4) 它几乎像“树形映射算法”但是-瓷砖的形

问题就在这里。我有长方形的画布,大小为1。所以它的坐标系是(0.0…1.0-x和0.0…1.0-y)

我还有一些瓷砖。瓷砖也是长方形。他们有不同的大小和瓷砖的数量是一个变量

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

1) 瓷砖必须适合画布(但要尽可能填满空间)

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

3) 想象一下,你手里拿着这个“瓷砖”,然后你把它们一个接一个地放到画布上

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

<强>有没有人能在任何C语言中(C、C++、爪哇、C)给出一个算法?< /强> < /P> *我试过这个

1) 我计算了瓷砖的面积,然后我计算了瓷砖面积的总和(例如:我有两块瓷砖,一块面积为2,另一块面积为1,这意味着我的总面积为3)

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

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

4) 然后一块一块地画瓷砖


但这并不总是有效的。有时,我会让瓷砖脱离画布。*

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


尝试蒙特卡罗算法:

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

所有随机磁贴选择都应根据磁贴的面积进行加权,以便您倾向于先放置较大的磁贴。

这可能是一个打包问题,但如果我们试图完全按照描述的方式解决此问题,则情况并非如此。换言之,没有解决方案,因为同样,正如所描述的,问题中没有问题。若我们只有一个盒子和一套固定的瓷砖,并且要求它们都必须装入盒子,那个么就并没有优化的余地。 我可以看到几个相关的优化问题: 一,。给定必须装入相同或不同尺寸箱子的固定瓷砖组,找到最佳包装顺序,以便使用最少数量的箱子。 二,。给定任意大小的单个盒子和一组瓷砖,找到适合盒子的最佳(最大)瓷砖集。 三,。给出一个盒子和一套瓷砖-回答是否可以将它们放入盒子中的问题

你想解决哪一个问题


现在设置问题的方式毫无意义,因为无论您将瓷砖按何种顺序放置在盒子中,它们都将始终使用相同的空间量,无论它们如何排列,只要它们都适合,当然。

我不认为这是一个(箱子)装箱问题,因为我为1D箱子装箱问题编写了一个。我认为这里的问题是通过二维下料问题解决的,也许还有二维装箱。你想做的就是尝试一下克纳普萨克问题。这个问题很难解决(NP),而且没有解决方案。这有点像旅行推销员问题,解决方案的数量与城市的数量成指数关系。如果您可以将ccomplexity简化为1D问题,您可以在phpclasses.org上尝试我的装箱算法

正如其他人指出的-问题描述不太清楚。但我假设您可以根据需要缩放每个磁贴(至少您的示例显示磁贴缩放是可能的)。因此,我的解决方案很简单(但可能不是您想要的或最佳的):

  • 按系数缩放每个瓷砖:边缘空间/(边缘*N½)
  • EDGEspace / (EDGEtile * N ½)
  • 将每个磁贴放置在当前行中,如果磁贴超出空间限制,请前进到下一行
此处
N
最接近于瓷砖总数

p、 如果你需要一些瓷砖之间的间距-只需使上面的比例因子小一点


希望这有帮助。

您没有给出任何优化标准。一种算法是将瓷砖水平排列成一行,顶部对齐,然后缩放该行,使最高的瓷砖和瓷砖宽度之和保持一致。。我将重复我的自我我想在矩形画布上堆叠瓷砖,从0.0到1.0(从左到右,从上到下)你的例子和你的描述一样令人困惑。看起来你根本没有在堆放东西。也许这个词的意思和你想的不一样。另外,@Ted是对的。把你所有的瓷砖缩小到一个无限小的比例,然后把它们排成一行。如果没有优化功能,这是完全合法的。这张图片太难看了:)我只想把瓷砖放在矩形画布中,我想尽可能多地填充空间,同时保存瓷砖比例。。我怎么能说得更简单呢?关于其他标准的建议:您希望尽可能多地填充空间,并且每个瓷砖都应该按相同的比例缩放。听起来合理吗?不。。瓷砖的形状必须相同(矩形)。在你的例子中,形状改变了…你是对的<代码>4)它几乎像“TreeMap算法”,但-瓷砖的形状必须相同(矩形),我不需要填充画布的所有空间运行TreeMap算法,然后收缩每个矩形,直到其瓷砖的比例正确(相当于缩小瓷砖)我有一组大小不同的矩形瓷砖。我希望将它们放置在一个矩形容器中(无重叠),以使填充面积百分比最大化。必须使用所有瓷砖。磁贴计数是可变的。磁贴可以装入容器,也可以不装入容器。如果所有瓷砖都能装入一个容器,那么无论您如何排列它们,它们都会占用完全相同的空间<你是想找到瓷砖的排列方式吗