Комбинаторика в excel vba

 

Cupon

Пользователь

Сообщений: 23
Регистрация: 04.09.2019

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

Изменено: Cupon04.09.2019 14:49:10

 

Dima S

Пользователь

Сообщений: 2063
Регистрация: 01.01.1970

а смысл?
если можно посчитать в массиве и выдать результат.
Зачем миллионы строк с однотипными формулами?

 

Cupon

Пользователь

Сообщений: 23
Регистрация: 04.09.2019

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

Изменено: Cupon04.09.2019 15:05:45

 

Cupon

Пользователь

Сообщений: 23
Регистрация: 04.09.2019

Может кто нибудь помочь ? Или подскажите, куда можно обратиться.

Может это все-таки не в excel делать. Буду благодарен за любую подсказку

 

Jack Famous

Пользователь

Сообщений: 10852
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

#5

05.09.2019 09:48:25

Цитата
Cupon: Может кто нибудь помочь?

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

Изменено: Jack Famous05.09.2019 09:51:05

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

Cupon

Пользователь

Сообщений: 23
Регистрация: 04.09.2019

#6

05.09.2019 10:10:17

Jack Famous

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

Цитата
Так вот анализ нужно проводить в коде и полученный результат уже выводить на лист

можно подробнее, или хотя бы пример такого кода

Прикрепленные файлы

  • sochetaniya_bez_povtoreniy тест.xlsx (27.61 КБ)

Изменено: Cupon05.09.2019 10:14:09

 

Jack Famous

Пользователь

Сообщений: 10852
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

#7

05.09.2019 10:33:44

Цитата
Cupon: конечная цифра

вы добавили 2 столбца. Что за конечная цифра (строго говоря, число тогда уж)?

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

Cupon

Пользователь

Сообщений: 23
Регистрация: 04.09.2019

да, верно — число
как видно из расчета полученных данных

 

Jack Famous

Пользователь

Сообщений: 10852
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

Cupon, вы не поняли — вы добавили 2 столбца, то есть 2*кол-во строк чисел. Вам их сумма нужна, среднее, минимум/максимум? Что в итоге-то нужно?

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

Cupon

Пользователь

Сообщений: 23
Регистрация: 04.09.2019

Идут 6 столбцов с числами. в 7 столбце высчитывается число из предыдущих шести. Именно оно мне нужно

Изменено: Cupon05.09.2019 10:51:07

 

Jack Famous

Пользователь

Сообщений: 10852
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

Cupon, ещё раз: 7ой столбец это МИЛЛИОНЫ итоговых чисел (по количеству строк).  Я понял, что вам нужно это число (+ округление), но их по-прежнему очень много и я пытаюсь выяснить, что вы с ними будете делать. Суммировать, сортировать… Неужели вы просто потом весь этот массив куда-то копируете?

Изменено: Jack Famous05.09.2019 10:55:08

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

Cupon

Пользователь

Сообщений: 23
Регистрация: 04.09.2019

аа) дальше что
дальше мне необходимо подбить по количеству сколько будет получившихся одинаковых чисел (а они будут). Потом рисую график
например 0.11 — 500 шт, 0.05 — 300 шт. и т.д.

Изменено: Cupon05.09.2019 10:57:57

 

Jack Famous

Пользователь

Сообщений: 10852
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

Cupon, ну наконец-то)) тут пришёл главный по комбинаторике

— если он подскажет, то предложу какой-нибудь тупой перебор в коде…

не подскажу, потому что не вдупляю ваш алгоритм

Название темы:

«Комбинаторика. Перебор всех сочетаний с выводом списка повторений»

Изменено: Jack Famous05.09.2019 11:10:17

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

Cupon

Пользователь

Сообщений: 23
Регистрация: 04.09.2019

Jack Famous

спасибо большое. буду ждать)
Название темы поменять не могу

 

Jack Famous

Пользователь

Сообщений: 10852
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

#15

05.09.2019 11:11:30

Цитата
Cupon: спасибо большое. буду ждать

поторопился я с обещаниями — прощу прощения…

Цитата
Cupon: Название темы поменять не могу

это для модераторов — они меняют

Изменено: Jack Famous05.09.2019 11:11:39

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

Cupon

Пользователь

Сообщений: 23
Регистрация: 04.09.2019

алгоритм там прост: количество сочетаний шести чисел без повтора из определенного числа

 

MCH

Пользователь

Сообщений: 3875
Регистрация: 22.12.2012

#17

05.09.2019 11:23:40

Цитата
Cupon написал:
Именно оно мне нужно

Вам же не нужны все 13 миллионов чисел в итоге, скорее всего нужно найти оптимальное (максимальное или минимальное) перебирая все возможные сочетания чисел.
Данную задачу (перебор всех сочетаний) можно легко решить макросом, задать критерии оптимальности и выбрать нужное.
Перебрать 13 млн. сочетаний — не долго, не нужно все это сохранять на листе Excel.
Примеры реализации комбинаторики на VBA можно посмотреть здесь:

