Я занимаюсь резкой отделкой для моего дома и имеет различные длины отделочных деталей и хотел бы оптимально сгруппировать их для наименьшего количества отходов. В принципе, я пытаюсь оптимально группировать (или упаковывать) требуемые длины в доступные более длинные длины.Алгоритм объединения чисел в оптимальные группы, не превышающие вектор максимальных значений?
Я немного зациклен на том, как подойти к этому и в настоящее время только что делал это вручную, однако ошибка заканчивается тем, что заставляет меня перерабатывать всю операцию. Я знаю некоторые java, но недавно работал исключительно с R, так что это мой самый знакомый язык на данный момент. Есть ли предложения о том, как подойти к этому?
Есть ли лучший способ сделать это, чем зацикливание вручную с помощью алгоритма что-то вроде этого (я просто набрасывать идею, не ищет правильный синтаксис):
trim_lengths <- c(44, 57, 86, 86, 40, 88, 88, 41, 40, 40,
62, 62, 54, 54, 55, 55, 63, 63, 75, 75, 100, 100)
avail_lengths <- c(120, 103, rep(100, 9), 98, rep(97, 4),
95, rep(88, 3), 85, 65)
while(length(trim_lengths) > 0) {
current_max <- max(trim_lengths)
current_min <- min(trim_lengths)
if(current_max + current_min > max(avail_lengths) {
find smallest value in avail_lengths that's greater than current_max
store current_max and optimal value from avail_lengths in list or vector
to indicate the pairing/grouping
}
else {
group <- c(current_max, current_min)
current_max <- trim_lengths minux elements in group
if <- sum(group) + current_max > max(avail_lengths) {
store group and corresponding avail_length element in list/vector
}
else{
basically, keep trying to group until solved
}
}
Я уже знаю это не оптимально, так как он проверяет «вне дома» на векторе trim_lengths
, и мои ручные пары часто заканчиваются тем, что сопрягают небольшое и среднее значение уровня с доступной длиной, которую довольно легко увидеть, всего на дюйм или два дольше чем указанное спаривание.
В любом случае, это была интересная проблема, и я подумал, есть ли ссылки или очевидные предложения, которые придут на ум для решения. В некоторых из связанных вопросов первый комментарий часто спрашивал: «Что вы пробовали». У меня действительно нет ... как я в тупик. Единственное, что я думал о том, что это были беспорядочные комбинации, случайным образом, хранение решения, которое сводит к минимуму трату.
Мне понравились бы некоторые предложения по решению этого в векторном виде - некоторая операция с матрицей или, возможно, линейное представление модели проблемы. Я тоже буду думать об этом.
это проблема с рюкзаком? –
Это обобщение проблемы с рюкзаком: отличия в том, что существует несколько рюкзаков (доступные длины), и все объекты (длина отделки) . Вы можете попробовать те же подходы, что и рюкзак: жадный алгоритм, целочисленное программирование, ветка с привязкой и т. Д. Это также можно рассматривать как одномерную [проблему упаковки] (http: //en.wikipedia. орг/вики/Packing_problem). –
Спасибо за комментарии - я не слышал об этом! Да, очень похож на проблему с рюкзаком, но, как @VincentZoonekynd сказал, несколько рюкзаков, и я забочусь только о 1-мерном (длина, минимизируя остатки, а не вес, минимизирующий неиспользованную емкость * и * максимизирующее значение). Спасибо за проблему упаковки; глядя на проблему K, я также видел проблему с упаковкой [bin] (https://en.wikipedia.org/wiki/Bin_packing_problem), которая также звучит. – Hendy