Имя: Пароль:
1C
1C 7.7
v7: И снова рюкзак
,
0 mrJill
 
27.06.17
16:18
Некая вариация задачи о рюкзаке.
Необходимо набрать товара из таблицы на сумму не меньшую заданной с минимальной разницей.
Реквизиты Наименование, Количество, Цена.

Т.е. Цен2*кол + цен5*кол + цен8*кол >= искомая сумма
где кол - необходимое количество, не большее количеству по строке в таб.

Буду благодарен знатокам за помощь с алгоритмом.
1 mrJill
 
27.06.17
16:19
ЗЫ: тему Нужен алгоритм набора нужной суммы видел, но к конкретному более-менее оптимальному решению с количеством еще не пришел...
2 МихаилМ
 
27.06.17
16:41
какое
макс  кол-во  номеклатур
макс кол-во

макс время расчета ?
3 mrJill
 
27.06.17
16:49
Номенклатур десятки - сотни.
Количеств по строке десятки, сотни иногда тысячи.

Макс время - в пределах двух. сек - будет отлично.
Если больше, то чем меньше, тем лучше, конешн.

Если по итерациям ограничение превысит - соберу жадным. Но сначала хотелось бы чем-нибудь вменяемым поискать.
4 Garykom
 
гуру
27.06.17
16:57
Комбинаторику знаем? Составь заранее базу всевозможных сочетаний с готовыми суммами и используй поиск по ней по полю "сумма".
5 Garykom
 
гуру
27.06.17
16:58
(4)+ Если база будет слишком большая то почти одинаковые значения суммы (и их составляющие) можно почистить/выкинуть.
Причем как самые большие наборы так и наоборот самые мелкие оставить, на ваш вкус.
6 mrJill
 
27.06.17
17:17
(4) комбинаторику знали, но, к чертям, забыли.
Как и практически всю вышку (слишком много времени прошло с тех пор как была необходимость ее использовать).

Ну и не хотелось бы все варианты перебирать.
7 Garykom
 
гуру
27.06.17
17:22
(6) Варианты перебираешь заранее а потом только хранишь/используешь.
Надеюсь номенклатура и цены меняются не часто?
8 NSSerg
 
27.06.17
17:27
(7) Это шутка?
До какого значения кол хранить?
Даже если товаров всего 100, и кол равно либо нулю, либо единице, количество комбинаций 2^100, примерно равно 10^30
9 mrJill
 
27.06.17
17:37
(7)ТиС
В доке ПКО выбираем движения по взаиморосчетам, далее по каждой реализации подбираем товары на сумму гашения (точнее на не меньшую, с мин. разницей).
Проиходит сие каждый раз по нажатию кн. печать (т.е. даж последовательность доков играет роль).
Даж если будет такая необходимость, то хранить что-либо рассчитанное заранее по данной задаче не реально.
10 Garykom
 
гуру
27.06.17
18:00
(8) "Искомая сумма" сильно ограничивает количество комбинаций.

К тому же можно банальным множителем (для кол-ва) легко подогнать меньшую комбинацию под большую сумму.

ЗЫ Прекрасно понимаю что можно применять алгоритм набора суммы из нужного числа купюр/монет. Но перебор комбинаций прикольнее ))
11 mrJill
 
27.06.17
18:32
(10) так "Искомая сумма" сильно ограничивает или "всевозможных сочетаний"

Вопрос именно в алгоритме, учитывающем подобные ограничения.

Банальный множитель должен быть не отрицательным, не большим количества по строке.

Да это она и есть, только ограничение справа, а не слева, купюр произвольное множество и для каждой купюры стоит свое ограничение по количеству.

Тем не менее, да, самая близкая. Теперь бы понять как это адаптировать...
12 Garykom
 
гуру
27.06.17
18:34
Можно для перебора вариантов заюзать GPU (на CUDA или OpenCL).
13 Garykom
 
гуру
27.06.17
18:35
(11) Можешь задачку подробнее описать и с примерами?
В т.ч. какие граничные условия, вот банально количество это натуральное число?
14 Garykom
 
гуру
27.06.17
18:36
А еще лучше цель этого "набора из корзины" какая?
15 mrJill
 
27.06.17
19:13
(14) цель подобрать реальный товар на необходимую сумму, как можно ближе к заданной.

Да, количества, как правило, натуральные.

Салфетки 200р 5 шт.
Костыли 8900р 10 шт.
Корсеты 5100р 11 шт.
Гематогены 60 5 шт.
Подгузники 4700р 2 шт.

Нужно набрать товара на сумму большую 9450, максимально близкую к данной.

