Excel все комбинации значений

Обновлено: 30.06.2024

Сочетаниями из n различных элементов по k элементов называются комбинации, которые отличаются хотя бы одним элементом. Например, ниже перечислены ВСЕ 3-х элементные сочетания, взятые из множества, состоящего из 5 элементов :

(1; 2; 3); (1; 2; 4); (1; 2; 5); (1; 3; 4); (1; 3; 5); (1; 4; 5); (2; 3; 4); (2; 3; 5); (2; 4; 5); (3; 4; 5)

Примечание : Это статья о подсчете количества сочетаний с использованием MS EXCEL. Теоретические основы советуем прочитать в специализированном учебнике. Изучать сочетания по этой статье - плохая идея.

Отличие Сочетаний от Размещений

В отличие от Размещений следующие 3-х элементные комбинации (1; 2; 3); (1; 3; 2); (2; 1; 3); (2; 1; 3); (3; 2; 1); (3; 1; 2) считаются одинаковыми, и в набор Сочетаний включается только одна из этих комбинаций. Очевидно, что для тех же n и k число Сочетаний всегда меньше чем число Размещений (так как при размещениях порядок важен, а для сочетаний - нет), причем в k! раз.

Подсчет количества Сочетаний

Число всех Сочетаний из n элементов по k можно вычислить по формуле:


Например, количество 4-х элементных комбинаций из 6 чисел равно 15=6!/(4!(6-4)!)


Примечание : Для Сочетаний из n элементов по k также используется и другая запись:

В MS EXCEL для подсчета количества комбинаций без повторов существует специальная функция ЧИСЛКОМБ() , английское название функции - COMBIN(). Для предыдущего примера формула =ЧИСЛКОМБ(6;4) , разумеется, также вернет 15. Альтернативная формула для подсчета сочетаний =ФАКТР(6)/ФАКТР(6-4)/ФАКТР(4) .

Очевидно, что k меньше или равно n, т.к. нельзя выбрать из множества элементов n больше элементов, чем в нем содержится (предполагается, что элементы после выбора обратно не возвращаются). При k=n количество сочетаний всегда равно 1.

Примечание : О Сочетаниях с повторениями (с возвращением элементов) можно прочитать в статье Сочетания с повторениями: Комбинаторика в MS EXCEL

Вывод всех комбинаций Сочетаний

В файле примера созданы формулы для вывода всех Сочетаний для заданных n и k.

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


В файле примера не забывайте увеличивать количество строк с формулами, чтобы поместились все ваши комбинации. Для этого выделите последние ячейки с формулами (сочетание №330) и скопируйте их вниз на нужно количество строк. При увеличении строк с формулами размер файла быстро растет, а скорости пересчета листа падает. Если строк 4 тысячи, то размер файла составляет около 2 Мб.

Задача

Автовоз может перевозить по 4 легковые машины. Необходимо перевезти 7 разных машин (LADA Granta, Hyundai Solaris, KIA Rio, Renault Duster, Lada Kalina, Volkswagen Polo, Lada Largus). Сколькими различными способами можно заполнить первый автовоз? Конкретное место машины в автовозе не важно.

Нам нужно определить число Сочетаний 7 машин на 4-х местах автовоза. Т.е. n=7, а k=4. Оказывается, что таких вариантов =ЧИСЛКОМБ(7;4) равно 35.

Воспользуемся файлом примера (ссылка внизу статьи) , чтобы наглядно убедиться, что мы решили задачу правильно.

Произвольным образом сопоставим маркам машин числовые значения и сделаем сокращения названий марок: LADA Granta (LG=1), Hyundai Solaris (HS=2), …


Выставив в ячейках В5 и В6 значения 7 и 4 соответственно, определим все варианты размещений машин в автовозе (см. столбцы AJ:AM).


Примечание : О Перестановках можно прочитать в статье Перестановки без повторений: Комбинаторика в MS EXCEL , а о Размещениях в статье Размещения без повторений: Комбинаторика в MS EXCEL .


Перечислите или сгенерируйте все возможные комбинации из двух списков с формулой

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

1. Введите или скопируйте приведенную ниже формулу в пустую ячейку, в этом случае я введу ее в ячейку D2, а затем нажмите Enter ключ для получения результата, см. снимок экрана:

=IF(ROW()-ROW($D$2)+1>COUNTA($A$2:$A$5)*COUNTA($B$2:$B$4),"",INDEX($A$2:$A$5,INT((ROW()-ROW($D$2))/COUNTA($B$2:$B$4)+1))&"-"&INDEX($B$2:$B$4,MOD(ROW()-ROW($D$2),COUNTA($B$2:$B$4))+1))


Внимание: В приведенной выше формуле $ A $ 2: $ A $ 5 - это диапазон значений первого столбца, а 2 млрд долларов: 4 млрд долларов - это диапазон значений второго списка, в котором вы хотите перечислить все их возможные комбинации, $ D $ 2 это ячейка, в которую вы поместили формулу, вы можете изменить ссылки на ячейки по своему усмотрению.

