Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Подбор слагаемых под нужную сумму (задача о рюкзаке) - Мир MS Excel

Старая форма входа
  • Страница 1 из 3
  • 1
  • 2
  • 3
  • »
Модератор форума: _Boroda_, китин  
Подбор слагаемых под нужную сумму (задача о рюкзаке)
MCH Дата: Вторник, 25.06.2013, 01:15 | Сообщение № 1
Группа: Админы
Ранг: Старожил
Сообщений: 2004
Репутация: 752 ±
Замечаний: ±

Тема навеяна статьей Николая Павлова

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

У меня были некоторые наработки на эту тему, решил их доработать и опубликовать, а также хочется получить дополнительные материалы по эффективным алгоритмам.
Считаю, что данную задачу нужно решать с помошью макросов (все решения через поиск решения или формульные варианты не рассматриваю).

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

Если есть ссылки на хорошие алгоритмы или реализации, прошу поделиться

Прилагаю файл с разными решениями:
1. Случайная выборка, не самый лучший вариант, но может и он сгодиться
2. С применением динамического программирования. Сумма находится по целочисленным слагаемым, работает относительно быстро и если может быть решение - оно будет найдено. Скорость, а также объем выделяемой памяти сильно зависят от искомой суммы, в макросе введено ограничение - сумма не должна превышать 80 000 000. Подходит для решения дробных сумм, например, рубли с копейками, достаточно все суммы умножить на 100.
3. Преребор (brute force), возможно указать ограничения по количеству слагаемых, а также отсекает неоптимальные ветви решения, что позволило сделать приемлемый по скорости перебор, находит все решения подходящие под условия. Но для большого количества слагаемых метод не применим
4. Макрос Слэна, хороший быстрый алгоритм, но не всегда находит решение.

Реализация не окончательная, поэтому в готовые решеня не размещаю.
Хочется найти еще эффективные и быстрые варианты решения. Например, можно совместить частичный перебор с динамикой

UPD 27.02.2014: Обновлен алгоритм с перебором, стал существенно быстрее работать
К сообщению приложен файл: __.rar (42.5 Kb)
 
Ответить
СообщениеТема навеяна статьей Николая Павлова

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

У меня были некоторые наработки на эту тему, решил их доработать и опубликовать, а также хочется получить дополнительные материалы по эффективным алгоритмам.
Считаю, что данную задачу нужно решать с помошью макросов (все решения через поиск решения или формульные варианты не рассматриваю).

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

Если есть ссылки на хорошие алгоритмы или реализации, прошу поделиться

Прилагаю файл с разными решениями:
1. Случайная выборка, не самый лучший вариант, но может и он сгодиться
2. С применением динамического программирования. Сумма находится по целочисленным слагаемым, работает относительно быстро и если может быть решение - оно будет найдено. Скорость, а также объем выделяемой памяти сильно зависят от искомой суммы, в макросе введено ограничение - сумма не должна превышать 80 000 000. Подходит для решения дробных сумм, например, рубли с копейками, достаточно все суммы умножить на 100.
3. Преребор (brute force), возможно указать ограничения по количеству слагаемых, а также отсекает неоптимальные ветви решения, что позволило сделать приемлемый по скорости перебор, находит все решения подходящие под условия. Но для большого количества слагаемых метод не применим
4. Макрос Слэна, хороший быстрый алгоритм, но не всегда находит решение.

Реализация не окончательная, поэтому в готовые решеня не размещаю.
Хочется найти еще эффективные и быстрые варианты решения. Например, можно совместить частичный перебор с динамикой

UPD 27.02.2014: Обновлен алгоритм с перебором, стал существенно быстрее работать

Автор - MCH
Дата добавления - 25.06.2013 в 01:15
PowerBoy Дата: Вторник, 25.06.2013, 09:09 | Сообщение № 2
Группа: Проверенные
Ранг: Участник
Сообщений: 100
Репутация: 31 ±
Замечаний: 0% ±

2003
С точки зрения математики, Вашу задачу надо привести к системе линейных уровнений, которая в свою очередь решается уже разными методами, самым простым например - Simplex методом.


Excel + SQL = ActiveTables (http://vk.com/ExcelSQL)

Сообщение отредактировал PowerBoy - Вторник, 25.06.2013, 12:56
 
Ответить
СообщениеС точки зрения математики, Вашу задачу надо привести к системе линейных уровнений, которая в свою очередь решается уже разными методами, самым простым например - Simplex методом.

Автор - PowerBoy
Дата добавления - 25.06.2013 в 09:09
AlexM Дата: Вторник, 25.06.2013, 11:37 | Сообщение № 3
Группа: Друзья
Ранг: Участник клуба
Сообщений: 4517
Репутация: 1129 ±
Замечаний: 0% ±

Excel 2003
не так давно решал подобную задачу
К сообщению приложен файл: Summands.xls (50.5 Kb)



Номер мобильного модема (без голосовой связи)
9269171249 МегаФон, Московский регион.
 
Ответить
Сообщениене так давно решал подобную задачу

Автор - AlexM
Дата добавления - 25.06.2013 в 11:37
watsonww Дата: Понедельник, 24.02.2014, 12:51 | Сообщение № 4
Группа: Пользователи
Ранг: Прохожий
Сообщений: 2
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
по теме есть куча теории: http://ru.wikipedia.org/wiki/Задача_о_сумме_подмножеств
я нарисовал в экселе свой вариант решения, он ограничен семью слагаемыми, но зато довольно быстро работает для исходного множества в 100 слагаемых (из которых выбираем 7). Но вот уже на двухстах может "застрять" на час...
Вообще, поскольку главная проблема с этой задачей - резкий рост времени расчёта, то в правильный вариант решения, на мой взгляд, необходимо включать оценку времени, которое понадобится. С гордостью могу заявить, что я несколько дней тестировал свой алгоритм, и сейчас он делает такую оценку сверху (времени, которое может понадобиться на подбор).
Также есть возможность подбирать с указанной точностью (задаётся в ячейке "tolerance") и, если с указанной точностью сумма не возможна из данного списка, будет выведена ближайшая из возможных сумм.
К сообщению приложен файл: find_summands_v.xlsm (35.7 Kb)
 
Ответить
Сообщениепо теме есть куча теории: http://ru.wikipedia.org/wiki/Задача_о_сумме_подмножеств
я нарисовал в экселе свой вариант решения, он ограничен семью слагаемыми, но зато довольно быстро работает для исходного множества в 100 слагаемых (из которых выбираем 7). Но вот уже на двухстах может "застрять" на час...
Вообще, поскольку главная проблема с этой задачей - резкий рост времени расчёта, то в правильный вариант решения, на мой взгляд, необходимо включать оценку времени, которое понадобится. С гордостью могу заявить, что я несколько дней тестировал свой алгоритм, и сейчас он делает такую оценку сверху (времени, которое может понадобиться на подбор).
Также есть возможность подбирать с указанной точностью (задаётся в ячейке "tolerance") и, если с указанной точностью сумма не возможна из данного списка, будет выведена ближайшая из возможных сумм.

Автор - watsonww
Дата добавления - 24.02.2014 в 12:51
watsonww Дата: Вторник, 25.02.2014, 19:27 | Сообщение № 5
Группа: Пользователи
Ранг: Прохожий
Сообщений: 2
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
Спасибо MCH, что сообщил об ошибке, выкладываю исправленную версию.

Вообще, если задача сводится к целочисленным входным данным, то однозначно надо пользоваться алгоритмом динамического программирования, ну, если к тому же сумма меньше 80 млн. А вот если не сводится, вопрос остаётся открытым. Надеюсь, и мой вариант кому-нибудь может пригодиться.
К сообщению приложен файл: find_summands_v.xlsm (34.8 Kb)
 
Ответить
СообщениеСпасибо MCH, что сообщил об ошибке, выкладываю исправленную версию.

Вообще, если задача сводится к целочисленным входным данным, то однозначно надо пользоваться алгоритмом динамического программирования, ну, если к тому же сумма меньше 80 млн. А вот если не сводится, вопрос остаётся открытым. Надеюсь, и мой вариант кому-нибудь может пригодиться.

Автор - watsonww
Дата добавления - 25.02.2014 в 19:27
MCH Дата: Четверг, 27.02.2014, 00:52 | Сообщение № 6
Группа: Админы
Ранг: Старожил
Сообщений: 2004
Репутация: 752 ±
Замечаний: ±

Доработал свой макрос с ограниченным перебором.
Сделал дополнительную проверку по отсечению не оптимальных ветвей решения, скорость увеличилась на порядок
К сообщению приложен файл: __2.rar (42.5 Kb)
 
Ответить
СообщениеДоработал свой макрос с ограниченным перебором.
Сделал дополнительную проверку по отсечению не оптимальных ветвей решения, скорость увеличилась на порядок

Автор - MCH
Дата добавления - 27.02.2014 в 00:52
ton4ar Дата: Среда, 18.02.2015, 11:51 | Сообщение № 7
Группа: Пользователи
Ранг: Прохожий
Сообщений: 6
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Коллеги, привет!
Нужна помощь - не могу подобрать сумму 0 (либо если нельзя - 103007,81) из выборки не целых положительных и отрицательных чисел (столбец A).
Что делаю не так ? Может использовать другой способ ?

Заранее спасибо за ответы :victory:


Вопрос снят :)
off_top closed
К сообщению приложен файл: adjust-Autosave.xls (55.5 Kb)


Сообщение отредактировал ton4ar - Среда, 18.02.2015, 12:41
 
Ответить
СообщениеКоллеги, привет!
Нужна помощь - не могу подобрать сумму 0 (либо если нельзя - 103007,81) из выборки не целых положительных и отрицательных чисел (столбец A).
Что делаю не так ? Может использовать другой способ ?

Заранее спасибо за ответы :victory:


Вопрос снят :)
off_top closed

Автор - ton4ar
Дата добавления - 18.02.2015 в 11:51
Олег Дата: Суббота, 28.03.2015, 13:58 | Сообщение № 8
Группа: Гости
Добрый день. Подскажите пожалуйста, можно-ли осуществить подбор слагаемых, если они находятся в двух или трёх столбцах? И что в этом случае нужно исправить в коде макроса?
 
Ответить
СообщениеДобрый день. Подскажите пожалуйста, можно-ли осуществить подбор слагаемых, если они находятся в двух или трёх столбцах? И что в этом случае нужно исправить в коде макроса?

Автор - Олег
Дата добавления - 28.03.2015 в 13:58
Akeron Дата: Пятница, 10.07.2015, 17:42 | Сообщение № 9
Группа: Пользователи
Ранг: Прохожий
Сообщений: 2
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
MCH,
Цитата
Доработал свой макрос с ограниченным перебором.
Сделал дополнительную проверку по отсечению не оптимальных ветвей решения, скорость увеличилась на порядок
К сообщению приложен файл: __2.rar(43Kb)


Здравствуйте!
У меня возникла проблема: попробовал найти все комбинации из 6 чисел, из диапазона от 1 до 49, для заданных сумм методом ограниченного перебора.
Уже на сумме в 104 excel ругается "Run-time error '1004': Application -defined or object-defined error"
Ссылается на строчку: Range("F1").Offset(j - 1, 0) = "'" & txt
Видимо, не хватает ячеек в столбце.
Подскажете, пожалуйста, как исправить, чтобы результаты продолжали выводиться в следующий столбец на этой же или на другой странице?
 
Ответить
СообщениеMCH,
Цитата
Доработал свой макрос с ограниченным перебором.
Сделал дополнительную проверку по отсечению не оптимальных ветвей решения, скорость увеличилась на порядок
К сообщению приложен файл: __2.rar(43Kb)


