Комбинатор. Подбор суммы из набора чисел. Обработка для 1С версии 8.х (УФ)

Программирование - Практика программирования

Как следует из названия, предлагаемая обработка позволит перебрать набор чисел и выбрать те из них, которые в сумме равны заданному числу. Имеется целый ряд настроек, позволяющих проделать эту "титаническую" работу быстро и с комфортом. И если такой набор чисел существует, - он будет найден. А если существует множество таких наборов, - они тоже могут быть найдены (не все, разумеется). Ибо, полный перебор может, в зависимости от мощности набора чисел, потребовать времени, соизмеримого со временем существования Вселенной. А разве мы можем столь долго ждать?

На картинке представлено окно комбинатора:

Что хотелось бы прокомментировать?

Ползунок в обл.1. Его положение указывает, какая часть суммы будет набрана случайным подбором. Чем больше сумма, которую мы пытаемся подобрать, и чем больше чисел в исходном наборе данных, - тем правее располагаем этот ползунок. Не рекомендую использовать 100% случайного подбора, иначе поиск комбинации чисел по времени может сильно затянуться или вовсе не дать положительного результата. Равно как и отказываться от случайного подбора полностью не следует - может статься, что будете ждать результат вечно.

Кнопка открытия в обл.2 устанавливает случайную сумму и запускает подбор. Полезна, если хотите "поиграть" с обработкой.

Время на одну попытку подбора в секундах. Если лимит времени при подборе будет исчерпан, процесс поиска прервется. Нулевое значение не ограничивает во времени процедуру поиска набора чисел путем перебора.

Количество попыток - указывает максимальное количество попыток подобрать требуемую сумму.  Используется, если время на одну попытку ограничено, т.е. больше нуля. Количество попыток со значением -1 не ограничивает это самое количество попыток подбора суммы. Процесс будет длиться до получения нужного результата. Если замечаете, что результата все нет и нет, бесконечную цепь попыток прерываем удержанием клавиши Ctrl. Каждую попытку предваряет новый случайный подбор чисел.

Из моего опыта: время лучше ограничить 15-20 секундами и запустить несколько попыток подбора. Сумму подбирать случайно по максимуму, но не все 100%.

Помеченные суммы в списке слева не учавствуют в случайном подборе.

Помеченные суммы в списке справа все время присутствуют в выборке чисел.

Перемещать суммы между списками можете путем выбора значения в списке (либо нескольких значений сразу).

Что касается исходного набора чисел. Предполагается, что вы его передаете в обработку в списке значений. Но, можно также его получить, нажав кнопку "Заполнить".

В открывшейся форме можете либо сформировать случайный набор чисел, либо получить его из буфера обмена. Из текстового документа, колонки отчета 1С, колонки таблицы Excel... и прочие источники.

Программный вызов осуществляем так:

//Фрагмент кода
//Пример. Все параметры не обязательные
Парам = Новый Структура;

Настройки = Новый Структура;
Настройки.Вставить("ВремяНаПопытку", 6);		//в секундах
Настройки.Вставить("КвоПопыток", 5);
Настройки.Вставить("ПредварительныйПодбор", 75);	//Значение от 0 до 100. Если 0 - не выполняется
							//предварительный (случайный) набор суммы
Настройки.Вставить("Сумма", 795);
Настройки.Вставить("Точность", 0);

Парам.Вставить("Настройки", Настройки);
Парам.Вставить("ВыходПоГотовности", Истина);	//Как только получите результат, - вывалитесь из обработки, если Истина
						//Если Ложь, - придется нажать кнопку "Готово" для завершения
//Лучше, конечно, сначала убедиться в готовности именно ожидаемого результата и нажать кнопку "Готово"

//Здесь должны быть ваши суммы для подбора
СписокДляПодбора = Новый СписокЗначений;
Для Инд = 1 По 300 Цикл
	СписокДляПодбора.Добавить(Инд,Строка(Инд)); 
КонецЦикла;

Парам.Вставить("СписокДляПодбора", СписокДляПодбора);

спРез = ОткрытьФормуМодально("ВнешняяОбработка." + ИмяОбработки + ".Форма", Парам);
//В спРез получили результат

При заполнении набора чисел из буфера обмена, использованы  регулярные выражения. Отладка их выполнена с помощью Построителя регулярных выражений.

В случае внесения изменений в эту обработку, вы получите оповещение. Настройка оповещений описана  в этой статье.

Похожие темы:

[Z-report] "Битва титанов v.1" Подбор продаж под сумму Z-отчета

Подбор слагаемых для нужной суммы

Желаю приятного просмотра!

Обновления

24.05.2017 12:00 - теперь, сколько бы мы не запустили серий попыток подбора значений, будем располагать лучшим результатом из всех найденных подборов.

25.05.2017 10:00 - выполнена небольшая оптимизация. Теперь, при программном вызове обработки, если сумма для подбора больше половины итоговой суммы исходного набора чисел, - выполняется подбор итоговой суммы за вычетом суммы для подбора (назовем дополнением к требуемой сумме). Ибо, подобрать меньшую сумму в среднем быстрее, чем большую, в моем разумении... Результат из обработки возвращается требуемый, разумеется. Возвращаемый из обработки набор чисел мы видим или в списке справа на форме, или в списке слева при подборе дополнения к сумме.

Скачать файлы

Наименование Файл Версия Размер
Комбинатор. Подбор суммы из набора чисел. Обработка для 1С версии 8.х (тонкий клиент):
.epf 21,98Kb
19.05.17
4
.epf 21,98Kb 4 Скачать

См. также

Комментарии
1. MSConfig Infostart (MSConfig) 19.05.17 17:25 Сейчас в теме
Вот эту энергию и в мирное русло бы!
2. Николай Щербаченко (romasna) 209 19.05.17 17:27 Сейчас в теме
3. Сергей Коцюра (CheBurator) 3410 19.05.17 17:39 Сейчас в теме
шпарит тупым перебором? или более интеллектуальные варианты решения задачи рбкзака применяются?
корум; starik-2005; +2 Ответить
5. Николай Щербаченко (romasna) 209 19.05.17 17:44 Сейчас в теме
(3)Скачай и посмотри, пожалуйста, если интересно. Работает быстро. Из нескольких сотен случайных чисел подбирает сумму в среднем за 5сек. Надо только умело и творчески подойти к процессу. Не веришь - проверь. Генератор случайных чисел включен... Тупой перебор не выложил бы здесь - даже не стал бы позориться. ;) А энергию свою я употребил, когда потребовалось, на решение 3 разных задач. И в основе их - этот подбор сумм.
6. Николай Щербаченко (romasna) 209 19.05.17 17:48 Сейчас в теме
(3)О, пардон... это не ты пытался мою энергию в мирное русло направить... :)
10. Николай Щербаченко (romasna) 209 19.05.17 18:12 Сейчас в теме
(3)Кстати, обращаю твое внимание на картинку к статье. Внизу строчка: требуемая сумма подобрана с первой попытки. На попытку не больше 20сек. было отведено. (Обычно, я и 20секунд не выставлял, а 5-10). Чисел для перебора около 140. Как ты знаешь, простой перебор за такое время результат не даст. На случайном наборе чисел все работает изумительно. Медленнее всего подбираются слишком маленькие и слишком большие (приграничные) суммы.
4. Sergey Andreev (starik-2005) 1196 19.05.17 17:41 Сейчас в теме
7. Николай Щербаченко (romasna) 209 19.05.17 17:50 Сейчас в теме
(4)Лично я не против многообразия. Свои алгоритмы я программировал без шпаргалок. Что получилось - выложил. Мож кому понравятся. Денег не прошу. :) Я не перебираю все.
8. Sergey Andreev (starik-2005) 1196 19.05.17 17:54 Сейчас в теме
(7)
Денег не прошу. :) Я не перебираю в
1 стартмани стоит каких-никаких денег. Было бы интересно знать суть алгоритма. Фактически все условно быстрые алгоритмы не дают 100% точности кроме рюкзака. А рюкзак требует памяти (на каждую копейку до искомой суммы * количество сумм).
9. Николай Щербаченко (romasna) 209 19.05.17 18:00 Сейчас в теме
(8)Стартмани стоят для нас с тобой только некоторых усилий... что-то разработал, выложил, получил... Или не так? Была бы моя воля, я бы и даром выложил эту обработку, - не жалко.
Что же до алгоритмов: большая часть суммы подбирается случайно (процент регулируешь ползунком), а потом - да, тупой перебор, но отбрасываются все тупиковые варианты. И если процесс длится долго, например, больше 20секунд, случайный набор чисел меняется на новый, если указано несколько попыток подбора.
11. Сергей Коцюра (CheBurator) 3410 19.05.17 18:28 Сейчас в теме
интересует за сколько отработает алгоритм для ~100 разных подборов, на которых в каждом подборе ~15 чисел и они близки друг к другу
12. Николай Щербаченко (romasna) 209 19.05.17 18:29 Сейчас в теме
(11)Полагаю, надо провести следственный эксперимент... давай набор чисел и требуемую сумму. Посмотрю.
13. Сергей Коцюра (CheBurator) 3410 19.05.17 18:35 Сейчас в теме
так мне без разницы - что числа выдавать что смотреть... сам посмотрю если припрет.
а если припрет - придетяс из разработки выдирать колд, или там унутре есть функция на вход клоторой масив с данными - на выходе результат?
14. Николай Щербаченко (romasna) 209 19.05.17 18:43 Сейчас в теме
(13)Вызываешь обработку модально, передав в нее список значений. Получив результат, давишь кнопку "Готово", - вываливаешься из обработки. На выходе в списке значений имеем требуемое. Задачи подобного рода я не решаю на полном автомате, - в меру своих умений вмешиваюсь в процесс получения результата. И обычно его получаю быстро, даже когда требуется полное совпадение с суммой.
Передается именно список значений, а не массив. Это позволяет решать задачи количественно-суммовые. Например, из остатков подобрать номенклатуру на заданную сумму в количестве и ценах.
В принципе, возможно все запускать на автомате, когда требуется сделать большое количество подборов. На вход подаешь не только массив чисел, но и указываешь длительность попытки подбора с неограниченным количеством попыток. Вот только я пока что не предусмотрел на этот случай выход из обработки по завершении подбора. Но это пустячное изменение алгоритмов.
15. Ярослав Володимирович (myr4ik07) 107 21.05.17 15:44 Сейчас в теме
Ану подскажите, есть ТЧ дока, мне нужно из этой ТЧ выбрать коство шт. товару на определенную сумму, и я знаю, что эта сумма есть в этой тч, эта обработка такое решает?
16. Николай Щербаченко (romasna) 209 21.05.17 16:03 Сейчас в теме
(15)И "да", и "нет". "Нет", - потому что эта обработка позволяет только сумму подобрать из имеющихся значений. Но также и "Да", потому что она лежит в основе решения твоей задачи. Вот только прежде чем перейти к подбору суммы по номенклатуре, необходимо до вызова обработки специальным образом обработать эту самую номенклатуру. Такой простой пример: есть у тебя 6 карандашей на сумму 24 рубля. В обработку передаешь несколько элементов по этим карандашам в списке значений:
12 - Карандаш 3шт.
8 - Карандаш 2шт.
4 - карандаш 1шт.
Эти 3 элемента позволяют набрать суммы; 4, 8, 12, 16, 20, 24
Допустим тебе нужна сумма 20. Эта обработка в списке значений вернет тебе 2 записи:
12 - Карандаш 3шт.
8 - Карандаш 2шт.
Обработав их, получишь: 5 карандашей на сумму 20.
myr4ik07; +1 Ответить
17. Фаниль Хасанов (Fanil) 14.11.17 20:11 Сейчас в теме
отлично работает, когда необходимо подделать что-то в оборотке)))
18. Николай Щербаченко (romasna) 209 16.11.17 11:25 Сейчас в теме
(17) Очень рад, что она тебе помогла нести светлое людям. :)
Оставьте свое сообщение