Страницы: 1
RSS
Как перебрать всевозможные комбинации столбцов?
 
Есть книга. В ней 20-30 строк и 600-700 столбцов
Задача состоит в следующем: Нужно перебрать всевозможные комбинации столбцов
Например
столбцы 1, 1+2, 2, 1+3, 3, 1+4..., 1+2+3, 2+3, ,1+2+4,,1+2+5...,1+2+3+4,,1+3+4,3+4 итд
начал писать цикл, но понял что одним циклом тут не ограничится.
может быть есть какой то более простой способ перебора всех комбинаций?
 
В файле нет примера результата.  
 
kalbasiatka, не важен результат (но для примера можно сумму по строке входящих в перебор столбцов заносить на другой лист)
главное это перебор
 
Допустим: Программа перебрала все возможные комбинации и вывела сообщение "Перебор завершен".
Вам так надо? Нет? А как?
В файле нет примера результата.
Всё сложное - не нужно. Всё нужное - просто /М. Т. Калашников/
 
Михаил Лебедев, да, по сути так и надо
 
Цитата
да, по сути так и надо
Ну, если так и надо... Пожалуйста. Работает моментально.
Скрытый текст
 
vikttur, очень смешно! а где цикл самого перебора? msgbox должен после него быть а не просто вывести окно перебор завершен
Приколисты)))))
 
Цитата
andrey062006 написал:Приколисты
Вы же сами сказали:
Цитата
andrey062006 написал:не важен результат
 
andrey062006, смысл перебора, если результат не нужен? Вам уже говорили приложить пример результата.

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
JayBhagavan,в лист результата пусть заносятся в каждую новую строку текущая комбинация столбцов
 
Цитата
andrey062006 написал:
(но для примера можно сумму по строке входящих в перебор столбцов заносить на другой лист)
Занес сумму по строке входящих в перебор столбцов на другой лист
=СУММ(Лист1!B2:WR2)
Всё сложное - не нужно. Всё нужное - просто /М. Т. Калашников/
 
Михаил Лебедев, ОМГ, вот поэтому я и написал так, как написал, чтобы не зацикливались на суммах и прочем. НУЖЕН ЦИКЛ ПЕРЕБОРА КОМБИНАЦИЙ СТОЛБЦОВ а не конкретная сумма.
 
Формула:
=СЦЕПИТЬ(ЕСЛИ(СТРОКА()-1;ИНДЕКС($A:$A;СТРОКА()-1);Лист1!$B$1);",";ИНДЕКС(Лист1!$1:$1;1;СТОЛБЕЦ(Лист1!$B$1)+СТРОКА()))

В макросе не вижу смысла.

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Цитата
andrey062006 написал:
НУЖЕН ЦИКЛ ПЕРЕБОРА КОМБИНАЦИЙ СТОЛБЦОВ
ЗАЧЕМ НУЖЕН?
и
1,2 и 2,1 - это одна и та же комбинация?
Всё сложное - не нужно. Всё нужное - просто /М. Т. Калашников/
 
Михаил Лебедев, 1и2и3и4, 1и2, 1и3, 1и4, 1и2и4, 1и3и4, 2и3и4, 2и4, 2и3, 3и4, 1, 2, 3, 4
Вот сколько комбинайций только из 4 столбцов
А их больше 600
Для примера добавил макрос цикла который перебирает только по 1 столбцу
А нужно чтобы комбинации перебирал а не только по 1
 
Цитата
andrey062006 написал:
1и2и3и4, 1и2, 1и3, 1и4, 1и2и4, 1и3и4, 2и3и4, 2и4, 2и3, 3и4 Вот сколько комбинайций только из 4 столбцов
и
Цитата
andrey062006 написал:
Нужно перебрать всевозможные комбинации столбцов
Вы сами себе противоречите. Это - не все комбинации, например - вот эти - не перечислили
1и1и2и1 1и2и2и1 1и2и2и2 и т.д.