Здравствуйте!
У меня возникла проблема: попробовал найти все комбинации из 6 чисел, из диапазона от 1 до 49, для заданных сумм методом ограниченного перебора.
Уже на сумме в 104 excel ругается "Run-time error '1004': Application -defined or object-defined error"
Ссылается на строчку: Range("F1").Offset(j - 1, 0) = "'" & txt
Видимо, не хватает ячеек в столбце.
Подскажете, пожалуйста, как исправить, чтобы результаты продолжали выводиться в следующий столбец на этой же или на другой странице?

Автор - Akeron
Дата добавления - 10.07.2015 в 17:42
MCH Дата: Пятница, 10.07.2015, 20:46 | Сообщение № 10
Группа: Админы
Ранг: Старожил
Сообщений: 2004
Репутация: 752 ±
Замечаний: ±

Файл в первом (и шестом) посте сохранен в формате Ex2003, а значит на лист в один столбец поместится не более 65536 значений, сохраните файл в формате xlsm или xlsb, после его открытия в листе будет более 1млн строк.
Так для суммы 104 существует 66389 вариантов сложения шести слагаемых от 1 до 49.
Всего различных сочетаний 6 из 49: ЧИСЛКОМБ(49;6) = 13983816, поэтому 1млн строк вполне достаточно, чтобы получить все комбинации сумм от 21 (1+2+3+4+5+6) до 279 (49+48+47+46+45+44).
Так сумму 150 можно получить 165772 вариантами

Сделал частотный анализ сумм чисел "6 из 49"
К сообщению приложен файл: 49-6.xlsx (17.4 Kb)
 
Ответить
СообщениеФайл в первом (и шестом) посте сохранен в формате Ex2003, а значит на лист в один столбец поместится не более 65536 значений, сохраните файл в формате xlsm или xlsb, после его открытия в листе будет более 1млн строк.
Так для суммы 104 существует 66389 вариантов сложения шести слагаемых от 1 до 49.
Всего различных сочетаний 6 из 49: ЧИСЛКОМБ(49;6) = 13983816, поэтому 1млн строк вполне достаточно, чтобы получить все комбинации сумм от 21 (1+2+3+4+5+6) до 279 (49+48+47+46+45+44).
Так сумму 150 можно получить 165772 вариантами

Сделал частотный анализ сумм чисел "6 из 49"

Автор - MCH
Дата добавления - 10.07.2015 в 20:46
Akeron Дата: Пятница, 10.07.2015, 22:00 | Сообщение № 11
Группа: Пользователи
Ранг: Прохожий
Сообщений: 2
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
MCH,
Большое спасибо, помогло! ^_^
 
Ответить
СообщениеMCH,
Большое спасибо, помогло! ^_^

Автор - Akeron
Дата добавления - 10.07.2015 в 22:00
MCH Дата: Четверг, 03.09.2015, 23:26 | Сообщение № 12
Группа: Админы
Ранг: Старожил
Сообщений: 2004
Репутация: 752 ±
Замечаний: ±

Классическую "Задачу о рюкзаке" см. здесь
 
Ответить
СообщениеКлассическую "Задачу о рюкзаке" см. здесь

