Algorithm 从中心开始用较小矩形填充大矩形的算法

Algorithm 从中心开始用较小矩形填充大矩形的算法,algorithm,geometry,greedy,knapsack-problem,Algorithm,Geometry,Greedy,Knapsack Problem,我有各种尺寸的矩形,我试着从中心开始把它们放进一个更大的矩形中。下面你会发现我创建的一个动画,它直观地描述了需要发生的事情 我一直在努力想出一种方法来模拟这种行为。是否存在类似的情况?我只需要被指向正确的方向 以下是一个非常粗略的解释: 初始化 从n矩形开始 按密度排序(它们实际上是3d立方体鸟瞰图) 将第一个矩形置于中心 剩余矩形(尽可能多地容纳) 试着将最高密度集中在中心,向外移动 Dimensions = { width: 400, height: 300 } Boundries =

我有各种尺寸的矩形,我试着从中心开始把它们放进一个更大的矩形中。下面你会发现我创建的一个动画,它直观地描述了需要发生的事情

我一直在努力想出一种方法来模拟这种行为。是否存在类似的情况?我只需要被指向正确的方向

以下是一个非常粗略的解释:

初始化

  • n
    矩形开始
  • 按密度排序(它们实际上是3d立方体鸟瞰图)
  • 将第一个矩形置于中心
剩余矩形(尽可能多地容纳) 试着将最高密度集中在中心,向外移动

Dimensions = { width: 400, height: 300 }
Boundries = {
  WEST = 0,
  EAST = Dimensions.width,
  NORTH = 0,
  SOUTH = Dimensions.height
}

// each rectangle has width, height, and other information
rectArr = Array of {width:60, height:40}

root = { x:EAST/2, y:SOUTH/2 }

foreach rect in rectArr {
  // I will always traverse from the root and try to go left and right. If I cannot, I move up and try the same thing. I then move down. The problem is if there are 5 or more rows. I will be starting from the root and going up, then down, then up-up, then down. It's like I have two parallel trees.

  // Try to branch left or right
  if rect.width <= (Boundries.EAST - ('rightmost rectangle'.x + 'rightmost rectangle'.width/2)) branch-right
  if rect.width <= (('leftmost rectangle'.x + 'leftmost rectangle'.width/2) - Boundries.WEST) branch-left
  // Try to branch up or down
  if rect.height <= ((root.x + root.height/2) - Boundries.NORTH) branch-up
  if rect.height <= (Boundries.SOUTH - (root.x + root.height/2)) branch-down
}
Dimensions={宽度:400,高度:300}
边界={
西=0,
东=尺寸。宽度,
北=0,
南=尺寸。高度
}
//每个矩形都有宽度、高度和其他信息
rectArr=数组{宽度:60,高度:40}
根={x:EAST/2,y:SOUTH/2}
rectArr中的foreach rect{
//我总是从根开始,尝试向左和向右移动。如果不行,我会向上移动,然后尝试相同的事情。我会向下移动。问题是如果有5行或更多行。我会从根开始,然后向上,然后向下,然后向上,然后向下。就像我有两棵平行的树一样。
//尝试向左或向右分支

if rect.widthEDIT:开始编写此内容太早。此解决方案仅适用于在假设较小矩形的位置为静态的情况下,用尽可能多的小矩形填充较大矩形

听起来动态规划解决方案在这里最有效;如果你没有研究过算法,我建议你研究贪婪算法的定义,动态规划算法的定义,每种算法的示例,以及在哪里使用一种而不是另一种

该问题与加权调度问题非常相似,但有两个维度。在加权调度中,我们给出了一个区间和一组子区间,并要求确定其总权重最大且范围不重叠的子区间集:

|--------------------------|
|{--a--}-------------------|
|----{------b-------}------|
|--------{----c----}-------|
|--------------------{-d-}-|
如果我们将其扩展到二维,较大的间隔将是边界矩形的x/y长度,子间隔将是较小矩形的x/y长度,子间隔的权重是较小矩形的面积

在贪心算法中,我们会尝试用尽可能多的最大子矩形填充边界矩形,然后尝试填充尽可能多的第二大、第三大矩形,依此类推,直到没有一个矩形适合。问题是,当与使用第二大矩形中的4个相比,使用1个最大的子矩形(想想这样的情况,我们有一个边长为6的边界正方形,最大的子正方形的边长为5,第二大的子正方形的边长为3)。看起来您的初始解可能会遇到同样的问题

动态规划解决方案将较大的问题分解为重叠的子问题,然后根据子问题的结果构建解决方案。对于矩形,您希望对集合中的每个矩形都提出相同的问题:当我将其包括在解决方案中时,还是当我不将其包括在解决方案中时,结果会更好。基于对于这个问题的答案,您可以将该矩形添加到解决方案集中,并删除与之重叠的所有其他矩形,或者只删除该矩形并继续。我建议使用以下psudeo代码:

compute_opt ( set of rectangles ){
  if(set.size == 0)
    return 0
  return max (area of selected rectangle i +  
              compute_opt( rectangles that don't overlap with i) ,
              compute_opt( rectangles without rectangle i included) )
}

我对记忆有点生疏,所以我不在此赘述。但有关加权调度的更多信息,请参阅。考虑到时间间隔问题的细节,您应该能够了解矩形问题的细节。

动画不错。您对单个矩形有一些限制吗?例如,始终有九个矩形,或者它们都有通常大小差不多,比如说在某个小数字的因数内?我将更新我的问题,使其更具描述性。您的解决方案有什么问题?预期结果是什么?您没有达到它吗?较小矩形的总面积是多少≈ 大矩形的面积?这里还有什么其他限制?如果你没有告诉我们你的限制是什么,或者你想优化什么,就很难提出建议。我看到一些问题:你是在优化矩形的安装面积,还是在中心附近的密度?是否需要有从大矩形的端到端的水平间隙,就像你一样你的解决方案保证了吗?对不起,我知道最贪婪的方法是尽量填满大部分区域,但我使用密度作为我贪婪的方面,我需要从中心开始。