http://www.excelworld.ru/forum/3-36449-1

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

 

Jack Famous

Пользователь

Сообщений: 10852
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

#18

05.09.2019 11:25:01

Цитата
Cupon: количество сочетаний

ОК — скачайте файл

отсюда

и скажите, какой вариант ваш

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

MCH

Пользователь

Сообщений: 3875
Регистрация: 22.12.2012

#19

05.09.2019 11:26:54

Цитата
Cupon написал:
дальше мне необходимо подбить по количеству сколько будет получившихся одинаковых чисел (а они будут). Потом рисую график

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

 

Jack Famous

Пользователь

Сообщений: 10852
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

Cupon, взял Combin за основу.  Смотрите: для 6 понятно — сумму первых 3х делим на сумму остальных 3х и округляем до двух знаков. А если k<>6?

Изменено: Jack Famous05.09.2019 11:56:51

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

MCH

Пользователь

Сообщений: 3875
Регистрация: 22.12.2012

 

Cupon

Пользователь

Сообщений: 23
Регистрация: 04.09.2019

#22

05.09.2019 13:40:14

Цитата
Jack Famous написал:
ОК — скачайте файл  отсюда  и скажите, какой вариант ваш

запутался ) у меня сочетание без повторений

Цитата
Jack Famous написал:
Cupon , взял Combin за основу.  Смотрите: для 6 понятно — сумму первых 3х делим на сумму остальных 3х и округляем до двух знаков. А если k<>6?

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

Цитата
Цитата
MCH написал:
вариант 6 из 49

спасибо вам огромное. Я вторую неделю тут мучаюсь) но это естественно все от незнания. А можно сам алгоритм. В будущем хочу еще 5 из 50

Изменено: Cupon05.09.2019 13:40:58

 

MCH

Пользователь

Сообщений: 3875
Регистрация: 22.12.2012

#23

05.09.2019 13:48:48

Цитата
Cupon написал:
Я думаю методом подбора функций надо выйти на оптимальное решение.

Какую функцию подбираем? какой результат нужен в итоге? для чего все это?
Анализ лотереи?

 

PooHkrd

Пользователь

Сообщений: 6602
Регистрация: 22.02.2017

Excel x64 О365 / 2016 / Online / Power BI

#24

05.09.2019 13:49:22

Цитата
Cupon написал:
хочу еще 5 из 50

гм, а для нечетного количества как рассчитывать столбец с отношением суммы первых трех элементов к сумме последних трех?

Вот горшок пустой, он предмет простой…

 

Cupon

Пользователь

Сообщений: 23
Регистрация: 04.09.2019

#25

05.09.2019 14:01:15

тут уже надо искать другую формулу

Цитата
MCH написал: Анализ лотереи?

да. Анализ всех вариантов и сравнение с уже имеющимися. функция (1+2+3)/(4+5+6) придумана чисто для удобства и более-менее выхода на красивую кривую

можно ли увидеть из вашего итога, например  какие варианты шести чисел содержит получившееся число 0,38 ?

 

MCH

Пользователь

Сообщений: 3875
Регистрация: 22.12.2012

Посмотрите макрос, он небольшой (40 строчек кода), попробуйте разобраться самостоятельно.
У меня подсчет (перебор всех комбинаций и расчет функции) занимает 4-5 секунд.
Можно при очередном запуске проверять на результат 0,38 и выводит на лист все варианты, только их будет очень много — 400 тыс. вариантов

 

Cupon

Пользователь

Сообщений: 23
Регистрация: 04.09.2019

#27

05.09.2019 15:04:05

MCH

да, макрос уже посмотрел….буду разбираться

MCH написал:

Цитата
Можно при очередном запуске проверять на результат 0,38 и выводит на лист все варианты, только их будет очень много — 400 тыс. вариантов

т.е. в этом же макросе внести изменения и выдаст результат ?

 

Jack Famous

Пользователь

Сообщений: 10852
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

#28

05.09.2019 15:34:33

Цитата
Cupon: в этом же макросе внести изменения и выдаст результат ?

да — всего пару-тройку строчек добавить, но вы это должны сами сделать, чтобы понять

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

Cupon

Пользователь

Сообщений: 23
Регистрация: 04.09.2019

:cry: с фонариком первому тяжело )

Изменено: Cupon05.09.2019 16:37:08

 

PooHkrd

Пользователь

Сообщений: 6602
Регистрация: 22.02.2017

Excel x64 О365 / 2016 / Online / Power BI

#30

05.09.2019 16:28:42