Автор - MCH
Дата добавления - 03.09.2015 в 23:26
3N4 Дата: Суббота, 06.08.2016, 18:41 | Сообщение № 13
Группа: Пользователи
Ранг: Прохожий
Сообщений: 1
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Всем привет!
Подниму старую тему : столкнулся с задачей о сумме подмножеств с но выбором суммандов не более одного из каждой группы. При этом, необходимо перебрать и сохранить все возможные варианты получения суммы.
У Михаила (MCH) есть функция LimitBruteForce - которая перебирает все возможные варианты, но в рамках одной группы. В принципе это то, что нужно, просто каждому члену суммы поставить индекс принадлежности к группе и потом отсеять выборки, в которых будут встречаться два одинаковых индекса группы...
Но, мне кажется, можно это сделать более оптимальным способом (т.к. на 10 группах из 20 членов, если их собрать в одно множество в 200 членов, тратится уже значительное время).
Просьба указать путь истинный, как доработать LimitBruteForce или может иной алгоритм под эту задачу... (результатом должны быть все возможные комбинации, для которых сумма будет лежать в пределах погрешности от искомой)
Прикрепляю файл с примером групп слагаемых:
Заранее большое спасибо, у меня уже полтора дня затуп по этой теме...
К сообщению приложен файл: 6351983.xlsx (9.2 Kb)


Сообщение отредактировал 3N4 - Суббота, 06.08.2016, 18:42
 
Ответить
СообщениеВсем привет!
Подниму старую тему : столкнулся с задачей о сумме подмножеств с но выбором суммандов не более одного из каждой группы. При этом, необходимо перебрать и сохранить все возможные варианты получения суммы.
У Михаила (MCH) есть функция LimitBruteForce - которая перебирает все возможные варианты, но в рамках одной группы. В принципе это то, что нужно, просто каждому члену суммы поставить индекс принадлежности к группе и потом отсеять выборки, в которых будут встречаться два одинаковых индекса группы...
Но, мне кажется, можно это сделать более оптимальным способом (т.к. на 10 группах из 20 членов, если их собрать в одно множество в 200 членов, тратится уже значительное время).
Просьба указать путь истинный, как доработать LimitBruteForce или может иной алгоритм под эту задачу... (результатом должны быть все возможные комбинации, для которых сумма будет лежать в пределах погрешности от искомой)
Прикрепляю файл с примером групп слагаемых:
Заранее большое спасибо, у меня уже полтора дня затуп по этой теме...

Автор - 3N4
Дата добавления - 06.08.2016 в 18:41
serjj22 Дата: Среда, 17.08.2016, 15:06 | Сообщение № 14
Группа: Пользователи
Ранг: Прохожий
Сообщений: 1
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
Всем привет, нужна помощь с макросом (взят с форума). Есть массив BP:CA, из цифр в столбце BV подбираются значения, сумма которых указана в ячейке D5. Потом макрос переносит подобранные значения в столбец Р. Мне нужно что бы макрос переносил всю строку массива, как показано в примере J14:U20. И очищал те которые взял в массиве BP:CA (т.е. № п/п4,5,6 должен быть очищен).
Спасибо за любую помощь и подсказки.
К сообщению приложен файл: 1770463.xls (84.5 Kb)
 
Ответить
СообщениеВсем привет, нужна помощь с макросом (взят с форума). Есть массив BP:CA, из цифр в столбце BV подбираются значения, сумма которых указана в ячейке D5. Потом макрос переносит подобранные значения в столбец Р. Мне нужно что бы макрос переносил всю строку массива, как показано в примере J14:U20. И очищал те которые взял в массиве BP:CA (т.е. № п/п4,5,6 должен быть очищен).
Спасибо за любую помощь и подсказки.

Автор - serjj22
Дата добавления - 17.08.2016 в 15:06
dude Дата: Четверг, 23.03.2017, 19:10 | Сообщение № 15
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 193
Репутация: 28 ±
Замечаний: 0% ±

2016
MCH, Добрый день!
по этой теме: http://www.excelworld.ru/forum/10-5196-1
Подбор слагаемых под нужную сумму
Подскажите пожалуйста, что нужно изменить в вашем макросе, чтобы уже выбранные числа больше в расчет не попадали
спасибо!
 
Ответить
СообщениеMCH, Добрый день!
по этой теме: http://www.excelworld.ru/forum/10-5196-1
Подбор слагаемых под нужную сумму
Подскажите пожалуйста, что нужно изменить в вашем макросе, чтобы уже выбранные числа больше в расчет не попадали
спасибо!