Вамнужны действительно ВСЕ комбинации или только отвечающие определенному условию? (Или алгоритму?)
Изменено: Михаил Лебедев - 23.01.2016 20:59:18
Всё сложное - не нужно. Всё нужное - просто /М. Т. Калашников/
 
Михаил Лебедев, 1и1и2и1 это не то. Уточнюсь, комбинации из уникальных столбцов, в комбинации 1и1и2и1 три раза повторяется столбец 1. Короче один столбец в комбинации учавствует только один раз, а не несколько.
Изменено: andrey062006 - 23.01.2016 21:02:09
 
Цитата
Михаил Лебедев написал:
1,2 и 2,1 - это одна и та же комбинация?
(повторюсь)
Всё сложное - не нужно. Всё нужное - просто /М. Т. Калашников/
 
Михаил Лебедев, да, это одна и та же комбинация
 
andrey062006, сообщите конечную цель перебора.
Перебрать 600 столбцов, генерируя все возможные комбинации - невозможно.
для 4х столбцов (чисел) существует 31 вариант сочетаний 2^4-1
для 600 чисел - 2^600-1 = 4,14951556888099E+180 вариантов

если скажите, какова конечная цель, то возможно есть другое решение, а не простой перебор всех вариантов.
Например, если из 600 столбцов нужно выбирать не более 4х, то это всего 5 млрд. комбинаций (5 382 165 350), что вполне возможно перебрать за разумное время.
Изменено: MCH - 23.01.2016 21:28:17
 
MCH, ну допустим можно ограничить комбинацию от 1 до 20 столбцов в комбинации.
Пусть будет если сумма ячеек 2-ой строки выбранных (входящих в комбинацию) столбцов больше 5 (к примеру) то пусть она заносит в лист "результат" эту комбинацию столбцов (естественно для каждой комбинации новая строка).
 
Макрос, который генерирует сочетания чисел, без подробного описания задачи ничего другого предложить не смогу
Код
Sub main()
    Dim a&(), b&(), i&, clm&, rws&, m&, n&, nMin&, nMax&, p&, txt$
    n = 20 'выборка из 20 чисел
    nMin = 1 'минимальная выборка
    nMax = 5 'максимальная выборка
    If nMin < 1 Then nMin = 1 'проверка на правильность значений
    If nMax > n Then nMax = n
      
    rws = 1 ' начальная строка для вывода
    clm = 1 'начальный столбец для вывода
    Cells(rws, clm).CurrentRegion.ClearContents 'очищаем диапазон вывода
    
    For m = nMin To nMax 'перебираем все выборки
        ReDim a&(1 To m)
        For i = 1 To m: a(i) = i: Next i 'начальная расстановка
        If m = n Then p = 1 Else p = m
        Do 'перебираем все сочетания m из n
            'здесь нужно сделать проверку, если очерендная генерация нам подходит
            If True Then 'вместо True должно быть условие при котороам будем запоминать генерацию
                txt = ""
                For i = 1 To m 'генерируем строку для вывода
                    txt = txt & IIf(txt = "", "", ", ") & a(i)
                Next i
                Cells(rws, clm) = txt 'сохраняем строку с индексами
                rws = rws + 1
                If rws > Rows.Count Then rws = 1: clm = clm + 1
            End If
            If a(m) = n Then p = p - 1 Else p = m
            If p Then
                For i = m To p Step -1
                    a(i) = a(p) + i - p + 1
                Next i
            End If
        Loop While p
    Next m
End Sub
 
MCH, Макрос вроде нормально работает но никак не могу его разобрать что там к чему. Какие то непонятные переменные. В каждом цикле какая переменная отвечает за выбранные столбцы или как макрос понимает какие столбцы сейчас просматриваются?
Как сделать чтобы текущие просматриваемые столбцы снизу (или сверху) например помечались плюсом, после проверки строка эта зачищалась и в новые выборке опять новые столбцы чтобы помечались плюсом ну ии каким-либо другим знаком?
Изменено: andrey062006 - 24.01.2016 01:06:13
Страницы: 1
Наверх