Т.е. 2 подгузника и один гематоген.
16 Михаил Козлов
 
27.06.17
19:13
(9) Вечная тема: за что заплатил клиент (по номенклатурно)?
17 mrJill
 
27.06.17
19:14
(14) цифры из головы.
Цены могут быть не только натуральные.
18 mrJill
 
27.06.17
19:16
(16) конечно.
Только теперь законодательно нужно выводить сие в чек.
И, не смотря на то что в типовой сие отсутствует, руководство хочет требование выполнять "от и до".
19 Михаил Козлов
 
27.06.17
19:28
(18) Ну напечатаете Вы что-то, а при следующем платеже что будете делать: нужно же учесть, что уже напечатано и на какую сумму. Мне кажется, как минимум нужен регистр накопления. Тем более сумма платежа может не совпасть с подобранной.
Может административно заставить оплачивать 1 реализацию ПОЛНОСТЬЮ?
20 Garykom
 
гуру
27.06.17
19:47
(16) (18) Эээ вы что хотите аванс одной суммой раскидать только на часть позиций в документе?

Нафига???
21 mrJill
 
27.06.17
19:52
(19) в случае если сумма гасится по реализации полностью, естественно все товары берутся.
Административно заставить - не реально.
Плюс авансы никуда не деются...
22 mrJill
 
27.06.17
19:53
(20) нет. Аванс есть аванс.
Но вот часть оплаты, которая реально ставит отгрузку в кредит - да на часть позиций. :)
23 Garykom
 
гуру
27.06.17
19:54
(21) Не страдайте идиотизмом, в случае опта у вас идет не оплата конкретных товаров.

А оплата товара по конкретному договору или документу поставки... Так и следует писать.

(22) Один фиг, 1-й аванс, 2-й аванс или 100-й аванс...
24 mrJill
 
27.06.17
19:56
В любом случае: эт все неважно.

Имеется вот такая странная задача и есть алгоритмическая проблема в ее реализации.
25 Garykom
 
гуру
27.06.17
19:56
Товар: Оплата по договору XXX
Количество: 1
Цена: 10000 р
Сумма: 10000 р.


Все!
26 mrJill
 
27.06.17
19:58
(25)
1. это реально противоречит новому закону.
2. не важно на сколько данная задача дурацкая, она есть и её необходимо решить в том виде, в котором она поставлена...
27 Garykom
 
гуру
27.06.17
20:05
(24) Если задача из ТЧ документа (в 100 позиций макс), где разная номенклатура с разной ценой и разным кол-вом.

Требуется выбрать часть позиций (товар, кол-во, цена) на заданную сумму - то это классический https://ru.wikipedia.org/wiki/Задачаоранце

Конкретно если нужно самое точное решение то https://ru.wikipedia.org/wiki/Методветвейи_границ

Если наиболее быстрое решение то можно попробовать "генетический алгоритм".
28 Garykom
 
гуру
27.06.17
20:11
(27)+ Пока ничего лучше чем "параллельные генетические алгоритмы" еще не придумали, почитать можно http://www.intuit.ru/studies/courses/14227/1284/lecture/24174?page=1
https://interactive-plus.ru/ru/article/11099/discussion_platform
29 mrJill
 
27.06.17
20:14
(27)я первом посте написал "Некая вариация задачи о рюкзаке"
И линки на обсуждение дал.

Проблема в ограничении суммы "справа", а не "слева" и в прикручивании туда количества.
30 Garykom
 
гуру
27.06.17
20:19
(29) Какая разница с какой стороны сумму ограничивать?

А еще вместо добавления в рюкзак можно же из него выкладывать, пока не останется то что надо.
31 mrJill
 
27.06.17
20:24
(30) вот эту разницу я пока и не могу осмыслить.
Можно, если не сложно, пример на базе (15)?
32 Garykom
 
гуру
27.06.17
20:25
(29) Если думаешь что существует простой (для понимания) готовый алгоритм который легко взял и приспособил... то глубоко ошибаешься!

Даже банальный полный перебор не так то просто написать без ошибок. Это блин не проведение документа по регистрам и даже не вычисление себестоимости.

Если не подумать насчет скорости алгоритма, да банальное представление-хранение в памяти данных над которыми работаем, то ничего не получится на требуемых тебе объемах.

Для начала выкинь коды/ссылки номенклатуры и замени её целыми числами по порядку. Далее все в массив и уже дальше думаем.
33 Garykom
 