Во вложении вариант на базе Power Query и Power Pivot.
Вот таким запросом формируем строчки из сочетаний:

Скрытый текст

Загружаем их в модель данных и в модели уже рисуем любую формулу, и её выводим в сводную в качестве агрегатора. Работает медленнее чем на VBA, но вдруг кому потребуется.
Во вложении файл с вариантом из 30 по 6. (это чтобы файлик по размеру на форум влез)
Чтобы изменить вариант нужно вместо 20 указать 49 или сколько вам там надо, потом обновить сводную и немножко подождать %).
Обратите внимание, что если будете менять число 6, то поломается формула в столбце Отношение в модели данных, но строчки в модель загрузятся, останется только формулу переписать.
Пробовал готовый вариант сразу в PQ посчитать, но группировка очень уж медленно работает. Ждал 5 минут и бросил.

Прикрепленные файлы

  • СочетанияБезПовторений.xlsx (262.17 КБ)

Изменено: PooHkrd10.09.2019 12:11:27

Вот горшок пустой, он предмет простой…

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

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

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

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


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

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

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

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

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

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

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

Sub ListAllCombinations()
'Updateby Extendoffice
Dim xDRg1, xDRg2, xDRg3 As Range
Dim xRg  As Range
Dim xStr As String
Dim xFN1, xFN2, xFN3 As Integer
Dim xSV1, xSV2, xSV3 As String
Set xDRg1 = Range("A2:A5")  'First column data
Set xDRg2 = Range("B2:B4")  'Second column data
Set xDRg3 = Range("C2:C4")  'Third column data
xStr = "-"   'Separator
Set xRg = Range("E2")  'Output cell
For xFN1 = 1 To xDRg1.Count
    xSV1 = xDRg1.Item(xFN1).Text
    For xFN2 = 1 To xDRg2.Count
        xSV2 = xDRg2.Item(xFN2).Text
      For xFN3 = 1 To xDRg3.Count
        xSV3 = xDRg3.Item(xFN3).Text
        xRg.Value = xSV1 & xStr & xSV2 & xStr & xSV3
        Set xRg = xRg.Offset(1, 0)
       Next
    Next
Next
End Sub

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

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


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

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

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

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

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

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

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

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

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

Нажмите, чтобы скачать Kutools for Excel Сейчас !


Больше относительных статей:

  • Создать все комбинации из 3 или нескольких столбцов
  • Предположим, у меня есть 3 столбца данных, теперь я хочу сгенерировать или перечислить все комбинации данных в этих 3 столбцах, как показано ниже. Есть ли у вас какие-нибудь хорошие методы решения этой задачи в Excel?
  • Найдите все комбинации, равные заданной сумме
  • Например, у меня есть следующий список чисел, и теперь я хочу знать, какая комбинация чисел в списке дает в сумме 480, на следующем скриншоте вы можете увидеть, что есть пять групп возможных комбинаций, которые в сумме равны до 480, например, 300 + 60 + 120, 300 + 60 + 40 + 80 и т. д. В этой статье я расскажу о некоторых методах определения суммирования ячеек до определенного значения в Excel.
  • Сгенерировать или перечислить все возможные перестановки
  • Например, у меня есть три символа XYZ, теперь я хочу перечислить все возможные перестановки на основе этих трех символов, чтобы получить шесть разных результатов, например: XYZ, XZY, YXZ, YZX, ZXY и ZYX. Как в Excel быстро сгенерировать или составить список всех перестановок на основе разного количества символов?
  • Составьте список всех возможных комбинаций из 4 цифр
  • В некоторых случаях нам может потребоваться сгенерировать список всех возможных 4-значных комбинаций чисел от 0 до 9, что означает создание списка 0000, 0001, 0002… 9999. Чтобы быстро решить задачу списка в Excel, я предлагаю вам несколько уловок.

Лучшие инструменты для работы в офисе

Kutools for Excel Решит большинство ваших проблем и повысит вашу производительность на 80%

  • Снова использовать: Быстро вставить сложные формулы, диаграммы и все, что вы использовали раньше; Зашифровать ячейки с паролем; Создать список рассылки и отправлять электронные письма …
  • Бар Супер Формулы (легко редактировать несколько строк текста и формул); Макет для чтения (легко читать и редактировать большое количество ячеек); Вставить в отфильтрованный диапазон
  • Объединить ячейки / строки / столбцы без потери данных; Разделить содержимое ячеек; Объединить повторяющиеся строки / столбцы… Предотвращение дублирования ячеек; Сравнить диапазоны
  • Выберите Дубликат или Уникальный Ряды; Выбрать пустые строки (все ячейки пустые); Супер находка и нечеткая находка во многих рабочих тетрадях; Случайный выбор …
  • Точная копия Несколько ячеек без изменения ссылки на формулу; Автоматическое создание ссылок на несколько листов; Вставить пули, Флажки и многое другое …
  • Извлечь текст, Добавить текст, Удалить по позиции, Удалить пробел; Создание и печать промежуточных итогов по страницам; Преобразование содержимого ячеек в комментарии
  • Суперфильтр (сохранять и применять схемы фильтров к другим листам); Расширенная сортировка по месяцам / неделям / дням, периодичности и др .; Специальный фильтр жирным, курсивом …
  • Комбинируйте книги и рабочие листы; Объединить таблицы на основе ключевых столбцов; Разделить данные на несколько листов; Пакетное преобразование xls, xlsx и PDF
  • Более 300 мощных функций. Поддерживает Office/Excel 2007-2021 и 365. Поддерживает все языки. Простое развертывание на вашем предприятии или в организации. Полнофункциональная 30-дневная бесплатная пробная версия. 60-дневная гарантия возврата денег.

