У меня есть разные размеры маленьких прямоугольников (1 см х 2 х м, 2 см х 3 см, 4 см * 6 см и т. д.). Количество прямоугольников разных типов может варьироваться в зависимости от случая. Каждый тип различных прямоугольников может иметь разное количество отсчетов.
Мне нужно создать большой прямоугольник со всеми этими маленькими прямоугольниками, которые эти маленькие прямоугольники могут быть размещены только на краях. без ротации. Последний внешний прямоугольник в идеале должен быть похож на квадрат. Х ~ Y. Не все края должны быть заполнены. Между меньшими прямоугольниками могут быть промежутки. Пример изображения:
http://i.stack.imgur.com/GqI5z.png а>
Я пытаюсь написать код, который определяет минимально возможную площадь, которую можно сформировать.
У меня есть алгоритм, который перебирает все возможные места размещения, чтобы найти минимально возможную площадь. Но это занимает много времени, так как количество прямоугольников разных типов и количество прямоугольников увеличивается. т.е. 2 типа прямоугольников, в каждом по 100+ прямоугольников. 8 для петель. Это будет ~100^8 итераций.
Любые идеи о лучшем и более быстром алгоритме для вычисления минимально возможной площади? код написан на питоне, но подойдет любая концепция алгоритма.
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
for rectange_1_top_count in (range(5,all_rectangles[1]["count"]+1)):
Если мы начнем с 5, а не с 0, на 3 ^ 8 меньше итераций. Я могу сделать то же самое для других петель. Но мне интересно, будет ли еще лучшее решение, - person Charles Tang   schedule 22.01.2016