Автор - dude
Дата добавления - 23.03.2017 в 19:10
MCH Дата: Понедельник, 28.08.2017, 16:07 | Сообщение № 16
Группа: Админы
Ранг: Старожил
Сообщений: 2004
Репутация: 752 ±
Замечаний: ±

Во вложении решение задачи по подбору множителей под нужное произведение.
В основе решения перебор, сделанный на базе задачи "сумма подмножеств" из первого сообщения.
К сообщению приложен файл: 7471720.xlsm (51.9 Kb)
 
Ответить
СообщениеВо вложении решение задачи по подбору множителей под нужное произведение.
В основе решения перебор, сделанный на базе задачи "сумма подмножеств" из первого сообщения.

Автор - MCH
Дата добавления - 28.08.2017 в 16:07
Aselisa1629 Дата: Среда, 06.09.2017, 08:56 | Сообщение № 17
Группа: Пользователи
Ранг: Новичок
Сообщений: 21
Репутация: 0 ±
Замечаний: 0% ±

Excel 2003
MCH, добрый день. Можно вопрос: В задаче все решения начинаются с наибольшего показателя. Возможно ли решение где будут учтены абсолютно все решения, начинающиеся с разных показателей?


Aselisa1629
 
Ответить
СообщениеMCH, добрый день. Можно вопрос: В задаче все решения начинаются с наибольшего показателя. Возможно ли решение где будут учтены абсолютно все решения, начинающиеся с разных показателей?

Автор - Aselisa1629
Дата добавления - 06.09.2017 в 08:56
autostavrroute Дата: Пятница, 20.09.2019, 06:03 | Сообщение № 18
Группа: Пользователи
Ранг: Прохожий
Сообщений: 2
Репутация: 0 ±
Замечаний: 0% ±

Excel 2016
Задача: набрать максимальную сумму из любого количества чисел максимально набираемую сумму например 10000, но не на сколько не большую ее.
Например есть покупки:
3439
7325
15810
6000
2520
2500
2645

Банк готов вернуть заданную сумму 10000 р но не более
Найти наборы чисел которые максимально наберут наибольшую сумму.
 
Ответить
СообщениеЗадача: набрать максимальную сумму из любого количества чисел максимально набираемую сумму например 10000, но не на сколько не большую ее.
Например есть покупки:
3439
7325
15810
6000
2520
2500
2645

Банк готов вернуть заданную сумму 10000 р но не более
Найти наборы чисел которые максимально наберут наибольшую сумму.

Автор - autostavrroute
Дата добавления - 20.09.2019 в 06:03
Pelena Дата: Пятница, 20.09.2019, 08:02 | Сообщение № 19
Группа: Админы
Ранг: Местный житель
Сообщений: 19403
Репутация: 4554 ±
Замечаний: ±

Excel 365 & Mac Excel
autostavrroute, Ваша задача разбирается здесь


"Черт возьми, Холмс! Но как??!!"
Ю-money 41001765434816
 
Ответить
Сообщениеautostavrroute, Ваша задача разбирается здесь

Автор - Pelena
Дата добавления - 20.09.2019 в 08:02
MCH Дата: Пятница, 20.09.2019, 11:09 | Сообщение № 20
Группа: Админы
Ранг: Старожил
Сообщений: 2004
Репутация: 752 ±
Замечаний: ±

Цитата autostavrroute, 20.09.2019 в 06:03, в сообщении № 18 ()
Задача: набрать максимальную сумму из любого количества чисел максимально набираемую сумму например 10000

7325 + 2645 = 9970
 
Ответить
Сообщение
Цитата autostavrroute, 20.09.2019 в 06:03, в сообщении № 18 ()
Задача: набрать максимальную сумму из любого количества чисел максимально набираемую сумму например 10000

7325 + 2645 = 9970

Автор - MCH
Дата добавления - 20.09.2019 в 11:09
  • Страница 1 из 3
  • 1
  • 2
  • 3
  • »
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!