вкладка kte 201905


Вкладка Office: интерфейс с вкладками в Office и упрощение работы

  • Включение редактирования и чтения с вкладками в Word, Excel, PowerPoint, Издатель, доступ, Visio и проект.
  • Открывайте и создавайте несколько документов на новых вкладках одного окна, а не в новых окнах.
  • Повышает вашу продуктивность на 50% и сокращает количество щелчков мышью на сотни каждый день!

офисный дно

Содержание

  1. Проход по диапазону ячеек
  2. Поддержка и обратная связь
  3. Перестановки без повторений: Комбинаторика в EXCEL
  4. Задача
  5. Инверсии перестановок
  6. Комбинаторика в Excel
  7. Перестановки без повторений
  8. Перестановки с повторениями
  9. Размещение без повторений
  10. Размещение с повторениями
  11. Сочетания без повторений
  12. Сочетания с повторениями

Проход по диапазону ячеек

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

Один из способов пройти по диапазону — использовать цикл For. Next со свойством Cells. С помощью свойства Cells можно заменить номера индексов ячеек счетчиком циклов (или другими переменными или выражениями). В следующем примере индекс строки заменяется переменной counter . Процедура проходит по диапазону ячеек C1:C20, присваивая значение 0 (ноль) каждому числу, абсолютное значение которого меньше 0,01.

Еще один простой способ пройти по диапазону — использовать цикл For Each. Next с коллекцией ячеек, указанной в свойстве Range. Visual Basic автоматически присваивает объектную переменную для следующей ячейки при каждом выполнении цикла. Следующая процедура проходит по диапазону ячеек A1:D10, присваивая значение 0 (ноль) каждому числу, абсолютное значение которого меньше 0,01.

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

Поддержка и обратная связь

Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.

Источник

Перестановки без повторений: Комбинаторика в EXCEL

history 2 февраля 2016 г.

Подсчитаем в MS EXCEL количество перестановок из n элементов. С помощью формул выведем на лист все варианты перестановок (английский перевод термина: permutation).

Перестановкой множества из n элементов называется расположение элементов в определенном порядке.

Элементами множества могут быть числа, буквы и вообще любые объекты. Главное, чтобы эти элементы были различными. Т.к. любому объекту можно сопоставить число, то для Перестановок обычно используют конечное множество целых чисел, например, <1; 2; 3; 4; 5>. Хотя множества из букв также можно часто встретить в литературе. Например, все различные Перестановки множества из трех элементов – это abc , acb , bac , bca , cab , cba .

Число Перестановок n элементов равно n! (факториал).

Для вычисления факториала в MS EXCEL есть функция =ФАКТР() , английский вариант FACT(). Понятно, что число перестановок растет очень быстро с ростом n: для n=7 число перестановок равно 5040. Справедливости ради, нужно отметить, что зачастую сами варианты перестановок находить не требуется, главное – найти их количество.

Примечание : Перестановки можно считать частным случаем размещений при n=k (см. статью Размещения без повторений: Комбинаторика в MS EXCEL ). Поэтому для вычисления количества перестановок можно использовать функцию ПЕРЕСТ() . Для n=7 число Перестановок вычисляется по формуле =ПЕРЕСТ(7;7)

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

В файле примера создана универсальная формула для вывода всех Перестановок для заданного n. Например, для n=3.

Задача

6 машин разных марок участвуют в гонках на выживание: LADA Granta, Hyundai Solaris, KIA Rio, Renault Duster, Lada Kalina, Volkswagen Polo. Определить число возможных вариантов распределения мест между всеми участниками.

Нам нужно определить число перестановок 6 машин на 6-и местах. Т.е. n=6. Оказывается, что таких перестановок 720: =ПЕРЕСТ(6;6) или 6! =ФАКТР(6)

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

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

Введя в ячейке В5 значение 6, определим все варианты расстановок машин на занятых ими в гонке местах.

Инверсии перестановок

Для каждой перестановки a 1, a 2, a 3. a n из n целых чисел 1, 2, 3, . n , инверсией называется пара ( a i, a j) если для i a j. Число инверсией в перестановке показывает насколько перестановка является «несортированной» по возрастанию.

Например, число инверсий в перестановке 1, 2, 3, 4 равно 0 (перестановка из 4-х целых чисел отсортирована по возрастанию от 1 до 4), а число инверсий в перестановке 4, 3, 1, 2 равно 5, т.к.:

  • первый элемент (i=1) равен 4 и он больше 3-х чисел (с j=2, 3, 4), которые расположены правее (4>3, 4>1, 4>2), т.е. мы имеем 3 инверсии;
  • второй элемент (i=2) равен 3 и он больше 2-х чисел (с j=3, 4), которые расположены правее (3>1, 3>2), т.е. мы имеем еще 2 инверсии;
  • так третий элемент (i=3) равен 1 и он меньше числа с j=4, которое расположено правее (1 файле примера для каждой Перестановки подсчитывается число инверсией.

Инверсии перестановок, например, используются при вычислении определителя матрицы (см. статью Вычисление определителя матрицы в MS EXCEL ).

Источник

Комбинаторика в Excel

Комбинаторика в Excel

Комбинаторика — раздел математики, изучающий дискретные объекты, множества (сочетания, перестановки, размещения элементов) и отношения на них. Термин комбинаторика был введён в математический обиход Лейбницем, который в 1666 году опубликовал свой труд «Рассуждения о комбинаторном искусстве». Excel поддерживает ряд функций комбинаторики. Чтобы разобраться, какую формулу использовать, следует ответить на ряд вопросов:

  1. Исходное множество содержит только уникальные элементы, или некоторые из них могут повторяться?
  2. Операция выполняется со всеми элементами множества, или только с некоторой выборкой из них?
  3. Важен ли порядок элементов в выборке?
  4. После выбора элемента мы его возвращаем назад?

Рис. 1. Дерево решений, какую формулу комбинаторики использовать

Скачать заметку в формате Word или pdf, примеры в формате Excel

Перестановки без повторений

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

Рис. 2. Перестановки (картинка взята здесь)

Если все n элементы разные, то число перестановок обозначается Pn от perturbation.

С другой стороны, произведение n первых натуральных чисел называется n-факториал и обозначается n!

По определению: 1! = 1; 0! = 1.

Функция в Excel =ФАКТР(n). Факториал растет очень быстро. Существенно быстрее экспоненты (рис. 3).

Рис. 3. Расчет числа перестановок без повторений с помощью факториала

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

Если в основном n множестве не все элементы разные, то число перестановок будет меньше n! Например, если наше множество состоит из трех яблок и одной груши, то всего возможно 4 перестановки (рис. 4). Груша может быть первой, второй, третьей или четвертой, а яблоки неразличимы).

Рис. 4. Перестановки с повторениями (картинка найдена здесь)

В общем случае, можно сказать: последовательность длины n, составленная из k разных символов, первый из которых повторяется n1 раз, второй – n2 раз, третий – n3 раз, …, k-й – nk раз (где n1 + n2 + … + nk = n) называется перестановкой с повторениями из n элементов.

Пример. Сколько различных пятибуквенных слов можно составить из букв слова «манна»?

Решение. Буквы а и н повторяются 2 раза, а буква м один раз.

Размещение без повторений

Размещением из n элементов по m называется упорядоченный набор из m различных элементов, выбранных из n-элементного множества (все элементы множества уникальны; позиции элементов в выборке важны). Число размещений обозначается от arrangement.

Например, два элемента из трех можно выбрать и расположить шестью способами (рис. 4):

Рис. 5. Размещение без повторений (картинка из презентации)

Если m = n количество элементов совпадает с количеством имеющихся мест для размещения. Знаменатель в формуле (4) превращается в 0! = 1. Остается только числитель n! А это – изученная выше перестановка без повторений; см. формулу (1).

Название функции в Excel несколько обескураживает. Но… что поделаешь: =ПЕРЕСТ(n;m)

Рис. 6. Размещение без повторений; обратите внимание на смешанные ссылки, которые позволяют протянуть формулу на всю таблицу

Размещение с повторениями

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

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

Рис. 7. Размещение с повторениями

В общем случае размещение с повторениями или выборка с возвращением – это размещение «предметов» в предположении, что каждый «предмет» может участвовать в размещении несколько раз. По правилу умножения количество размещений с повторениями из n по k:

В Excel используется функция ПЕРЕСТА(n;k).

Задача. Сколько различных номеров можно составить в одном коде региона?

Подсказка. В номере используется 12 букв алфавита, также существующих и в латинском алфавите (А, В, Е, К, М, Н, О, Р, С, Т, У, Х).

