在给定盒子尺寸的情况下,为盒子包装的正方形找到最大可能的缩放因子

时间:2018-10-29 08:16:36

标签: javascript algorithm computational-geometry

我的问题如下:

我有一组值V1, V2, ... Vn 我有一个函数f(V) = g * V,其中g是一个比例因子,它将这些值映射到另一组值A1, A2, ... An。这些值对应于正方形的面积。 我也有W(宽度)和H(高度)变量。最后,我有一个盒装算法(具体来说是This one),它采用WH变量以及A1 ... An区域,并尝试找到一个将区域打包到大小为W x H的盒子中的方法。如果区域A不太大,并且装箱算法成功地将这些区域放入盒子中,它将返回正方形的位置(左上角的坐标,但这无关紧要)。如果面积太大,将不会返回任何内容。

给出值V以及框WH的尺寸,g的最大值是多少({{1}中的比例因子) )仍然适合盒子?

我尝试创建一种将f(V)设置为g的算法。如果值(W x H) / sum(V1, V2, ... Vn)的分布方式使其恰好适合盒子,而在两者之间不留任何空间,则可以立即为我提供解决方案。实际上,这永远不会发生,但似乎是一个很好的起点。使用V的初始值,我将计算出值g,然后将其馈送到盒装算法中。装箱算法将失败(不返回任何内容),之后我将A减少g(通过反复试验确定的完全任意值),然后重试。重复此循环,直到包装盒算法成功为止。

尽管此解决方案有效,但我认为应该有更快,更准确的方法来确定0.01。例如,取决于gW与值H的总和相比,似乎应该有一种方法可以确定比V更好的值,因为如果差异非常大,算法将花费很长时间,而如果差异非常小,则算法将非常快但非常粗糙。另外,我觉得应该有一种比像这样强行强制的更有效的方法。有什么想法吗?

2 个答案:

答案 0 :(得分:0)

我认为您的方法进展顺利!

我认为您不应该将价值降低固定的数量,而应尝试以更小的步伐实现价值。

这很好,因为您的起点很高。首先,您可以将g降低0.1 * g之类,检查打包是否成功,如果不成功,则以相同的步长继续降低,否则,如果打包正确,则以较小的步长增加g(例如step = step / 2)< / p>

有时,您的步骤将变得非常小,您可以停止搜索(定义“小”取决于您)

答案 1 :(得分:0)

您可以使用二进制搜索方法。如果您有两个g值,那么对于一个(g1)打包存在而对于第二个(g2)打包则不存在,请在半途中尝试值h =(g1 + g2)/ 2。如果存在用于h的打包,您将得到新的较大的最终g,然后可以对h和g2进行相同的检查。如果不存在包装,则可以使用值g1和h进行相同的检查。

每一步将可能结果最大值的间隔减半。您可以通过多次迭代获得尽可能精确的最终结果。