我的问题如下:
我有一组值V1, V2, ... Vn
我有一个函数f(V) = g * V
,其中g
是一个比例因子,它将这些值映射到另一组值A1, A2, ... An
。这些值对应于正方形的面积。
我也有W
(宽度)和H
(高度)变量。最后,我有一个盒装算法(具体来说是This one),它采用W
和H
变量以及A1 ... An
区域,并尝试找到一个将区域打包到大小为W x H
的盒子中的方法。如果区域A
不太大,并且装箱算法成功地将这些区域放入盒子中,它将返回正方形的位置(左上角的坐标,但这无关紧要)。如果面积太大,将不会返回任何内容。
给出值V
以及框W
和H
的尺寸,g
的最大值是多少({{1}中的比例因子) )仍然适合盒子?
我尝试创建一种将f(V)
设置为g
的算法。如果值(W x H) / sum(V1, V2, ... Vn)
的分布方式使其恰好适合盒子,而在两者之间不留任何空间,则可以立即为我提供解决方案。实际上,这永远不会发生,但似乎是一个很好的起点。使用V
的初始值,我将计算出值g
,然后将其馈送到盒装算法中。装箱算法将失败(不返回任何内容),之后我将A
减少g
(通过反复试验确定的完全任意值),然后重试。重复此循环,直到包装盒算法成功为止。
尽管此解决方案有效,但我认为应该有更快,更准确的方法来确定0.01
。例如,取决于g
和W
与值H
的总和相比,似乎应该有一种方法可以确定比V
更好的值,因为如果差异非常大,算法将花费很长时间,而如果差异非常小,则算法将非常快但非常粗糙。另外,我觉得应该有一种比像这样强行强制的更有效的方法。有什么想法吗?
答案 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进行相同的检查。
每一步将可能结果最大值的间隔减半。您可以通过多次迭代获得尽可能精确的最终结果。