Решение. Можно воспользоваться формулой для размещения с повторениями:

Каждую цифру можно выбрать 10 способами, а всего цифр 3, при этом они могут повторяться, и их порядок важен. Каждую букву можно выбрать 12 способами, при этом буквы могут повторяться, и их порядок важен.

Сочетания без повторений

Сочетаниями из n множества по m элементов называются комбинации, составленные из данных n элементов по m элементов, которые различаются хотя бы одним элементом (в сочетаниях не учитывается порядок элементов).

Например, два элемента из 4 сочетаются 6 способами (порядок следования не важен):

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

где n – номер строки, m – номер элемента в строке, начиная с нулевого. Например, в строке 7:

Рис. 10. Треугольник Паскаля; чтобы увеличить изображение кликните на нем правой кнопкой мыши и выберите Открыть картинку в новой вкладке

В Excel используется функция =ЧИСЛКОМБ(n;m).

Сочетания с повторениями

Сочетания с повторениями по смыслу похожи на размещение с повторениями – это выборки из множества с возвращением выбранного элемента назад перед каждым новым выбором. При этом порядок в выборке не важен.

Например, два предмета из четырех можно выбрать 10 способами, если после каждого выбора предмет возвращается назад (рис. 11).

В общем случае, число сочетаний с повторениями:

Для нашего примера с фруктами

В Excel для подсчета числа сочетаний с повторениями используется функция =ЧИСЛКОМБА(n;m). В нашем примере =ЧИСЛКОМБА(4;2) = 10.

Источник

Yesterday I received an email, refering to some 2 old articles in VitoshAcademy for nested loops without recursion:

  • VBA – Nested loops with recursion (Permutations) 
  • VBA – Avoid nested loops with recursion (Part 2)

As far as the person from the email was taking a look at the code and was struggling, wanting to perform the combinations of the set [1,2,3,4,5,6] with 4 samples, I thought it would be interesting, if I give it a try, rewriting the old code I was using almost 5 years ago.

It was fun to see how I was thinking about programming back then and that I actually have changed slightly after. Anyway, while rewriting the code I noticed, that there are 2 main differences between permutations and combinations:

  • In combinations there are no values repeated;
  • In combinations every value is bigger than the previous one;

The latter is actually not true in general, but if we follow this rule, we are forced to skip adding “1243” after having already written “1234”. So, it is a kind of logic I decided to use, as far as sorting and implementing to a set was requiring more words to explain.

Long story short, implementing the old code I wrote 5 years ago, I have added 2 new conditions:

If Not AnyValueBiggerThanNext(arr) And Not AnyValueIsRepeated(arr) Then

    PrintArrayOnSingleLine arr

And it actually brought me to the desired result:

And this is the code, which probably looks better than the one I have written in 2015:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

Sub Main()

    Dim size As Long: size = 4

    Dim initialArray As Variant: initialArray = Array(1, 2, 3, 4, 5, 6)

    Dim arr As Variant: ReDim arr(size 1)

    Dim n As Long: n = UBound(arr) + 1

    EmbeddedLoops 0, size, initialArray, n, arr

End Sub

Function EmbeddedLoops(index As Long, size As Long, initialArray As Variant, n As Long, arr As Variant)

    Dim p As Variant

    If index >= size Then

        If Not AnyValueBiggerThanNext(arr) And Not AnyValueIsRepeated(arr) Then

            PrintArrayOnSingleLine arr

        End If

    Else

        For Each p In initialArray

            arr(index) = p

            EmbeddedLoops index + 1, size, initialArray, n, arr

        Next p

    End If

End Function

Public Function AnyValueBiggerThanNext(arr As Variant) As Boolean

    Dim i As Long

    For i = LBound(arr) To UBound(arr) 1

        If arr(i) > arr(i + 1) Then

            AnyValueBiggerThanNext = True

            Exit Function

        End If

    Next i

    AnyValueBiggerThanNext = False

End Function

Public Function AnyValueIsRepeated(arr As Variant) As Boolean

    On Error GoTo AnyValueIsRepeated_Error:

    Dim element As Variant

    Dim testCollection As New Collection

    For Each element In arr

        testCollection.Add «item», CStr(element)

    Next element

    AnyValueIsRepeated = False

    On Error GoTo 0

    Exit Function

AnyValueIsRepeated_Error:

    AnyValueIsRepeated = True

End Function

Public Sub PrintArrayOnSingleLine(myArray As Variant)

    Dim i As Long

    Dim textArray As String

    For i = LBound(myArray) To UBound(myArray)

        textArray = textArray & myArray(i)

    Next i

    Debug.Print textArray

End Sub

Actually, there are plenty of faster ways to make it happen, but my idea was to rewrite the old code with some new conditions. A quick good look for the faster ways – https://stackoverflow.com/questions/127704/algorithm-to-return-all-combinations-of-k-elements-from-n

A picture from Rila mountain, Bulgaria. Taken by me.

Hope you are enjoying it. 🙂

Комбинаторика: Генерирование перестановок: Алгоритм Нарайаны

Gustav

Дата: Пятница, 29.08.2014, 12:33 |
Сообщение № 1

Группа: Друзья

Ранг: Старожил

Сообщений: 2398


Репутация:

986

±

Замечаний:
0% ±


начинал с Excel 4.0, видел 2.1

Искал какой-нибудь простой способ генерирования перестановок, по возможности, без рекурсии. Наткнулся на алгоритм Нарайаны (статья в Википедии: https://ru.wikipedia.org/wiki….D%D1%8B ).

По ссылке приведены реализации на Си и Паскале. Изучил их, переложил на VBA, с возможностью использования массивов не только с основанием 0, как в исходных текстах, но и с более привычным для некоторых, включая меня, основанием 1.

Делюсь достигнутым:
[vba]

Код

Dim a() As Integer

Sub GeneratePermutations()

     Dim obs As Integer, n As Integer, j As Long

           n = 6 ‘количество элементов

           ‘управление основанием массива a(): либо от 0 до n-1, либо от 1 до n
     obs = 1 ‘здесь можно задать либо 0, либо 1 (а-ля Option Base)

              ‘начальная расстановка: элементы = натуральные числа от 1 до N по возрастанию
     Select Case obs
         Case 0:
             ReDim a(0 To n — 1): For j = 0 To n — 1: a(j) = j + 1: Next j
         Case 1:
             ReDim a(1 To n):     For j = 1 To n:     a(j) = j:     Next j
     End Select
     ‘следующую строку раскомментировать для тестирования случая остановки на строке 400
     ‘a(1) = 4: a(2) = 2: a(3) = 5: a(4) = 3: a(5) = 6: a(6) = 1

           ‘собственно генерирование всех перестановок
     j = 0
     Do
         j = j + 1
         ‘очередная расстановка: вывод на лист (или можно запоминать в какой-нибудь массив)
         Cells(j, 1).Resize(1, n) = a
     Loop Until NarayanaNextPerm(n, obs) = 0

       End Sub

Function NarayanaNextPerm(n As Integer, Optional obs As Integer = 0) As Integer

     Dim i As Integer, k As Integer, t As Integer, tmp As Integer

           ‘Шаг 1
     k = n — 2 + obs
     Do While k >= 0 + obs
         If a(k) < a(k + 1) Then Exit Do
         k = k — 1
     Loop

           If k = -1 + obs Then
         NarayanaNextPerm = 0 ‘сигнал об окончании внешнего цикла генерирования
         Exit Function
     End If

               ‘Шаг 2
     t = n — 1 + obs
     Do While t >= k + 1 And a(k) >= a(t)
         t = t — 1
     Loop
     tmp = a(k): a(k) = a(t): a(t) = tmp

           ‘Шаг 3
     For i = k + 1 To (n + k + obs) 2
         t = n + k + obs — i
         tmp = a(i): a(i) = a(t): a(t) = tmp
     Next i
     NarayanaNextPerm = i

       End Function

[/vba]
Сердцем алгоритма является функция NarayanaNextPerm, которая для текущей заданной расстановки, хранящейся в элементах внешнего массива a(), генерирует следующую расстановку (перестановку). Для генерации всех перестановок следует стартовать с начального монотонно возрастающего порядка элементов: от 1 до N. И затем дойти до конца процесса, получив ровно обратную последовательность — от N до 1.

Для 6 элементов (исходно: 1,2,3,4,5,6) процедура GeneratePermutations создает 720 строк (6!). Интересно, что процесс генерирования можно прервать в определенный момент, скажем, достигнув значения j = 400. Этому значению соответствует следующее состояние элементов массива a(1-6): 4,2,5,3,6,1. Если затем начать процесс с этого состояния, то он дойдёт до конца, создав оставшиеся 320 комбинаций.


МОИ: Ник, Tip box: 41001663842605

 

Ответить

Gustav

Дата: Пятница, 29.08.2014, 12:34 |
Сообщение № 2

Группа: Друзья

Ранг: Старожил

Сообщений: 2398


Репутация:

986

±

Замечаний:
0% ±


начинал с Excel 4.0, видел 2.1

[поскольку в одно сообщение не поместился, продолжаю в этом…]

В процессе работы демонстрационной процедуры GeneratePermutations на рабочий лист выводятся генерируемые перестановки. Однако, строк для вывода всех комбинациий становится недостаточно уже при n = 10 — требуется 10! = 3 628 800 строк, что больше максимального кол-ва строк на листе 2^20 = 1 048 576. Для Excel до версии 2007 ограничение, разумеется, наступает гораздо раньше.

В следующей процедуре GeneratePermutations2 учтена возможность достижения последней строки листа, либо произвольного заданного ограничения rmax. Достигнув предельной строки, процесс вывода продолжается с первой строки того же листа, с отступом через пустой столбец вправо от уже выведенных перестановок, т.е. происходит такое «подворачивание» вывода. Группы столбцов, между которыми делаются пустые столбцы, я назвал «грядками», а сами пустые столбцы — «межами».

[vba]

Код

Sub GeneratePermutations2()

      ‘вариант GeneratePermutations с «подворачиванием» на листе
      ‘понадобится при n > 9, если комбинации хочется вывести на рабочий лист

      Dim obs As Integer, n As Integer, r As Long, rmax As Long, c As Integer

              n = 10 ‘количество элементов

              ‘управление основанием массива a(): либо от 0 до n-1, либо от 1 до n
      obs = 1 ‘здесь можно задать либо 0, либо 1 (а-ля Option Base)
      rmax = 2 ^ 20 ‘предел «подворачивания»

                 ‘начальная расстановка: элементы = натуральные числа от 1 до N по возрастанию
      Select Case obs
          Case 0:
              ReDim a(0 To n — 1): For r = 0 To n — 1: a(r) = r + 1: Next r
          Case 1:
              ReDim a(1 To n):     For r = 1 To n:     a(r) = r:     Next r
      End Select

              r = 0: c = 1
      Do
          r = r + 1
          If r > Rows.Count Or r > rmax Then
              r = 1: c = c + n + 1
          End If
          ‘очередная расстановка: вывод на лист (с «подворачиванием»)
          Cells(r, c).Resize(1, n) = a
      Loop Until NarayanaNextPerm(n, obs) = 0

         End Sub

[/vba]
Процедура GeneratePermutations2 генерирует перестановки для 10 элементов, выводя первые 2^20 строк в первую «грядку», далее полностью заполняются еще две «грядки» и, наконец, четвертая «грядка» заполняется лишь по строку 483072. Итого 2^20*3+483072 = 3 628 800 строк. При n = 10 процедура работает порядка 4-х минут.


МОИ: Ник, Tip box: 41001663842605

Сообщение отредактировал GustavПятница, 29.08.2014, 12:35

 

Ответить

MCH

Дата: Пятница, 29.08.2014, 18:11 |
Сообщение № 3

Группа: Админы

Ранг: Старожил

Сообщений: 2002


Репутация:

751

±

Замечаний:
±


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

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

Т.к. мои реализации медленнее опубликованного здесь алгоритма Нарайаны, то опубликовывать их не буду

Сообщение отредактировал MCHПятница, 29.08.2014, 21:41

 

Ответить

MCH

Дата: Воскресенье, 31.08.2014, 10:43 |
Сообщение № 4

Группа: Админы

Ранг: Старожил

Сообщений: 2002


Репутация:

751

±

Замечаний:
±


Набрался наглости и внес коррективы в код Константина: изменил типы, убрал obs, немного оптимизировал вычисления в циклах
Это дало ускорение более чем в 1,5 раза от первоначального кода (на моем компьютере: 13,5 сек. против первоначальных 21,55 сек.)

[vba]

Код

Option Explicit

Private prmArr&()

Function MyNarayanaNextPerm&(n&)
      Dim i&, k&, t&, tmp&

            For k = n — 1 To 1 Step -1
          If prmArr(k) < prmArr(k + 1) Then Exit For
      Next k

              If k Then
          t = n
          While t > k And prmArr(k) >= prmArr(t)
              t = t — 1
          Wend
          tmp = prmArr(k): prmArr(k) = prmArr(t): prmArr(t) = tmp
          t = n
          For i = k + 1 To (n + k) 2
              tmp = prmArr(i): prmArr(i) = prmArr(t): prmArr(t) = tmp
              t = t — 1
          Next i
          MyNarayanaNextPerm = i
      End If
End Function

Sub GeneratePermutations0()
      Dim n&, i&, tmr!

              n = 11
      ReDim prmArr&(1 To n)
      For i = 1 To n: prmArr(i) = i: Next i
      ‘i = 0
      tmr = Timer
      Do
          ‘i = i + 1
          ‘Cells(i, 1).Resize(1, n) = prmArr
      Loop While MyNarayanaNextPerm(n)
      Debug.Print Timer — tmr
End Sub

[/vba]

Сообщение отредактировал MCHВоскресенье, 31.08.2014, 10:50

 

Ответить

Понравилась статья? Поделить с друзьями:
  • Команды форматирования текстового документа word
  • Команды форматирования текста в microsoft word
  • Команды форматирования символов в ms word определяют
  • Команды форматирования абзаца текста в word
  • Команды строки меню word окно