Имя: Пароль:
1C
 
Некий аналог "задачи о рюкзаке"
0 Торин
 
21.09.09
17:06
Уважаемые коллеги!
А есть ли желающие поломать голову над алгоритмами?
Собссно задача. Есть n заказов и m машин. У каждого заказа есть вес и объем, у каждой машины соответсвенно вместимость и грузоподъемность. В силу специфики перевозок (легкие и объемные грузы) грузоподъемностью можно пренебречь, единственным параметром является объем. Требуется разложить заказы по машинам, так чтобы суммарное "недозаполнение" машин было минимальным...

Задача, очень практическая и очень нужная.  Как я подозреваю, это некий аналог "задачи о рюкзаке", но напрямую алгоритмы решения "задачи о рюкзаке" не идут. Если кто-нить что-нить подскажет, буду очень благодарен.
1 Торин
 
21.09.09
17:07
Да , надеюсь, понятно, что в каждую машину можно помещать только заказы целиком...
2 bvn13
 
21.09.09
17:10
рекурсия?
3 XLife
 
21.09.09
17:11
(1) а логистика пофигу?
4 YauheniL
 
21.09.09
17:11
(0) Ну, Симплекс-метод, метод Ветвей и границ, метод Монте-Карло, генетические алгоритмы... можно копать во многих направлениях... зависит только лишь от требования к решению
5 Торин
 
21.09.09
17:11
ну что рекурсия, я как-то подозреваю... вроде почти все алгоритмы на оптимизацию так или иначе рекурсивны А подробнее?
6 YauheniL
 
21.09.09
17:11
(3) +1
7 Торин
 
21.09.09
17:12
(3)В данном случае критично поместить заказы в машины а не оптимизировать маршруты...
8 Mikeware
 
21.09.09
17:12
(3) Когда воруют - главное, вывезти уворованное, и побольше... Куда вывозить - вторично...
9 YauheniL
 
21.09.09
17:13
(0), (3), (8) -- на Баш :)
10 Fragster
 
гуру
21.09.09
17:13
(7) это ты так думаешь... к тому же еще и форму заказов надо учитывать, а не тупо объем... +стеллажность или как там, ограничение в установке товара друг на друга... ;)
11 Торин
 
21.09.09
17:14
уф-ффф... до чего же я нашу Мисту люблю... А задача как раз совершенно реальная из реальной жизни реальной московской торговой кампании...
12 Торин
 
21.09.09
17:15
(10) ну да я так думаю... потому что я в этой конторе уже пятый месяц сижу... и с логистами, и с кладовщиками и даже с грузчиками уже море водки выпил...
13 Торин
 
21.09.09
17:16
нет ограничений в установке товара, нет стеллажности, даже паллетирования нет...
14 Fragster
 
гуру
21.09.09
17:17
(13) ну хз... может вы рулоны продаете, а их особым образом в прямоугольную машину запихивать надо...
15 Торин
 
21.09.09
17:18
есть тупое забивание объема машины коробками примерно одинаковых габаритов... единственная проблема - раскидать заказы по машинам...
заказов - 1000, машин - 75-80
16 Darky
 
21.09.09
17:19
все машины имеют одинаковую "объемоподъемность"?
17 Торин
 
21.09.09
17:19
суммарный объем машин превышает суммарный объем заказов мпримерно на 10%, тем не менее примерно 15% заказов не развозится... из-за того. что машины недозагружены
и так каждый день...
18 Торин
 
21.09.09
17:20
(16)нет, машины примерно 30 типов, у каждого типа свой объем
19 Darky
 
21.09.09
17:20
млин, так у тебя одни переменные и ни одной константы чтоль? даже не за что зацепится?
20 Fragster
 
гуру
21.09.09
17:22
если коробки одинакового размера, то все просто. измеряем вместимость каждой машины в мифических коробках, сортируем заказы по объему в коробках, а машины - по свободному месту в тех же коробках. самый большой заказ кладем в машину с наибольшим свободным местом. повторяем.
21 Fragster
 
