我有不同尺寸的小矩形(1cm x 2xm,2cmx3cm,4cm * 6cm等)。不同类型矩形的数量可根据情况而变化。每种类型的不同矩形可以具有不同数量的计数。
我需要创建一个包含所有这些小矩形的大矩形,这些小矩形只能放在边缘上。 没有轮换。理想情况下,最终的外部矩形应该是方形的。 X~Y。并非所有边缘都需要填满。较小的矩形之间可能存在间隙。图片示例:
http://i.stack.imgur.com/GqI5z.png
我正在尝试编写一个代码,找出可以形成的最小可能区域。
我有一个算法循环遍历所有可能的位置,以找出可能的最小区域。但是,随着不同类型矩形的数量和矩形数量的增加,这需要很长的运行时间。即2种类型的矩形,每种矩形具有100 +矩形。 8循环。这将是~100 ^ 8次迭代
有关更好和更快算法的任何想法来计算最小可能区域?代码在python中,但任何算法概念都可以。
for rectange_1_top_count in (range(0,all_rectangles[1]["count"]+1)):
for rectange_1_bottom_count in range(0,all_rectangles[1]["count"]-rectange_1_top_count+1):
for rectange_1_left_count in (range(0,all_rectangles[1]["count"]-rectange_1_top_count-rectange_1_bottom_count+1)):
for rectange_1_right_count in ([all_rectangles[1]["count"]-rectange_1_top_count-rectange_1_bottom_count-rectange_1_left_count]):
for rectange_2_top_count in (range(0,all_rectangles[2]["count"]+1)):
for rectange_2_bottom_count in (range(0,all_rectangles[2]["count"]-rectange_2_top_count+1)):
for rectange_2_left_count in (range(0,all_rectangles[2]["count"]-rectange_2_bottom_count-rectange_2_top_count+1)):
for rectange_2_right_count in [(all_rectangles[2]["count"]-rectange_2_bottom_count-rectange_2_left_count-rectange_2_top_count)]:
area=calculate_minimum_area()
if area< minimum_area:
minimum_area=area
答案 0 :(得分:0)
这看起来像NP难题,所以没有简单有效的算法。它并不意味着没有好的启发式可以使用,但如果你有很多小矩形,你就不会快速找到最佳解决方案。
为什么NP难?让我们假设你所有的矩形都有1号高度,你有高度为2的矩形,那么寻找总高度为2的解决方案是有意义的(基本上,你试图形成两条高度为1的矩形水平线)长度相同)。要确定是否存在这样的解决方案,您必须形成两个小矩形的子集,两者都加起来相同的总宽度。这称为partition problem,它是NP完全的。即使可能存在间隙并且总宽度不需要相同,这仍然是NP难问题。如上所述,您可以通过将元素转换为分区为高度为1的矩形来减少分区问题。
我会等待你在问题评论中发布的问题的答案,然后再考虑一下。