гуру
27.06.17
20:27
(31) Если не срочно то могу сделать и выложить почти готовое решение на ИС.
Счас слегка занят, прикручиваю кассу к древней измененной конфе
34 mrJill
 
27.06.17
20:30
(33) ну, до 30 буду этим заниматься...
Буду благодарен, за пример.

Касса какая?
У меня тоже конфа древняя. М.б. смогу чем-то поделиться.
35 Garykom
 
гуру
27.06.17
20:33
(34) атол 22ПТК модернизированная и альфа-авто 4.1.01.28 сильно перепиленная
36 mrJill
 
27.06.17
20:37
(35) понятно.
Не, с Альфа-авто дел никогда не имел.
37 Garykom
 
гуру
27.06.17
20:41
(36) Я тоже не имел, но глубоко пофиг какая конфа если их уже более сотни разных видел/имел дело.

Тут проблема что они заразы не только 54-ФЗ в новой версии 4.1.01.29 добавили но и еще кучу мелких багов поисправляли, а много из них у этих товарищей тоже исправлены но совсем другими способами.
А уж своего понапилено просто пипец ну и как вишенка на торте это система защиты от Рарус :)
38 mrJill
 
27.06.17
20:57
(37) вообще на ИС есть "Комплект для печати Чеков ККМ для Атол и Штрих без подключения в 1С драйверов торгового оборудования"

К любой не типовой можно без серьезных заморочек прикрутить.
39 Волшебник
 
модератор
27.06.17
21:22
(38) круто
40 NSSerg
 
27.06.17
22:51
(12), (13), (14) - а можно не изобретать велосипед, а просто посмотреть нормальные методы решения рюкзака.
41 mrJill
 
28.06.17
09:33
Это либо какой-то прикол, либо новое движение "дай чуваку ощутить себя полным идиотом".

Все знают что это "стандартная" задача рюкзака, все знают что есть масса методов решения. Начиная от ДП и "Ветвей и границ" и заканчивая построением сеток по Лагарису-Одлузко, поисков кратчайших по Лейнстра-Лейнстра-Ловаса и нахождению оптимальных по Каннага Финке Поста. Но все почему-то хранят тайну каким образом привести описанную задачу к любому из указанных методов. Как лучше разобрать количество, как найти оптимальные решения при ограничении "справа" - все для всех очевидно.
Да я тоже знаю о существовании этих методов, но как конкретно применить хоть один из них к задаче и не ждать мегалета?
Для меня это не очевидно. Потому и прошу знающих людей прояснить ситуацию.
42 sFAQer
 
28.06.17
09:47
(41) Генетический бери, ГСЧ за тебя всё сделает
43 mrJill
 
28.06.17
10:09
(42) я понял. Таки движение.
44 PCcomCat
 
28.06.17
10:28
Оплата по накладной, содержащей товары, или по договору, или как-то еще? Идентифицировать документ отгрузки возможно? Или вы весь справочник берете, или все обороты по товарам?
45 mrJill
 
28.06.17
10:30
(44) беру кредитные реализации из движений покупателей.
Товар подбираю из них.
Но тут проблемы нет. Проблема в адаптации алгоритма.
46 mrJill
 
28.06.17
10:31
Не лучший пример адаптации (самый очевидный):

РюкзакПо(СуммаВсехЭлементов - ИскомаяСумма);
По полученному массиву:
Для К = 1 По КолСтрВМассиве Цикл
Таб.Кол = Таб.Кол - Таб.ВыбКол
КонецЦикла;

Количество перебираем как здесь: Нужен алгоритм набора нужной суммы
47 sFAQer
 
28.06.17
10:35
(43) А ты чего хочешь? Код за тебя написать? В генетическом алгоритме всё предельно понятно, генерируешь случайные наборы в определённом количество например 2000 наборов, и выбираешь из них лучший. Что непонятного то?
48 PCcomCat
 
28.06.17
10:43
(45) Если есть возможность идентифицировать накладную оплаты, то можно вычислить: долю оплаты документа. Например, если это первая частичная оплата, тогда берем с первой позиции в документе на нужную сумму, корректирую пропорционально количество, пусть даже будет дробное количество - это не запрещено законом. Если это последующая частичная оплата, тогда сначала исключаем с первой позиции все товары на сумму предыдущих оплат, а затем из остатка товаров точно также собираем для текущей оплаты.
По мне так логичнее. Иначе рискуете один и тот же товар в чек выводить, в тоже время другой вообще никогда не вывести.
49 PCcomCat
 
28.06.17
10:45
+(48) Ну и погрешности расчета суммы учитывайте
50 mrJill
 
28.06.17
10:53
(48) Один и тот же товар - ничего страшного.
Отследить что клиент дважды за один и тот же товар заплатил даже сам клиент не всегда сможет - если такая необходимость у него вообще возникнет (что в нашем случае - вряд ли). Гарантированно подбирать различный товар можно только с заведением отдельного регистра. Да и то на момент до и после восстановления последовательности он будет разным.

А вот 3,2 костыля в чеке могут вызвать вопросы.
51 PCcomCat
 
28.06.17
10:59
(50) В разобранном состоянии =))
52 Ildarovich
 
28.06.17
12:27
Вот тут http://catalog.mista.ru/public/460935/ в задаче 23 описана готовая функция.

В процессе ее обсуждения с Олегом Родионовым (ovrfox) родился более эффективный вариант (там из комментариев можно прямо готовые обработки скачать). Хотя там для 8-ки, ничего особенно восьмерочного в коде нет, можно переписать на 77, либо просто идею алгоритма взять.

Хотя там заявляется метод ветвей и границ, на самом деле это просто "рациональный" перебор. Превратить куски материала в номенклатуру несложно - это буквально одно и тоже. Как расширить условие на больше прямо сейчас не скажу - нужно еще подумать.
53 Garykom
 
гуру
28.06.17
12:40
(40) С удовольствием бы посмотрел нормальные методы решения рюкзака аналогично быстрой сортировке https://software.intel.com/ru-ru/articles/gpu-quicksort-in-opencl-20-using-nested-parallelism-and-work-group-scan-functions
54 Михаил Козлов
 
28.06.17
12:48
(52) Если Вы имеете в виду 23. Оптимизация подбора кусков заданного суммарного метража методом ветвей и границ, то ветвями и границами там и не пахнет: не развиваются явно неперспективные ветки, когда добавление нового куска бессмысленно.
В ветвях и границах подразумевается использовать "релаксированную" задачу (обычно снятие условие целочисленности) для получения оценки значения функционала и отсечения ветви, если оценка хуже рекорда.
Можете напустить эту процедуру на задачу, в которой число кусков = 2N+1, длина каждого = 2, а требуемая сумма = 2N+1 и посмотреть, как долго она будет работать.
55 Garykom
 
гуру
28.06.17
12:50
(53)+ Хмм оказывается кое что есть https://homepages.laas.fr/elbaz/4676b763.pdf

Гуглится "knapsack problem gpu"
56 mrJill
 
28.06.17
12:52
(52) Спасибо!

Кстати, проверил на реальных данных вариант из (46) и, т.к. реализация, как правило, редко гасится, вполне себе рабочий (те самые ветки и границы, по-моему). Сейчас добавлю жадину и буду сравнивать на предмет меньшей дельты (в предыдущем стоит итерационное ограничение).

Далее можно более быстрые рюкзаки засунуть по схеме (46)
57 mrJill
 
28.06.17
12:53
* редко гасится на малую сумму - как правило почти полностью.
58 Garykom
 
гуру
28.06.17
12:53
(55) Если они не сильно наврали в табличке тестов то офигенное ускорение на видеокарте получается.

Использовали Tesla C2050 / C2070 GPU с 448 ядрами CUDA.
http://www.nvidia.ru/object/product_tesla_C2050_C2070_ru.html
59 Ildarovich
 
28.06.17
12:56
(54) Ну, методом ветвей и границ там все-таки "пахнет", но это действительно не настоящий метод ветвей и границ, вы правы, в названии я ошибся.
60 Ildarovich
 
28.06.17
13:18
(54) Взял 501 кусок по 2 метра, задал 1001 метр, получил "пустой" ответ через 801 миллисекунду: http://pixs.ru/showimage/SkrinSHotR_7664998_26690560.png
61 Михаил Козлов
 
28.06.17
13:36
(60) Согдасно (54) требуемая сумма = 2*250+1, т.е. 501, а не 1001.
62 Ildarovich
 
28.06.17
15:11
(61) Ответ через 440 мсек. )) http://pixs.ru/showimage/SkrinSHot1_4706534_26691995.png

Это я к тому, что то, что метод не является МВГ (который тоже перебор и в случае неудачной функции отсечения будет близок к полному, то есть не только временем будет отличаться, но и памятью (недостаток МВГ)) не означает, что он практически плохой. Как раз практически он хороший.

Идея там в том, что сначала жадным алгоритмом подойти как можно ближе, а затем искать малыми изменениями полученного решения - убирая - добавляя по одной номенклатуре. Работает очень быстро.

Ценную мысль, что оценку для МВГ можно получить, решив ЗЛП, я взял на заметку.
63 МихаилМ
 
28.06.17
20:21
я бы взял старый добрый симлекс .
но он может плохо работать на целочисленных коэффициентах.
те нужна адаптация (банально - округление)


выложите тестовые данные на 1000 примеров
тогда можно будет выбрать самый быстрый.
64 NSSerg
 
29.06.17
13:19
(58) Они же все известны. Симплекс, метод ветвей и границ, методы динамического программирования  и т.д.
На практике очень хорошо работает метод ветвей и границ.

Полный перебор с отсечением как только превышаем требуемую сумму, начиная с наиболее тяжелых предметов (Дорогих товаров)
Можно еще добавить отсечения.
65 NSSerg
 
29.06.17
13:27
+ (64) Если тексумма + весминимальногопредмета >= Целевая сумма, тогда добавляем минимальный предмет из оставшихся, и прерываем ветвь.
66 NSSerg
 
29.06.17
13:38
+ (65) Если ТекСумма + максимальныйпредметизоставшихся >= ЛучшийДостигнутыйРезультат результат,
То перебирать начинаем не с большего предмета, а с наиболее тяжелого предмета с весом меньшим чем ЛучшийДостигнутыйРезультат - ТекСумма,
например методом половинного деления.



Перед запуском алгоритма нужно создать отсортированный массив предметов (стоимостей) различной стоимости в порядке убывания стоимости, и массив количеств предметов каждой стоимости.
67 Михаил Козлов
 
29.06.17
18:59
(62) Общий метод решения ЗЛП (например, симплекс) для рюкзака не стоит использовать, т.к. в случае рюкзака релаксированная задача ЛП (одно ограничение, не считая 0<=Xi<=1) допускает аналитическое (тривиальное) решение.
НО! Для случая подбора кусков (целевая функция совпадает с ограничением) релаксированная задача в качестве решения будет ВСЕГДА давать значение ограничения, т.е. ничего отсечь не позволит.
(64) "Симплекс, метод ветвей и границ, методы динамического программирования  и т.д." - это совершенно разные методы.
Если симплекс предназначен исключительно для ЗЛП, то ветви без границ и дин. прог. собственно не методы (алгоритмы), а схемы, которые могут применяться для задач различных классов.
68 NSSerg
 
29.06.17
19:59
(67)  я писал что это одинаковые методы?
69 Михаил Козлов
 
29.06.17
20:17
(68) Извините, видимо я Вас в (62) неверно понял.
70 NSSerg
 
29.06.17
20:31
(69) в (62) ведь не я :)
Хотя обсуждается вроде мой старый код, который на практике очень быстро сходится.
71 пипец
 
29.06.17
22:00
есть метод 1Сный ))) (исходя из пожеланий бухгалтеров и финансистов)
использовать метод пузырька соосный , сиречь - при запросе создаются группы (при прямом быстрее но не суть) которые согласно алгоритма, УЖЕ - сами используют метод пузырька - пример граф (Маньяка чот не видно давно)
72 Ildarovich
 
29.06.17
22:12
(67) ...т.е. ничего отсечь не позволит...
это понятно, но у меня мелькнула мысль, что оценкой будет значение, вычисленное на основе округленных значений переменных из решения ЗЛП. Дальше пока не думал, поэтому настаивать не буду...

В (63) возможно, имеется ввиду метод Гомори.
73 пипец
 
29.06.17
22:16
вложенность проверяется , на сравнение выхода по наименьшему результату из подмножества
74 пипец
 
29.06.17
22:17
я в названиях не силен (кому они нафинг нужны) , но система работает за тот последний который первый в матрицу не сложился , типа тз, так понятнее ?
75 пипец
 
29.06.17
22:18
тада уж Гаусса
76 пипец
 
29.06.17
22:20
кстати в 8-ке , в 7-ке тоже такого нет, только математически, и то 1-у копейку от акциза - все равно потеряешь, проценты это не часть от числа, это производная
77 Garykom
 
гуру
29.06.17
22:28
(71) Это как бы и есть построение дерева - смысл метода ветвей и границ.
А затем перемещение по веткам этого дерева с отсечением тех которые явно лишние ибо перебор.
78 Garykom
 
гуру
29.06.17
22:29
(77)+ Иерархические группы/элементы = дерево
79 пипец
 
29.06.17
22:36
(78) с отсеканием , не просто дерево, а по вхождению
80 пипец
 
29.06.17
22:38
(77) дерево , читает всё дерево , а тут зарубки , зарубки виртуальная таблица , и до внутрь, дерево наооборот