Помогите придумать алгоритм

1. AnnaKalacheva 6 25.04.18 20:08 Сейчас в теме
Имеется 2 ТЗ.

1 Содержит записи вида

Артикул Количество
1111 1200
1111 540
1111 2160

2222 2700

3333 140
3333 400

2 Содержи записи вида

1111 1350
1111 600
1111 600
1111 6
1111 804
1111 540

2222 2700

3333 140
3333 200
3333 200

Необходимо для каждой записи ТЗ 1, найти записи из ТЗ 2, которые в сумме дают количество из строки ТЗ 1.
Заведомо известно, что такая выборка существует.

Если сгруппировать две ТЗ по артикулу, количество продукции с одинаковым артикулом в двух ТЗ будет равным.
Строки из ТЗ2, найденные на предыдущих этапах далее не участвуют в выборке

Результат для 1 строки ТЗ 1:
1111 600
1111 600


Результат для 2 строки ТЗ 1:
1111 540

Результат для 3 строки ТЗ 1:
1111 1350
1111 6
1111 804
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. mcgoblin 3 25.04.18 20:18 Сейчас в теме
(1) Коротко алгоритм будет примерно такой


Для каждой Строка из ТЗ1 ЦИКЛ
Массив = новый массив
Сумм = Строка.Количество
//Тут запрос к тз2 с отбором по Строка.Артикул
Для каждой СтрокаТЗ2 из РезультатВыборкиТЗ2 Цикл
Если Не СтрокаТЗ2.Индекс В Массив Тогда
Если Сумм >= СтрокаТЗ2.Количество тогда
Сумм = Сумм - СтрокаТЗ2.Количество
Массив.Добавить(Строка.Индекс)
КонецЕсли
КонецЕсли
Если Сумм = 0 Тогда
Возврат
КонецЕсли
КонецЦикла
КонецЦикла
Показать

Вывод информации о соответвии сам придумешь в таблицу значений или еще каким образом
3. SlavaKron 25.04.18 21:00 Сейчас в теме
(2) Логика не правильная (уже не говоря про формальности). При:

Т1:
1111 700
1111 600

Т2:
1111 600
1111 300
1111 400

Ваш результат:
1) 1111 600

2) 1111 300

Должен быть:
1) 1111 300
1) 1111 400

2) 1111 600
4. mcgoblin 3 25.04.18 21:06 Сейчас в теме
(3) согласен, нужны доппроверки) ну я и не претендовал на истинность
5. ildarovich 7865 25.04.18 21:52 Сейчас в теме
Алгоритм давно известен. Поискать можно по словосочетаниям ФИФО, "нарастающий итог".

Реализацию алгоритма запросом можно посмотреть в решении задачи 52 статьи "Минимализмы 3", а реализацию программным кодом - в решении задачи 7 в статье "Минимализмы 1".
корум; ZOMI; +2 Ответить
6. CheBurator 3119 25.04.18 22:04 Сейчас в теме
(5) А разве это не задача рюкзака у автора?
7. ildarovich 7865 25.04.18 22:16 Сейчас в теме
(6) Можно считать задачей "рюкзаков", но без оптимизации.
В задаче рюкзака сравниваются разные варианты, то есть из допустимых нужно выбрать наилучшее решение,
а тут вроде бы подойдет любое допустимое решение.
В общем, классическое распределение по ячейкам, по партиям и тому подобное.
8. ildarovich 7865 25.04.18 22:51 Сейчас в теме
(5)(6)(7) Погорячился, пожалуй. Тут, оказывается (понял после критики решения из (2)), нельзя разбивать строки.
Тогда это более сложная задача целочисленного программирования типа транспортной, но с целыми значениями переменных (о назначениях?).

При небольшом количестве можно решать перебором. Тогда нужно знать, есть ли ограничения на количества строк с одним артикулом в ТЗ1 и ТЗ2. Если ПРОИЗВЕДЕНИЕ максимального числа строк по одному артикулу в ТЗ1 на максимальное число строк по одному артикулу в ТЗ2 меньше 20, то можно решить перебором, иначе - более сложные методы типа динамического программирования. Проблема в том, что придется выполнять возвраты при неудачных связываниях.

