|
|
|
Алгоритм распределения веса по пакетам
|
|||
|---|---|---|---|
|
#18+
Возможно кто-то уже имел дело с такой задачей или знает, где есть готовый алгоритм. Задача такова: Есть набор товаров с разным весом, например 5 штук продукта "A" с весом по 3кг и 3 штуки продукта "Б" с весом по 2кг. Есть сумка с максимальным весом N (допустим, 7кг). Надо распределить все продукты как можно более поровну по сумкам. У меня есть мысли, как можно решить, если знаешь количество сумок. В общем решение этой я встречал и в сети, например, аналогичная задачи про пирожки. источник авторСделал так. Формируем стек пирожков по цене от дорогих к дешевым. Считаем среднее арифметическое = количество бабла/количество детей. Проходим по детям, внутри проходим по пирожкам. Если количество бабла у ребенка + цена пирожка <= сред. арифм. то отдаем пирожок ребенку, если > то переходим к след. пирожку. Если в конце остались пирожки, которые мы не раздали, то раздаем их по принциму взять пирожок и отдать ему ребенку с меньшей ценовой массой. Алгоритм выложу на днях, писал на JS – ErgallM 8 месяцев 5 дней назад Мне надо решить эту задачу, когда неизвестно количество сумок, т.е я могу взять столько сумок, сколько хочу, главное чтобы было как можно более поровну. Пример: Сумка = максимум 15кг. Продукты: 10шт по 7 кг и 3шт про 3кг. Можно разместить 7кг-продукты в 5 сумок по 2 в каждую сумку. Выйдет в каждой сумке по 14. Оставшиеся 3кг-продукты в одну сумку, выйдет 9кг. Разница между весом в сумках будет 14-9=5кг. Не очень равномерно. А можно каждый 7кг продукт в свою сумку, а оставшиеся 3кг продукты еще в 1 сумку. Выйдет 11 сумок, десять по 7кг и одна с 9кг . Разница будет всего 2кг = более-менее равномерно. Любые советы будут полезными, и заранее спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2012, 00:50 |
|
||
|
Алгоритм распределения веса по пакетам
|
|||
|---|---|---|---|
|
#18+
Аппроксимация в этом случае делается не разностью, а квадратами разностей от среднего. Обычная задача на комбинаторику. Схожую задачу мы решали с полгода назад... только там количество интервалов (сумок) было известно. Зато нельзя было изменять последовательность "вещей". В вашем же случае - неограниченного количества "сумок" - можно перебрать и все варианты интервалов разбиений при данных ограничениях, находя минимум "разностей". При этом вашу "последовательность" можно предварительно отсортировать. С другой стороны, тупой и прямой перебор (даже при оптимизации кода по поводу "выхода из ограничений") при возрастании количества "вещей" упрется в экспоненциальный рост времени вычислений... Но с тех пор воды уже немного утекло, и было выяснено, что для данного класса задач есть такая вещь, как динамическое программирование. По профилю. Главное, профиль правильно придумать... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2012, 02:55 |
|
||
|
Алгоритм распределения веса по пакетам
|
|||
|---|---|---|---|
|
#18+
Archibald13, называется "задача об упаковке рюкзака". комбинаторика. если предметов мало, можно решить полным перебором, если больше - нехорошо :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2012, 15:09 |
|
||
|
Алгоритм распределения веса по пакетам
|
|||
|---|---|---|---|
|
#18+
я знаю задачу о рюкзаке, вот только связь с моей там очень отдаленная ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2012, 15:39 |
|
||
|
Алгоритм распределения веса по пакетам
|
|||
|---|---|---|---|
|
#18+
Archibald13, Так вы желаете увидеть готовый код, что-ли? Не, конечно, заняться-то нам нечем... Озвучьте тогда ограничения, что-ли (максимальный размер "сумки", максимальное значение "веса", максимальное значение "количества штук"). Язык программирования, хотя бы, озвучьте... а то непонятно, на чем пример давать. Или вам надо расписать алгоритм словами? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2012, 16:14 |
|
||
|
Алгоритм распределения веса по пакетам
|
|||
|---|---|---|---|
|
#18+
Если необходимо именно оптимальное решение - то это полный перебор. Т.е. решение задачи максимально равномерного распределения при заданном количестве сумок для каждого возможного количества сумок, и выбор наилучшего из решений. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2012, 17:50 |
|
||
|
Алгоритм распределения веса по пакетам
|
|||
|---|---|---|---|
|
#18+
Archibald13, Если у тебя для сумок задан максимальный вес, то просто делай цикл: от веса максимального предмета и до максимального объема. В этом цикле набиваешь классические рюкзаки и на каждой итерации считаешь отклонения от среднего веса. По окончанию цикла будешь знать какой вес отдельной сумки является оптимальным, либо оборвешь цикл если найдешь вариант с нулевым отклонением от среднего веса. Еще учти что у тебя может быть ситуация когда два (или больше) вариантов смогут дать идеальное распределение с нулевой разницей между сумками. Допустим четыре предмета весят по 1кг, а в сумку влазит 4кг - у тебя будет три идеальных варианта: (1,1,1,1), (2,2) и (4). Если цикл делать от самого тяжелого предмета до максимального объема сумки - получишь наилучшее решение с точки зрения "самая легкая сумка - больше всего сумок". Если цикл бежать наоборот (от максимального объема, до максимального предмета) то получишь наилучшее решение с точки зрения "минимум сумок, самые набитые сумки". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2012, 19:20 |
|
||
|
Алгоритм распределения веса по пакетам
|
|||
|---|---|---|---|
|
#18+
Да не надо мне готовый код, вы что =) просто на словах подкиньте идею, вот как ув. White Owl, только я не совсем понял, что Вы имеете в виду, авторто просто делай цикл: от веса максимального предмета и до максимального объема. В этом цикле набиваешь классические рюкзаки. по каком принципу набивать? У меня пока что идея брать число N=1 - кол-во сумок. И дальше набивать по принципу 1. Для каждого продукта от самых тяжелых к самым легким 2. Найти самую пустую сумку 3. Положить туда продукт 4. Если не помещается N+=1 и по новой 5. Посчитать разницу Diff между самой тяжелой и самой легкой сумкой и запомнить (PreviousDiff = Diff). 6. Если Diff = 0 или Diff не меньше PreviousDiff то конец. Но это как-то уже слишком не оптимально, т.е. перебирать все возможные количества сумок чревато большим временем выполнения. Правильнее даже сразу брать N = FLOOR (Суммарный вес предметов / максимальный вес сумки), т.е. число сумок, меньше которого быть не может. Но все равно. Кроме того, алгоритм обладает недостатками. Если у меня 50 предметов по 2кг и 100 предметов по 1кг и сумка на 100кг, я могу поделить на 2 сумки не разбивая продукты в рагу, а это как раз важная часть моей задачи, т.е. желательно соблюдать однородность состава. А вышеописанный алгоритм будет сначала 50 раз тыкать по 1му продукту каждый раз в новую сумку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2012, 01:13 |
|
||
|
Алгоритм распределения веса по пакетам
|
|||
|---|---|---|---|
|
#18+
Даже немного не так, Шаг 6. Если Diff = 0, то конец (оптимальный вариант с количеством сумок N) Шаг 7. Если Diff не меньше Previous Diff, то конец (оптимальный вариант с количеством сумок N-1) Шаг 8. N=+1 и все по новой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2012, 01:19 |
|
||
|
Алгоритм распределения веса по пакетам
|
|||
|---|---|---|---|
|
#18+
Archibald13авторто просто делай цикл: от веса максимального предмета и до максимального объема. В этом цикле набиваешь классические рюкзаки. по каком принципу набивать? Да по любому. У тебя есть заранее заданный список предметов. Переменная цикла покажет тебе максимальный вес рюкзака. Набиваешь один рюкзак под завязку, вычеркиваешь эти предметы из списка. Потом набиваешь второй рюкзак оставшимися, опять вычеркиваешь использованные. И так до тех пор пока список предметов не исчерпается. Archibald13желательно соблюдать однородность состава. А вышеописанный алгоритм будет сначала 50 раз тыкать по 1му продукту каждый раз в новую сумку.Да. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2012, 01:39 |
|
||
|
Алгоритм распределения веса по пакетам
|
|||
|---|---|---|---|
|
#18+
Archibald13Да не надо мне готовый код, вы что =) просто на словах подкиньте идею, ... не разбивая продукты в рагу, а это как раз важная часть моей задачи, т.е. желательно соблюдать однородность состава.А вот про "однородность состава" вы в условии ни разу не оговорились... А я же вам потом сказал - задайте ограничения. Одно из которых - "желательна однородность состава, т.е. минимизировать количество видов товара в сумке". Вообще, правильно построенный алгоритм найдет вам _все_ возможные минимизации, и "однородность" туда тоже входить будет, так что по этому ограничению вы можете проанализировать результат, а не накладывать его в процессе. Другое дело, что "степень однородности" - понятие растяжимое, и уже другого порядка. А то ведь и памперсы с пивом можно уложить Вы бы уж реально рассказали, зачем вам решать эту задачу. Если это в приложении к реальным данным - так и подумать еще можно. Вдруг вы вообще не с того конца подошли... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2012, 01:53 |
|
||
|
Алгоритм распределения веса по пакетам
|
|||
|---|---|---|---|
|
#18+
При достаточно большом числе сумок, метод случайной раскладки даст неплохое приближение к оптимальной. А если если ввести комплексный критерий, с учетом времени решения, то случайная раскладка просто не имеет конкурентов. Но, конечно, при достаточно большом числе сумок. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2012, 03:13 |
|
||
|
Алгоритм распределения веса по пакетам
|
|||
|---|---|---|---|
|
#18+
Вот эту фразу " чтобы было как можно более поровну " очень надобно в виде формулы выразить. Т.е. математически что конкретно следует минимизировать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2012, 03:42 |
|
||
|
Алгоритм распределения веса по пакетам
|
|||
|---|---|---|---|
|
#18+
ИМХО, ТС желает стандартную оптимизацию по логистике отгрузки товара: - есть заказанный покупателями товар (набор комплектов), его надо отгрузить покупателям - есть авто с определенным объемом (несколько авто, или в несколько рейсов доставки) - надо оптимизировать отгрузку. чтобы минимизировать затраты на доставку Между прочим, как минимум с двух-трёх точек зрения: не только "забитие под завязку" каждого рейса, но и "однотипность позиций" (легче загружать), и "однотипность получателей" (одномоментная доставка заказа), и "минимизация рейсов" (расходы на доставку), и (в задаче не хватает данных по оптимизации графа движения транспорта), и... Пусть уж ТС определится, чего хочет... А то уже все изнывают, готовясь решать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2012, 00:28 |
|
||
|
Алгоритм распределения веса по пакетам
|
|||
|---|---|---|---|
|
#18+
Edd.DragonВот эту фразу " чтобы было как можно более поровну " очень надобно в виде формулы выразить. Т.е. математически что конкретно следует минимизировать?Понятно, что следует минимизировать разность весов самого тяжёлого и самого лёгкого пакетов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2012, 00:34 |
|
||
|
Алгоритм распределения веса по пакетам
|
|||
|---|---|---|---|
|
#18+
авторТ.е. математически что конкретно следует минимизировать? А что тут непонятного? Чтобы разница веса между максимально и минимально набитыми сумками была минимальной из возможных. В простом виде это единственное требование. Насчет однородности это скорее пожелание (на данном этапе), чем требование. авторА то уже все изнывают, готовясь решать смешно =) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2012, 02:28 |
|
||
|
Алгоритм распределения веса по пакетам
|
|||
|---|---|---|---|
|
#18+
авторПри достаточно большом числе сумок, метод случайной раскладки даст неплохое приближение к оптимальной. А если если ввести комплексный критерий, с учетом времени решения, то случайная раскладка просто не имеет конкурентов. Но, конечно, при достаточно большом числе сумок. А можно чуть по-конкретнее? Основная проблема, как я уже говорил, это неизвестность заранее количества сумок. Брать рандомное количество сумок из диапазона (меньше быть не может, больше не имеет смысла) ? И что потом? случайным образом раскидывать продукты? а смысл, если зная количество сумок, я могу применить более оптимальный алгоритм? Вообще можно что-то поконкретнее, а то вижу либо вопросы, либо абстрактные закидоны, аля "это обычная задача на....", "тут неплохо бы применить xxx" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2012, 02:39 |
|
||
|
Алгоритм распределения веса по пакетам
|
|||
|---|---|---|---|
|
#18+
склоняюсь к решению, подсказанному White_Owl. ps: это так задумано, что нельзя редажить посты?=) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2012, 02:52 |
|
||
|
Алгоритм распределения веса по пакетам
|
|||
|---|---|---|---|
|
#18+
"Количество сумок" известно - оно не меньше "округлвверх(общий вес товара / общее количество упаковок)" и не более "общее количество упаковок". И вот для каждого из этих значений рассчитывается (перебором вариантов раскладки) минимальная разница в весе. И все эти разницы сравниваются между собой, и выбираются подходящие... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2012, 03:10 |
|
||
|
Алгоритм распределения веса по пакетам
|
|||
|---|---|---|---|
|
#18+
* чуть соврал - "не менее "округлитьвверх(общий вес товара / объем сумки)"... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2012, 03:32 |
|
||
|
Алгоритм распределения веса по пакетам
|
|||
|---|---|---|---|
|
#18+
Archibald13, прочитал еще раз ваш первый пост: Archibald13... Мне надо решить эту задачу, когда неизвестно количество сумок, т.е я могу взять столько сумок, сколько хочу, главное чтобы было как можно более поровну. Пример: Сумка = максимум 15кг. Продукты: 10шт по 7 кг и 3шт про 3кг. Можно разместить 7кг-продукты в 5 сумок по 2 в каждую сумку. Выйдет в каждой сумке по 14. Оставшиеся 3кг-продукты в одну сумку, выйдет 9кг. Разница между весом в сумках будет 14-9=5кг. Не очень равномерно. А можно каждый 7кг продукт в свою сумку, а оставшиеся 3кг продукты еще в 1 сумку. Выйдет 11 сумок, десять по 7кг и одна с 9кг . Разница будет всего 2кг = более-менее равномерно. То есть, (если я правильно понял) вам даже не очень важно забить каждую сумку по максимуму, а важно чтобы в сумке были однородные продукты и сумки были заполнены примерно одинаково (по весу?). Тогда, примерно так: сначала список продуктов сортируется по однородности (весу?) , (от тяжелым к легким), потом по этому списку, заполняются сумки. Последнюю, если она сильно отличается от предыдущих, пытаемся разбросать по предыдущим. Получится - хорошо, не получится- оставляем. Будет неоптимально, но очень быстро. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2012, 19:20 |
|
||
|
Алгоритм распределения веса по пакетам
|
|||
|---|---|---|---|
|
#18+
если вес сумки фиксирован (заранее известен), то это задача линейного раскроя в инете их хватает, в том числе и бесплатных ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2012, 19:48 |
|
||
|
Алгоритм распределения веса по пакетам
|
|||
|---|---|---|---|
|
#18+
Задачу из первого поста можно решить следующим образом: Есть детали 10шт по 7кг и 3шт по 3кг, нужно их разместить в 15кг сумки. Если стоит задача минимизация кол-ва используемых сумок, при этом более менне равномерное распределение по сумкам, то это задача линейного раскроя. У меня получилось следующее решение: 7+7 = 14 - 4 повтора 7+3+3 = 13 - 1 повтор 7+3 = 10 - 1 повтор Итого ушло 6 сумок (минимум для данного набора деталей) и разбег между минимумом и максимумом: 14-10 = 4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2015, 12:01 |
|
||
|
Алгоритм распределения веса по пакетам
|
|||
|---|---|---|---|
|
#18+
Михаил Ч.Если стоит задача минимизация кол-ва используемых сумок, при этом более менне равномерное распределение по сумкам А прочитать условие не пробовал? нет там ничего про минимизацию количества сумок. И для озвученного тобой набора решением будет: все три 3-кг в одну сумку, и по одной 7-кг в остальные. В итоге 11 сумок, и макс. разность весов 2 кг. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2015, 12:14 |
|
||
|
Алгоритм распределения веса по пакетам
|
|||
|---|---|---|---|
|
#18+
Archibald13, Это, если не ошибаюсь, дискретная задача о рюкзаке, с небольшими вариациями (целевая функция не максимум ценности предметов, а оптимум равенства весов пакетов). Эта задача -- классичейский пример NP-полной задачи, т.е. нормально решается только полным перебором просчётов всех вариантов укладки . Применение эвристик возможно, но оно может вести к неоптимальным решениям (т.е. то, что решение оптимально просто недоказуемо). Если допустимо не оптимальное решение, а близкое к нему, то можно применять эвристики смело. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2015, 12:41 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=37614272&tid=1340962]: |
0ms |
get settings: |
9ms |
get forum list: |
19ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
67ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
63ms |
get tp. blocked users: |
1ms |
| others: | 239ms |
| total: | 414ms |

| 0 / 0 |
