algorithm - 区域优化算法

标签 algorithm math optimization

我有要求,将特定数量的矩形(具有定义的宽度但随机高度)插入另一个矩形(具有定义的高度和与要插入的矩形相同的定义宽度)。这里的目标是,那些插入的矩形应该尽可能地填满目标矩形。

例如:

enter image description here

我不需要让尽可能多的矩形进入黑色,目标是尽可能多地填充黑色矩形,最好的情况是完全填充。

现实中有很多“黑色”矩形和成千上万个“红色”,我正在寻找一种有效的算法来计算。我必须在 ECMA-/Javascript 中实现它,所以它并不是所有平台中最快的。

我研究了一些算法,例如 Richard E. Korf 的“最佳矩形包装”或“Bin packing 问题”,但我无法真正将它们转化为这个特定问题。

有人可以向我推荐一种方法/算法吗?

最佳答案

因为您的红色和黑色三角形都有定义的宽度,所以您可以将问题简化为一条数字线,可以这么说。基本上,如果您曾经翻转过一个红色的边,您很可能最终会浪费空间 - 比以“正常安装”方式放置它浪费的空间要多得多。

考虑到这一点,您可以将问题精确地简化为传统的背包问题,其中容量是黑色矩形的高度,红色三角形的“重量”是它们的高度。宽度完全可以从问题中抽象出来。

另一个优势(正如xvatar所指出的)是候选人的值(value)密度都是平等的。也就是说,您没有传统背包问题所具有的“砖环”问题。考虑到在砖 block 和戒指之间进行选择来填充背包,戒指显然是候选者。在这种情况下,它们都是一样的,因此没有明显的候选对象。

似乎大块很容易候选,但这种贪心的方法行不通。考虑还有 5 个单位空间的场景,我们有 4、3 和 2 block 砖。如果我们采用贪心解决方案,我们添加 4,留下 1 个开放空间。如果我们改为使用 3 和 2,我们将不会剩下 1 个开放空间。

还需要注意的是,一旦您确定了哪些矩形进入,它们进入的顺序就无关紧要了。

进一步阅读:http://en.wikipedia.org/wiki/Knapsack_problem

关于algorithm - 区域优化算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11455918/

相关文章:

algorithm - 在小于 O(n) 的情况下检查凸多边形相交?

algorithm - 创建连续的样条曲线/在样条曲线之间进行平滑过渡

java - FOR EACH 循环中的并行迭代

python - 为什么 -0.0 与 0.0 不同?

python - Keras 分类器的准确度在训练期间稳步上升,然后下降到 0.25(局部最小值?)

c - 在嵌入式 MCU 应用程序中,在 for 循环中使用 uint_fast16_t 还是 size_t 更好?

iphone - 声音频率检测

algorithm - 手动排序大量试卷的排序算法是什么?

java - java代码的时间复杂度

php - 1-5星级评级 - 如何计算平均分