гуру
21.09.09
17:23
(20) это, конечно, если на маршрут нас.рать ;)
22 Черный всадник
 
21.09.09
17:23
(0) В управлении доставкой есть решение твоей проблемы, правда с картами стоит как УПП (цены примерно год назад смотрел)
23 Торин
 
21.09.09
17:23
ну вот такая математическая задачка- есть 1000 действительных чисел - это объем заказа и 80 натуральных чисел - это объемы машин . надо разбить тысячу чисел на 80 групп, так чтобы сумма каждой группы минимальа отличалась от соответствующего натурального числа
24 Торин
 
21.09.09
17:24
(20) этот алгоритм я щас реализовал... по сравнению с ручной раскидкой "дядей Васей" выигрыша практически не дал...
25 Fragster
 
гуру
21.09.09
17:25
(24) есть еще тупой перебор с построением гигантского дерева, тока очень затратный...
26 wason
 
21.09.09
17:26
27 Торин
 
21.09.09
17:26
(21) на маршрут на...ть, важно - уменьшить не дозагрузку машины... требуется недозагрузка - не более 10%, сейчас - около 20%
(26) чуствую, что где-то рядом, но не то...
28 Торин
 
21.09.09
17:27
(25) тупой перебор по дереву не укладывается в сроки...
29 XLife
 
21.09.09
17:27
(24) ты учитываешь только объем коробки? а габариты?
30 wason
 
21.09.09
17:28
в геометрии вроде была задача как при опредиленом периметре получить минимальную площадь за счет уменшение.увеличения старон 4 угольника
31 Ненавижу 1С
 
гуру
21.09.09
17:31
Теория говорит, что алгоритм очень простой:

- выбирается самая объемная машина
 в нее грузится сначала самый объемный заказ, потом следующий (если не влезет, то пропускаем), потом следующий... и так по убыванию, пока не заполнится
- берется следующий по убыванию грузоподъемности, повторяется с самомого объемного незагруженного и т.д.
32 Торин
 
21.09.09
17:32
ребят, ну чего усложнять... ну давайте решим хотя бы просто разбиение на объемы... потом будем думать о габаритах... при 20% недогрузе проблема не в габаритах...
вот на примере
5 заказов - 1,8; 1,9; 2,7, 0,8, 3,1 - это объемы заказов
три машины - 5, 7, 2 - это  объемы машин...
как раскидать объемы по машинам? нужен алгоритм...

(31) вот так я щас  и сделал... при этом алгоритме недозагруз упал с 20 до 15-17... не катит...
33 Торин
 
21.09.09
17:33
(31) это не оптимальный алгоритм... увы...
34 hhhh
 
21.09.09
17:35
(32) зависит от величины заказов. Если например 100 заказов имеет размер каждый больше половины машины, то задача вообще не имеет решения.
35 XLife
 
21.09.09
17:35
(32) один объем тебе ничего не даст...
грубо: у тебя ширина кузова 150см и 4 коробки по 40см = 160см, по объему ты легко сможешь попасть в "рамки", а вот реально по габаритам груза - нет
36 Торин
 
21.09.09
17:38
(34) хорошо, а можно как-нить оценить эту зависимость? ну чтобы я мог сказать, что вот то, что я сделал при данной средней величине заказа (такая статистика есть) и есть оптимальная загрузка
(35) у меня ма-а-а-а-ленькие коробки... маленькие! их можно как угодно ставить... и уменя машины НЕДОЗАГРУЖЕНЫ... туда еще можно было бы положить ... есть изменить разбивку на заказы...
37 ado
 
21.09.09
17:40
(32) А ты хоть понимаешь, что даже при наилучшем решении у тебя будет недогруз?
И не факт, что он будет значительно меньше.
38 Mikeware
 
21.09.09
17:40
Автор, объясни смысл этой задачи?
Это не из разряда "подметания плаца ломиком"?
39 XLife
 
21.09.09
17:40
(32) решил?)))
1 машина: 1,9 и 3,1
2 машина: 1,8 и 2,7 и 0,8
3 машина: отдыхает
40 ado
 
21.09.09
17:41
(34) Какая задача не имеет решения? Сделать так, чтобы недогруза не было? Она никогда не имеет решения.
Минимизировать недогруз? Имеет решение всегда.
41 ado
 
21.09.09
17:42
(36).1 Сравнивать с наилучшем решением, полученным полным перебором ;-)
42 hhhh
 
21.09.09
17:44
(40) если 100 заказов занимает больше половины машины каждый, то нужно как минимум 100 машин, а у нас 80. Естественно имеется в виду самая большая машина.
43 Sidney
 
21.09.09
17:45
Берешь машину 1, среди груза ищещь объем равный или меньше, если меньше - ищешь груз равный или меньше остатку объема и так далее. Каждый раз сортировать.
44 Торин
 
21.09.09
17:45
объясняю - задача совершенно реальная - есть торговая кампания, которая торгует продуктами с доставкой... у кампании есть свой парк машин... ежедневно выписывается 1000(в среднем) счетов ночью они загружаюися по машинам и днем развозятся... штрафы не недоразвоз такие, что выигрывать на бензине (износе машин и т.д.) бессмысленно... расстояния тоже не велики - москва и москолвская область. критично только одно- уложить все заказы в машины...  вот и все...
естьвариант конечно - увеличить парк  машин... для этого ядолжен объеснить генеральному что не дозагруз примерно в 20% (после моей работы в 15-17) - это и есть самый оптимальный вариант и ничего лучшен программными или какими-то еще способами сделать нельзя...
45 Mikeware
 
21.09.09
17:47
(44) Критерий оптимальности очень слаб.
46 XLife
 
21.09.09
17:47
(44) некуй развозить... пусть сами в магазин ходят))
47 wason
 
21.09.09
17:50
(39)(46)8 заказов - 1,8; 1,9; 2,7, 0,8, 3,1 2,3  - это объемы заказов а если так
три машины - 5, 7, 2 - это  объемы машин...
как раскидать объемы по машинам? нужен алгоритм...
48 Торин
 
21.09.09
17:51
(46) ну вот единственным критерием является процент недозанруза машин по объему...
(39)(47) увеличьте количество заказов до 1000, а мошин до 80... сколько врмеени это будет решаться простым перебором?
49 Mikeware
 
21.09.09
17:53
(48) Смотря как написать этот "простой перебор"
50 ado
 
21.09.09
17:54
(48) >> сколько врмеени это будет решаться простым перебором?

Ну, если сделать на базе офисной сети выч. кластер и каждую ночь его заставлять это считать ... наверное справится ;-)
51 hhhh
 
21.09.09
17:55
(48) может, с другой стороны подойти, берем самый большой заказ и грузим в самую маленькую машину и так далее по этому же принципу.
52 manyak
 
21.09.09
17:55
метка
53 Fragster
 
гуру
21.09.09
17:55
ну, на самом деле, если оптимизировать на предмет одинаковости размеров машин и заказов - вполне может быть и не очень много
54 Fragster
 
гуру
21.09.09
17:55
(53) к (48)
55 ado
 
21.09.09
17:56
(51) Осподи еще один. Этот способ не дает самого оптимального варианта.
56 Торин
 
21.09.09
17:56
(49), (50) ... ну дык вот алгоритмик бы мне... Перебор + "метод ветвей и границ" (он же эвристика Брудно)? Пока ничего лучше не могу придумать...
57 hhhh
 
21.09.09
17:57
(55) нам не нужен самый оптимальный. Нам нужно чтобы в 10% уложились. Читай условия задачи.
58 ado
 
21.09.09
17:58
Стоп, погодите, а там разве не всего n*m вариантов? Это же совсем быстро посчитаться должно.
59 ado
 
21.09.09
17:58
(57) Читай сам внимательно всю ветку.
60 XLife
 
21.09.09
17:59
61 Торин
 
21.09.09
17:59
задачка комбинаторики с ограничением - разбить n предметов на m групп... если не путаю, там что-то порядка n в степени m
62 Торин
 
21.09.09
18:00
(60) это программка решает задачку оптимальной укладки ОДНОГО заказа в одну или несколько машин... у меня задачка другая...
63 Snorkler
 
21.09.09
18:01
(48) Многое зависит от дисперсии объемов груза. Если все заказы составляют 51% от максимального объема машин, то можно поиметь 49% недогруза. И никакой алгоритм не поможет. Если мало заказов с небольшим объемом, трудно будет плотно упаковать машины. Хотя... При средних 12,5 заказа/машину, наверное, можно упаковать и лучше 80%...
64 Злопчинский
 
21.09.09
18:02
Автор! скинь мне эксельный файл в три столбца вида
номер заказа, объем заказа, вес заказа
- натравлю на свой алгоритм, скину тебе посмотреть (самому мне интересно)
65 Торин
 
21.09.09
18:03
ок, скину. тока... часа через два устроит? а то домой надо ехать, с работы уже гонют... почта в личке?
66 Торин
 
21.09.09
18:04
а идеей алгориттма поделешься? не кодом, просто идеей...
67 Mikeware
 
21.09.09
18:04
(64) А объемы машин не важны?
68 Злопчинский
 
21.09.09
18:04
(65) дубль ответа отправил тебе на мыло. отвечай на него. да устроит, я тож как раз буду дома часика через два.
69 ado
 
21.09.09
18:04
(61) А мне таки кажется, что n*m, или у меня уже совсем маразм.
70 Злопчинский
 
21.09.09
18:04
(67) для начала считаем что все машины - одинаковые...
71 Торин
 
21.09.09
18:04
(63) я тоже думаю, что можно бы... но не идет...
72 hhhh
 
21.09.09
18:05
(69) но n = 1000 факториал.
73 Злопчинский
 
21.09.09
18:05
(66) рекурсивный алгоритм, обсуждался здесь (NS), делал по нему с вылавливанием парочки ошибок. кое-где подглючивает по мелочи, но мне это некритично, но хочу доточить до ума...
74 ado
 
21.09.09
18:06
(71) Что не идет? Лучше 80%? Сам же сказал, что снизил недогруз до 15-17%
75 ado
 
21.09.09
18:07
(72) Блин, да откуда там факториал то?
76 Злопчинский
 
21.09.09
18:10
тут бяка в "суммарном недозаполнении"...
имхается мне бабахаем рекурсию, с доп услвоиями типа "отбор сначала самых крупных", "отбор сначала самых мелких" и "смешанный отбор" - получим псевдооптимальное решение... более чем уверен, что примерно при равных объемах заказов особо точно смысла считать нет - будет все примерно одинаково по критерию "суммарного незаполнения" - если одну машину набъем под 90% то какаие то другие будут поменьше заполнены... а вот если размеры заказов очень сильно варьируются - тут можно и выиграть одну машину...
77 Гот
 
21.09.09
18:11
Сортируешь по объему, и по очереди размещаешь в отсоритрованные по объему (в другом направлении сортировки) машины. И никакой автоматизации. Задача для детей. Все остальные варианты - бессмысленные понты.
78 ado
 
21.09.09
18:14
(76) Смотри (44) Автору не нужно псевдооптимальное решение, автору нужно строго доказать, что лучше уже нельзя.
79 YauheniL
 
21.09.09
18:15
(0) Тебе какой параметр операции оптимизировать надо? В чем выигрыш получить?
80 Злопчинский
 
21.09.09
18:16
(12) > потому что я в этой конторе уже пятый месяц сижу... и с логистами, и с кладовщиками и даже с грузчиками уже море водки выпил...
- ну ты еще водки попей
81 Злопчинский
 
21.09.09
18:16
се проблемы нахрен отпадут.. потому что решать не сможешь... ;-)
82 YauheniL
 
21.09.09
18:20
(0) Метод Монте-Карло: раскидываем случайно груз по машинам, считаем заполненность, запоминаем. Делаем так 50 000 раз. Выбираем лучший вариант из попавшихся (очень сильно зависит от ГСЧ)
83 Злопчинский
 
21.09.09
18:23
> важно - уменьшить не дозагрузку машины... требуется недозагрузка - не более 10%, сейчас - около 20%
- вряд ли сильно выиграешь. при большом обьеме и куче мелких коробок разных размеров, потеря в объеме (эмпирическая оценка, из-за неоптимальности укладки составляет от 0 до 20% объема) что твои цифры и подтверждают... пакуй/рассчитывай как работали раньше - просто увеличь поправочный коэффициент и все... выиграешь ты одну машину из 80, но потеряешь по времени погрузки, которое увеличиться из-за рекомендуемой раскладки...
84 YauheniL
 
21.09.09
18:23
(0) Еще можно "генетический алгоритм" прикрутить. Дольше, чем метод Монте-Карло, но и дает лучший результат. Тут главное целевую функцию правильно составить
85 ado
 
21.09.09
18:29
(82) Нахрена? Полный перебор.
86 ado
 
21.09.09
18:30
(84) Писатель не читатель? Целевая функция давно определена и проста как табуретка.
87 Злопчинский
 
21.09.09
18:38
эх блин, не удастся оперативно автору помочь... у мну разбиение считается для одинаковых "машин"...
88 ado
 
21.09.09
18:39
(69) Да, таки маразм. m^n таки. Полный перебор не катит. Хотя, если среди машин есть одинаковые, то вариантов будет меньше.
89 YauheniL
 
21.09.09
18:57
(85) В порядки быстрее
(86) значит, ознакомиться с высказанным в (84) -- и в добрый путь

З.Ы. это, конечно, если вообще хочется что-то сделать
90 andrey_lg
 
21.09.09
19:53
Просьба автору написать о том на каком решении он все таки остановился.
В свою очередь я предлагаю вот что, нужно оптимизировать загрузку каждой машины по количеству предметов а уже потом по весу. Этот вариант должен дать лучший результат когда коробки "примерно одинаковые".То есть разброс не большой в обьемах коробок.
91 Злопчинский
 
21.09.09
21:39
(90) вес можно пока вообще исключить...
92 ilya_i
 
21.09.09
22:39
1. Если пофигу на логистику, то разбивай заказы на части.
2. Если логисты и кладовщики откажутся, значит надо еще выпить и вернуться к пункту 1.
3. Если клиенты откажутся, то пусть машины ездят гуськом друг за дружкой и собирают заказ на месте, далее см. пункт 2
93 Snorkler
 
24.09.09
09:38
(0) Андрей, тема еще актуальна?
Если да, то можно ли как-то получить конкретные данные, на которых можно было бы потестировать.
94 Леха Дум
 
24.09.09
09:58
Зря вы забиваете на логистику. Если будет получаться раскладка оптимальная по загрузки + оптимальная по маршруту, то и экономия по времени будет и по бензину и по машинам.
95 dk
 
24.09.09
12:03
Тоже влезу
(0) Можно уже расшифровать "машины недозагружены"?
1. По расчетам дожно влезть 15 заказов, а загрузят удалось только 13
2. По расчетам дожно влезть 15 заказов, загрузили 15 заказов, а места еще дофига и больше
-----
Водители наверняка грузят по маршруту, т.е. сначала самые последние заказы, а ближе к разгрузке самые первые по маршруту
96 Snorkler
 
25.09.09
11:09
(93)+  Послал письмо на Gmail.
97 assasu
 
25.09.09
11:12
(0) не надо изобретать велосипед. Это обычная задача линейного программирования. Идешь в библиотеку, берешь книгу и решаешь
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.