А вообще тут любят давать задачи, оставив лишь "математику". Тогда как реально интересна практическая суть задачи. Будет понятно, то ли это бессмысленная учебная задача, то ли практическая, на которую есть смысл тратить время.
9. AnnaKalacheva 6 26.04.18 00:24 Сейчас в теме
(8)Реализовала запрос из задачи 52. Не то, но спасибо - опыт на будущее.
Реальная задача следующая:

1) Имеется заказ покупателя 2 , который был создан на основании заказа покупателя 1 .
На данном шаге в части касающейся номенклатуры и количества построчно - одинаковые.

2) Заказ покупателя 1 меняется (позиции разбиваются по сериям, некоторая номенклатура меняется на аналог, заказ "досохраняется" после выпуска продукции). Т.е. нескольким строкам заказа 1, теперь соответствует 1 строка заказа 2.

3) Заказ покупателя 2 необходимо привести построчно к заказу 1, в части касающейся количества и позиций (связующих кодов).
Т.е. строку заказа 2 необходимо разбить на несколько строк, в соответствии с заказом 1.

По досохраненному заказу 1 создается поступление. Далее можно из поступления вытащить серии и номенклатуру в заказ 2, осуществив поиск по связующему коду и количеству.

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

Произведение максимального количества строк по каждому артикулу из обоих ТЗ с большой долей вероятности не будет превышать 20.
10. TODD22 18 26.04.18 05:06 Сейчас в теме
(9)
Заказ покупателя 2 необходимо привести построчно к заказу 1

Так заказ №2 это не копия заказа №1 в этом случае?
13. AnnaKalacheva 6 26.04.18 08:35 Сейчас в теме
(10)На шаге 2 уже нет. Заказ 1 был досоханен, разбит на серии и т.д.
28. AlexFort1961 1 29.04.18 09:14 Сейчас в теме
(9) Возможно ли в Вашей (реальной) задаче и в Заказе 1 и в Заказе 2 обеспечить уникальность какого-либо ключа строки и на этапе 3 связывать по этому ключу?
11. Sapiens_bru 4 26.04.18 05:10 Сейчас в теме
Для придумывающих алгоритмы !
Мой развалился о сочетание
Т1 =
1 1200
1 1200
1 1200

Т2 =
1 800
1 800
1 800
1 400
1 400
1 400

Он к первой строке подставил 1200=400+400+400 , а для остальных не смог найти совпадений :)
12. catena 110 26.04.18 06:03 Сейчас в теме
(11)Об этом говорилось в (8), как о неудачном связывании. На самом деле любой алгоритм тут будет перебором. Скорее вопрос в алгоритме перебора, который с больше вероятностью приведет к быстрому решению. Например, начинать заполнение с самого "массивного" предмета и подбор по убыванию "веса" до достижения нужной суммы.
14. AnnaKalacheva 6 26.04.18 09:06 Сейчас в теме
Думаю для этой конкретной задачи можно:
1) Исключить из для каждой строки ТЗ1 строки из ТЗ2 с одинаковым количеством. (Подчеркнуты)
2) Если в ТЗ1 осталась 1 позиция данной номенклатуры, и ее количество равно сумме оставшихся позиций по данной номенклатуре в ТЗ 2, значит сумма найдена, строки исключаем.
3) Тут скорее всего только перебор. Или на откуп пользователей - редактирование заказа вручную.
Прикрепленные файлы:
15. karpik666 3778 26.04.18 09:15 Сейчас в теме
(14) По моему сама идея данного алгоритма бессмысленна, а кто будет отвечать за корректность заполненного документа-дубль по данному алгоритму?
Вообще для такого нужно жестко задавать связь, либо делать документ корректировка заказа покупателя
16. AnnaKalacheva 6 26.04.18 10:21 Сейчас в теме
(15)Корректировка заказа существует.
Корректность заказа-буль проверяется контролем суммы заказа.
Заказ-дубль, это заказ от другого юр. лица, соответствует он заказу 1 только в части состава и количества позиций, все остальные условия разные.
17. karpik666 3778 26.04.18 10:27 Сейчас в теме
(16) то есть табличные части совпадают, тогда что мешает при записи находить тот заказ покупателя, который был создан на основании текущего и перезаполнять его?
18. AnnaKalacheva 6 26.04.18 10:42 Сейчас в теме
(17) Табличные части совпадают по общему количеству каждой позиции.
В заказе 2 имеется позиция 1111 10шт
1111 20 шт
Без серий или частично с сериями
В заказе 1 после выпуска производства и досохранения, эта продукция уже в виде
1111 5 шт
1111 5 шт
1111 17 шт
1111 3 шт

Вот и необходимо привести заказ 2 к заказу 1 построчно с количеством.
20. karpik666 3778 26.04.18 10:45 Сейчас в теме
(18) и, тогда просто ищем номенклатуру без учета серий во втором документе, удаляем их и заполняем той же номенклатурой из документа источника.
19. AnnaKalacheva 6 26.04.18 10:45 Сейчас в теме
Строки заказа 2 нельзя группировать, т.к. они могут отличаться скидками и другими реквизитами, которые должны сохраниться при делении.
21. karpik666 3778 26.04.18 10:50 Сейчас в теме
(19) очень интересно, тогда по-другому, обходим все строки в документе источнике и ищем эту номенклатуру в документе приемнике, подставляем серию и меняем количество, перессчитывая общую сумму с учетом скидки, если количества не хватает то берем следующую строку в документе Приемнике, итак до тех пор, пока все серии не будут заполнены, и все строки в документе источнике не будут пройдены.
23. Sapiens_bru 4 26.04.18 14:07 Сейчас в теме
(21) Это работало бы, если бы задача стояла сопоставить одни штуки другим поштучно. Но задача стоит сопоставить одни строки другим, построчно. В предложенном вами варианте
Т1 (номер строки, сумма)
1 10
2 20

Т2
1 15
2 5
3 10

Первая строка будет сопоставлена с первой, вторая с первой,второй,третьей. Это хорошее решение для целей партионного учёта, но не данной задачи. Здесь просят сопоставить строки целиком. Ни одна строка из Т2 не должна быть разбита.
24. karpik666 3778 26.04.18 14:24 Сейчас в теме
(23) что в вашем примере Т2 - если это заказ, который нужно отредактировать, то вы сами себе противоречите
2) Заказ покупателя 1 меняется (позиции разбиваются по сериям, некоторая номенклатура меняется на аналог, заказ "досохраняется" после выпуска продукции). Т.е. нескольким строкам заказа 1, теперь соответствует 1 строка заказа 2.

3) Заказ покупателя 2 необходимо привести построчно к заказу 1, в части касающейся количества и позиций (связующих кодов).
Т.е. строку заказа 2 необходимо разбить на несколько строк, в соответствии с заказом 1.

судя по описанию строка может быть разбита или нет?
25. spacecraft 26.04.18 14:30 Сейчас в теме
(24) я так понимаю, произошла путаница.
Заказ покупателя 1 это ТЗ2.
Заказ покупателя 2 это ТЗ1.
26. karpik666 3778 26.04.18 14:58 Сейчас в теме
(23) тогда задача действительно сложнее, я бы вначале получил бы все возможные сочетания для Т2, для первой позиции это будет 15, 20, 25, 30, затем поместил бы в запрос, и сопоставил с таблицей Т1, получил бы все строки, в которых может быть строка 1 из Т2, а затем тупо обходил коллекции строк в поиске оптимального значения. Если используются аналоги, то нужно будет еще получить таблицу аналогов для заданной строки.
22. VmvLer 26.04.18 10:54 Сейчас в теме
я бы искал решение через алгоритм бинарного поиска в Тз2 для каждой строки Тз1

переборы не прокатят
27. SlavaKron 28.04.18 14:14 Сейчас в теме
Так и чего, никто не напишет алгоритм то? Хоть бы и с перебором.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот