Моя проблема заключается в следующем:
У меня есть набор значений V1, V2, ... Vn
У меня есть функция f(V) = g * V
, где g
- это коэффициент масштабирования, который отображает эти значения в другой набор значений A1, A2, ... An
. Эти значения соответствуют площадям квадратов.
У меня также есть переменные W
(ширина) и H
(высота). И, наконец, у меня есть алгоритм упаковки коробок ( Этот , если быть точным), который принимает переменные W
и H
и области A1 ... An
и пытается найти способ упаковки области в коробке размером W x H
. Если области A
не слишком велики, и алгоритм упаковки блока успешно справляется с размещением областей в блоке, он возвращает позиции квадратов (координаты слева-сверху, но это не имеет значения). Если области слишком велики, ничего не вернется.
Учитывая значения V
и размеры блока W
и H
, какое наибольшее значение g
(коэффициент масштабирования в f(V)
) по-прежнему подходит для блока?
Я попытался создать алгоритм, который изначально устанавливает g
в (W x H) / sum(V1, V2, ... Vn)
. Если значения V
распределены таким образом, чтобы они точно вписывались в коробку, не оставляя промежутков между ними, это немедленно дало бы мне решение. На самом деле этого никогда не происходит, но это кажется хорошей отправной точкой. С этим начальным значением g
я бы вычислил значения A
, которые затем подаются в алгоритм упаковки коробок. Алгоритм упаковки коробки не будет работать (ничего не вернется), после чего я уменьшу g
на 0.01
(абсолютно произвольное значение, установленное методом проб и ошибок) и попробую снова. Этот цикл повторяется до тех пор, пока алгоритм упаковки коробок не будет успешным.
Хотя это решение работает, я чувствую, что должны быть более быстрые и точные способы определения g
. Например, в зависимости от того, насколько велики W
и H
по сравнению с суммой значений V
, кажется, что должен быть способ определения лучшего значения, чем 0.01
, потому что, если разница очень велика алгоритм займет очень много времени, в то время как если разница будет очень мала, она будет очень быстрой, но очень грубой. Кроме того, я чувствую, что должен быть более эффективный метод, чем просто грубое принуждение. Есть идеи?