2. Затем выберите ячейку D2 и перетащите маркер заполнения вниз к ячейкам, пока не получите пустые ячейки, и все возможные комбинации будут перечислены на основе значений двух списков. Смотрите скриншот:


Перечислите или сгенерируйте все возможные комбинации из трех или более списков с кодом VBA

1. Удерживайте ALT + F11 , чтобы открыть Microsoft Visual Basic для приложений окно.

2. Нажмите Вставить > Модульи вставьте следующий код в Модуль Окно.

Код VBA: генерировать все комбинации из 3 или нескольких столбцов

Внимание: В приведенном выше коде A2: A5, B2: B4, C2: C4 диапазон данных, который вы хотите использовать, E2 - это выходная ячейка, в которой вы хотите найти результаты. Если вы хотите получить все комбинации из большего количества столбцов, измените и добавьте другие параметры в код по мере необходимости.

3. Затем нажмите F5 ключ для запуска этого кода, и все комбинации из 3 столбцов будут сгенерированы сразу, см. снимок экрана:


Составьте список или сгенерируйте все возможные комбинации из нескольких списков с помощью мощной функции

Если имеется несколько значений списков, необходимо указать возможные комбинации, возможно, вам будет сложно изменить код. Здесь я могу порекомендовать мощный инструмент - Kutools for Excel, он содержит удобную функцию Список всех комбинаций который может быстро перечислить все возможные комбинации на основе заданных списков данных.

Советы: Чтобы применить это Список всех комбинаций функция, во-первых, вы должны скачать Kutools for Excel, а затем быстро и легко примените эту функцию.

После установки Kutools for Excel, пожалуйста, сделайте так:

1. Нажмите на Kutools > Вставить > Список всех комбинаций, см. снимок экрана:


2. В Список всех комбинаций В диалоговом окне выполните операции, как показано в демонстрации ниже:

3. Затем все указанные значения и разделители были перечислены в диалоговом окне, см. Снимок экрана:


4.А затем нажмите Ok Кнопка, и появится окно подсказки, напоминающее вам о выборе ячейки для вывода результата, см. снимок экрана:


5. Нажмите OK, все возможные комбинации на основе данных списков были сгенерированы на листе, как показано на следующем снимке экрана:

Пусть имеется несколько множеств — , , , количество элементов в которых может быть различно. Требуется составить все возможные комбинации элементов этих множеств таким образом, чтобы в комбинации присутствовал только один элемент из каждого множества: (A1, B1, C1), (A1, B2, C1), (A1, B2, C2), … Также подсчитаем в MS EXCEL количество таких комбинаций.

Начнем со множеств, состоящих из последовательностей целых чисел без повторов с шагом =1. Например, или . В файле примера создана форма для 4-х множеств, состоящих из 6 элементов (максимум).


В пределах одного множества все элементы должны быть разными, а элементы, принадлежащие разным множествам, могут повторяться. Количество элементов во множествах может быть различным.

Число различных комбинаций, содержащих по одному элементу из каждого множества, равно произведению количеств элементов каждого множества. Например, как следует из картинки выше, число комбинаций =6*4*3*2=144.

С помощью простых формул можно найти все эти 144 комбинации (см. файл примера лист Пример Числа )


Изменяя количество элементов во множествах, будут автоматически изменяться число комбинаций и сами комбинации (необходимо следить, чтобы количество строк с формулами было достаточным для отображения всех комбинаций).

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

Примечание : Если все множества идентичны (состоят из одинаковых элементов), то задача сводится к Размещению с повторениями . Действительно, пусть в каждом из k множеств по n элементов. Произведение количеств элементов (n) k раз, равно n^k, что равно количеству Размещений с повторениями.

Множества, состоящие из букв (символов)

Если необходимо составить комбинации нечисловых элементов, например, взяв множества ; , то вышеуказанный подход также можно использовать. Для этого произвольным образом нужно сопоставить буквам последовательные числовые значения.


После того, как все комбинации для числовых эквивалентов будут построены, необходимо сделать обратное преобразование: каждому числу сопоставить соответствующую букву (см. лист Пример Буквы1 ).

adjust0.jpg

Не очень частый, но и не экзотический случай. На моих тренингах такой вопрос задавали не один и не два раза :) Суть в том, что мы имеем конечный набор каких-то чисел, из которых надо выбрать те, что дадут в сумме заданное значение.

В реальной жизни эта задача может выглядеть по-разному.

  • Например, мы выгрузили из интернет-банка все платежи, которые поступили на наш счет за последний месяц. Один из клиентов разбивает сумму своего платежа на несколько отдельных счетов и платит частями. Мы знаем общую сумму оплаты и количество счетов, но не знаем их сумм. Надо подобрать те суммы в истории платежей, которые дадут в общем заданное значение.
  • У нас есть несколько рулонов стали (линолеума, бумаги. ), из которых надо подобрать под заказ те, что дадут заданную длину.
  • Блэкджек или в народе "очко". Надо набрать карты суммарной стоимостью максимально близкой к 21 баллу, но не превысить этот порог.

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

Давайте рассмотрим несколько способов решения такой задачи в Excel.

Способ 1. Надстройка Поиск решения (Solver)

Эта надстройка входит в стандартный набор пакета Microsoft Office вместе с Excel и предназначена, в общем случае, для решения линейных и нелинейных задач оптимизации при наличии списка ограничений. Чтобы ее подключить, необходимо:

  • в Excel 2007 и новее зайти Файл - Параметры Excel - Надстройки - Перейти (File - Excel Options - Add-ins - Go)
  • в Excel 2003 и старше - открыть меню Сервис - Надстройки (Tools - Add-ins)

и установить соответствующий флажок. Тогда на вкладке или в меню Данные (Data) появится нужная нам команда.

Чтобы использовать надстройку Поиск решения для нашей задачи необходимо будет слегка модернизировать наш пример, добавив к списку подбираемых сумм несколько вспомогательных ячеек и формул:

adjust1.jpg

  • Диапазон A1:A20 содержит наши числа, из которых мы будем выбирать нужные, чтобы "вписаться" в заданную сумму.
  • Диапазон В1:B20 будет своего рода набором переключателей, т.е. будет содержать нули или единички, показывая, отбираем мы данное число в выборку или нет.
  • В ячейке E2 стоит обычная автосумма всех единичек по столбцу B, подсчитывающая кол-во выбранных чисел.
  • В ячейке E3 с помощью функции СУММПРОИЗВ (SUMPRODUCT) считается сумма попарных произведений ячеек из столбцов А и B (то есть A1*B1+A2*B2+A3*B3+. ). Фактически, здесь подсчитывается сумма чисел из столбца А, отобранных единичками из столбца В.
  • В розовую ячейку E4 пользователь вводит желаемую сумму для подбора.
  • В ячейке E5 вычисляется абсолютное по модулю значение погрешности подбора с целью ее будущей минимизации.
  • Все желтых ячейках Е8:E17 хотелось бы получить список отобранных чисел, т.е. тех чисел из столбца А, напротив которых в столбце В есть единички. Для этого необходимо выделить сразу все (!) желтые ячейки и в них ввести вот такую формулу массива:

=ЕСЛИОШИБКА(ИНДЕКС($A$1:$A$20;НАИМЕНЬШИЙ(ЕСЛИ(B1:B20=1;СТРОКА(B1:B20);"");СТРОКА()-СТРОКА($E$8)+1));"")

=IFERROR(INDEX($A$1:$A$20;SMALL(IF(B1:B20=1;ROW(B1:B20);"");ROW()-ROW($E$8)+1));"")

После ввода формулы ее необходимо ввести не как обычную формулу, а как формулу массива, т.е. нажать не Enter, а Ctrl+Shift+Enter. Похожая формула используется в примере о ВПР, выдающей сразу все найденные значения (а не только первое).

Теперь перейдем на вкладку (или в меню) Данные и запустим инструмент Поиск решения (Data - Solver):

adjust4.jpg

В открывшемся окне необходимо:

  • Задать как целевую функцию (Target Cell) - ячейку вычисления погрешности подбора E5. Чуть ниже выбрать опцию - Минимум, т.к. мы хотим подобрать числа под заданную сумму с минимальной (а лучше даже нулевой) погрешностью.
  • В качестве изменяемых ячеек переменных (Changing cells) задать диапазон столбца переключателей B1:B20.
  • С помощью кнопки Добавить (Add) создать дополнительное условие на то, что ячейки диапазона B1:B20 должны быть бинарными (т.е. содержать только 0 или 1):

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

adjust3.jpg

Теперь можно либо оставить найденное решение подбора (Сохранить найденное решение), либо откатиться к прежним значениям (Восстановить исходные значения).

Необходимо отметить, что для такого класса задач существует не одно, а целое множество решений, особенно, если не приравнивать жестко погрешность к нулю. Поэтому запуск Поиска решения с разными начальными данными (т.е. разными комбинациями 0 и 1 в столбце В) может приводить к разным наборам чисел в выборках в пределах заданных ограничений. Так что имеет смысл прогнать эту процедуру несколько раз, произвольно изменяя переключатели в столбце В.

Найденные комбинации можно сохранять виде сценариев (кнопка Сохранить сценарий), чтобы вернуться к нем позднее с помощью команды Данные - Анализ "что-если" - Диспетчер сценариев (Data - What-If Analysis - Scenario Manager):

adjust7.jpg

И весьма удобно будет вывести все найденные решения, сохраненные в виде сценариев, в одной сравнительной таблице с помощью кнопки Отчет (Summary):

adjust8.jpg

Способ 2. Макрос подбора

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

adjust9.jpg

Для использования макроса нажмите сочетание Alt+F11, в открывшемся окне редактора Visual Basic вставьте новый модуль через меню Insert - Module и скопируйте туда этот код:

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

Читайте также: