Имя: Пароль:
IT
 
Подскажите алгоритм - как собрать список товаров из прайса на минимальную цену
,
0 LienXo
 
24.07.18
22:56
Есть список необходимых товаров (до 50 позиций). Каждый товар нужен по 1 штуке. Есть прайс, состоящий из номенклатуры-наборов. Т.е. номенклатура из прайса может состоять из одного или нескольких требуемых товаров. Один товар не встречается чаще чем в 10 номенклатурах. Необходимо собрать список номенклатуры, включающей весь список товаров (допускается попадание товара 2 и более раз) на минимальную сумму.
1 PR
 
24.07.18
22:57
Так так. И как сделал?
2 LienXo
 
24.07.18
22:59
(1) если бы сделал - не спрашивал :) Тупым перебором - лень, ищу легких путей
3 PR
 
24.07.18
23:02
(2) А, так это вопрос :))
А то вопросительных знаков просто не видно :))
4 LienXo
 
24.07.18
23:04
(3) Думал слова "подскажите" в заголовке будет достаточно
5 PR
 
24.07.18
23:08
(4) Схалтурить думал? :))
6 Garykom
 
гуру
24.07.18
23:08
Алгоритма ускоряющего подбор одного списка товаров нет.

Но возможны алгоритмы с предобработкой прайсов (номенклатур-наборов), чтобы затем быстро подбирать требуемые по списку товары.
7 PR
 
24.07.18
23:10
А откуда такая задача-то?
8 Garykom
 
гуру
24.07.18
23:12
Делаешь полный перебор сочетаний номенклатур (пересечений множеств товаров) так чтобы создать/выбрать более крупные наборы включающие минимум пересекающихся товаров.

Затем входной список товаров банально в списке товаров, где лучше соответствие то и берешь и добиваешь одиночными номенклатурами или 2-ми, 3-ми и т.д. как получится.
9 LienXo
 
24.07.18
23:14
(8) наиболее крупные не всегда проходят - например два парных товара могут оказаться (ну вот такой прайс) дешевле группы из четырех, в которую они входят.
10 Garykom
 
гуру
24.07.18
23:15
(9) Тьфу у тебя минимизация по отдельному параметру - цене а не кол-ву.
11 LienXo
 
24.07.18
23:15
+(9) не два парных а две пары. Типа печенька+конфетка = рупь и яблоко +банан = рупь. А все четыре вместе - 3 рубля.
12 LienXo
 
24.07.18
23:19
(7) поликлиника - профосмотры.
13 PR
 
24.07.18
23:20
Куча вложенных циклов
Первый по номенклатуре, в которой есть товар1
Второй по номенклатуре, в которой есть товар2
И так далее
В случае, если товарN уже есть в набранных товарах, то пропускаем
14 LienXo
 
24.07.18
23:22
(13) я же в 2 сказал - перебором можно, хотел че нить из высшей математики, счас так модно :)
15 Garykom
 
гуру
24.07.18
23:23
(13) Перебором "до 50 позиций" будет пипец как долго.
16 PR
 
24.07.18
23:23
(14) Так тут только перебор
17 PR
 
24.07.18
23:24
(15) Ну таки да, а что делать?
18 LienXo
 
24.07.18
23:24
(15) надеялся что нить типа "рюкзака" всплывет. Просто основы анализа так давно проходил... мимо...
19 PR
 
24.07.18
23:25
+(17) 10^50 по максимуму так-то, да :))
20 RomanYS
 
24.07.18
23:28
(12) номенклатура это врачи?
21 Garykom
 
гуру
24.07.18
23:29
Попробуй для начала деревья из номенклатур-наборов построить и глянуть ветвистость.

"Типа печенька+конфетка = рупь и яблоко +банан = рупь. А все четыре вместе - 3 рубля."

"печенька+конфетка" и "яблоко+банан" входят в "все четыре вместе" и т.д.

затем откинуть те в которых крупный набор дороже чем сочетание мелких
22 Garykom
 
гуру
24.07.18
23:31
(20) Думаешь цель минимальным кол-вом врачей закрыть максимум специальностей/услуг и как можно дешевле?
23 LienXo
 
24.07.18
23:31
(20) нет. Анализы. Врач - всегда один в номенклатуре
24 Garykom
 
гуру
24.07.18
23:32
Минимизация по затратам на зп врачей ))
25 RomanYS
 
24.07.18
23:33
(23) они что какими-то комплексами идут? 50 анализов? Вы космонавтов обследуете?
26 LienXo
 
24.07.18
23:33
(24) Если бы - глупое пожелание заказчика минимизировать счет клиенту :)
27 Garykom
 
гуру
24.07.18
23:34
А может просто прайс лист заставить поменять? На нормальный без наборов а одиночные только.
28 RomanYS
 
24.07.18
23:34
(26) Добавить в прайс комплекс из 50 анализов не предлагали?
29 LienXo
 
24.07.18
23:34
(25) Ты не поверишь какие требования у минздрава к нянечкам в детсадах :)
30 Garykom
 
гуру
24.07.18
23:38
Кстати задачка идеальна для тупого параллельного перебора - на GPU (OpenCL или CUDA).
31 Garykom
 
гуру
24.07.18
23:39
(30)+ Любая новая видяшка (из ныне продающихся) уже умеет из коробки OpenCL (почти все) или CUDA (nvidia)
32 Asmody
 
24.07.18
23:44
33 PR
 
24.07.18
23:45
Хотя..., может как-то так...

Берем набор из десяти наиболее дешевых товаров, где в первой номенклатуре есть товар1, во-второй есть товар2 и т. д.
Фиксируем текущую минимальную стоимость

Пробуем с помощью вложенных циклов убирать товары, после убирания которых в остальных товарах все-равно полный комплект
В случае удачи фиксируем новую текущую минимальную стоимость, если она меньше текущей

После этого пробуем перебор с отсечением ветки в случае, если новая стоимость выше или равна минимальной
34 PR
 
24.07.18
23:50
Да, это вам не задачки 1Сергея для начальной школы :))
35 Asmody
 
24.07.18
23:59
(32)+ Если товар попадает в набор точно один или ноль раз, то это задача 0-1 ЦЛП. Немного проще, но не сильно.
Задача NP-полная, алгоритмов для нее масса. И точные, и эвристические. Всё есть в Яндексе.
36 Garykom
 
гуру
25.07.18
00:10
37 Garykom
 
гуру
25.07.18
00:10
38 Garykom
 
гуру
25.07.18
00:12
39 Garykom
 
гуру
25.07.18
00:14
"На классах задач, где n или m ограничены константой, задача за полиномиальное время решается методами полного перебора."

Хочешь точное решение - только полный перебор ))
40 Сияющий в темноте
 
25.07.18
09:39
Наборы можно разбить на группы,если можно выделить непересекающиеся группы наборов,это сильно уменьшит перебор.
И еще,нужно понимать,что иногда для решения придется допустить брать лишние товары,если,например,нам нужен банан и вишенка,которые по два рубля,а набор банан,вишенка и яблоко три
41 Михаил Козлов
 
25.07.18
10:06
(28) Присоединяюсь. И повторений не будет: как-то странно будет выглядеть счет, где придется 2 раза сдавать кал.
42 Сияющий в темноте
 
25.07.18
10:52
Наборы можно разбить на группы,если можно выделить непересекающиеся группы наборов,это сильно уменьшит перебор.
И еще,нужно понимать,что иногда для решения придется допустить брать лишние товары,если,например,нам нужен банан и вишенка,которые по два рубля,а набор банан,вишенка и яблоко три
если упорядочить товары,то перебор можно сильно сузить,перебирая только группы,где нет товаров с меньшим кодом,состоящим в списке,но тогда придется делать захват групп с товаром,даже если его выбрали ранее,т.к.иначе можно пропустить группу или ставить у товара признак перебираемый,если по нему идет перебор и отбрасывать группы с товарами,которые идут раньше и перебираемые
43 Asmody
 
25.07.18
10:58
(41) Тебе сложно штоль?
44 NSSerg
 
25.07.18
11:01
(42) Сейчас так-же в например в Хеликсе, когда сдаешь кровь - зачастую делаешь лишние анализы, так как в наборе дешевле.
45 Михаил Козлов
 
25.07.18
11:07
(43) В смысле алгоритм найти/придумать или кал сдать?
После 5-ого курса были военные лагеря. Так вот один однокашник впервые сходил по большому через 3 недели.
Так что разные бывают ситуации.
46 Кирпич
 
25.07.18
11:15
похоже на задачку c sql-ex.ru
47 Михаил Козлов
 
27.07.18
13:07
Может быть попробовать другую постановку задачи:
определить стоимость каждого анализа с условием, что сумма
анализов входящих в набор = стоимости набора (из прайса) и сумма стоимостей всех анализов - минимальна.
Искомые переменные: Xi - стоимость i-того анализа
Ограничения:
1. Xi>=0
2. СУММА(Xi по входящим в набор j) = Цj (цена набора из прайса) (для всех j)
3. СУММА(Xi) -> MIN

Это задача линейного программирования. Реализация симплекса метода на 1С есть - могу выслать.
Задача специальной структуры - может можно свести к потоку в сети.