我试图找到一个多元算法来至少近似地解决以下问题(我不确定问题是否可能是NP难的):
给出实线上的一组开放区间,一个人应该"延伸"这些进入第二个维度,创建一组矩形,并将它们打包成一个高度为1的条带,即 R x [0,1] 。
解决方案应尽量避免小高度的矩形 - 在形式上,对于词汇比较,矩形高度的上升排序矢量应该是最大的。
针对给定问题的示例解决方案 (0,3)红色,(1,5)绿色,(3,7)紫色,(4,6)蓝色:
另一个稍微复杂的例子: (0,1),(0,6),(1,2),(1,8),(3,9),(4,5),(7,8),(8,9)
第二种解决方案实际上并不是最佳的:如果交换灰色和青色,蓝色可以增长到2/4高度,代价是将紫色缩小到高度2/4 - 这是一个更好的解决方案。
答案 0 :(得分:1)
这确实有NP完全的感觉。
您当然可以通过将n
间隔分配给来自(1/n, 2/n, ... 1)
的随机选择高度的线段,然后垂直展开/滑动间隔直到它无法增长来提出随机解决方案更多。这样做几次,最好的解决方案可能会好起来的。然后,您可以在其上抛出模拟退火,以迭代地改进优秀的随机解决方案。
另一种方法是计算出同时打开的间隔的最大数量m
。然后从左向右进行,并随机将间隔分配给当前打开的大小为1/m
的广告位。然后像以前一样展开/滑动间隔以找到局部最大解。与第一个不同,这将保证最短的矩形是最佳尺寸。和以前一样,您可以使用此生成方法作为随机优化算法的开始。