Страницы: 1
RSS
Комбинаторика: составить уникальные комбинации элементов массива
 
Есть массив из 38 элементов и нужно составить из них в столбик по 6 уникальных комбинаций
т.е. 1 2 3 4 5 6 и 6 5 4 3 2 1 и допустим 1 3 5 6 4 2 - это повторы и в результатах должно быть что-то одно из них
если сталкивались с комбинаторикой , подскажите как проще составить программку
 
Нужны все сочетания 6 из 38?
ЧИСЛКОМБ(38;6) = 2760681
на лист не помещаются
 
Благодарю , то что нужно.
 
kolomna31, зачем пишете через 1-2 строки?
 
Подскажите, а как сделать это частями на несколько листов ?
 
kolomna31, Вам модератор сделал замечание.  Вместо реакции - в следующем сообщении нарушение.
По просьбе Михаила тему открыл.

Правила изучите, пожалуйста.
 
Почти 3 миллиона комбинаций. Куда Вы планируете их выводить и что с ними будете делать?
Можно вывести на один лист со смещением, можно на разные листы, можно выводить в файл.
Если нужно делать какие нибудь расчеты, то и выводить не нужно.  
 
Цитата
vikttur пишет: Вам модератор сделал замечание. Вместо реакции - в следующем сообщении нарушение.
Я ответил Юрию, но не вижу своего сообщения , поэтому продублирую , через строку - так отобразился скопированный текст , который разместил на разных форумах по excel, на вашем ответ был лучший и самый быстрый. сорри за неотформатированность сообщения и спасибо что отредактировали, не знал как это сделать после.

Еще рас спасибо МСН за толковую и быструю подсказку . (вопрос с выводом решился )
 
Своё сообщение можно редактировать))
 
Цитата
kolomna31 пишет:
Подскажите, а как сделать это частями на несколько листов ?
Попробуй так
 
Если усложнить задачу и вывести все значения, за исключением тех, которые идут по порядку 3 и более раз. Такие как: 1 2 3 5 7 9 10 , 1 3 4 5 7 9 10 , 1 2 3 4 7 10 тогда массив из 38 элементов 6 значений поместится на лист ?
Изменено: Lerroy-xbbc - 15.02.2018 16:58:03
 
Это вопрос, поместится или нет?  или нужно сделать такую генерацию?
Как вариант решения, генерируем все сочетания, проверяем каждое сочетание и отсекаем лишние
 
Код
Sub Proc6From38()
  Dim M As Long, N As Long
  Dim p() As Long, pe() As Long, rm() As Long, i As Long, r As Long, c As Long, pr&, tc, ars
  M = 6: N = 38
  With WorksheetFunction               ' Init array size & var value
    ars = .Fact(N) / .Fact(M) / .Fact(N - M): If ars > Rows.Count Then ars = Rows.Count
    ReDim rm(1 To ars, 1 To M)
  End With
  ReDim p(1 To M):  ReDim pe(1 To M): tc = 0
  For i = 1 To M: p(i) = i: pe(i) = N - M + i: Next: p(M) = M - 1: r = 1: c = M
  Do While p(1) < pe(1)                ' Main do
    If p(c) < pe(c) Then
      p(c) = p(c) + 1: pr = 0
      For i = c + 1 To M: p(i) = p(i - 1) + 1: Next
      For i = 1 To M
        rm(r, i) = p(i): If i > 1 Then If p(i) = p(i - 1) + 1 Then pr = pr + 1 Else pr = 0
        If pr = 2 Then Exit For
      Next
      If pr <> 2 Then r = r + 1
      c = M
      If r > Rows.Count Then
        Cells(1, tc * (M + 1) + 1).Resize(ars, M).Value = rm
        ReDim rm(1 To ars, 1 To M): tc = tc + 1: r = 1
      End If
    Else
      c = c - 1
    End If
  Loop
  For i = 1 To M: rm(r, i) = Empty: Next
  If ars > r - 1 Then ars = r - 1
  Cells(1, tc * (M + 1) + 1).Resize(ars, M).Value = rm
End Sub
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ну и мой вариант
Код
Sub main()
    Dim n As Long, m As Long, cnt As Long, i As Long, j As Long, mxk As Long, k As Long, clm As Long, a() As Long, out() As Long
    n = 38
    m = 6
    mxk = 3 'количество подряд возрастающих чисел
    If m < 1 Or n < m Or mxk <= 1 Then Exit Sub 'проверка достоверности данных
    cnt = WorksheetFunction.Combin(n, m) 'число сочетаний m по n
    If cnt > Rows.Count Then cnt = Rows.Count
    ReDim a(1 To m), out(1 To cnt, 1 To m)
    For i = 1 To m
        a(i) = i
    Next i
    Do
        k = 1
        For i = 2 To m
            If a(i - 1) + 1 = a(i) Then k = k + 1 Else k = 1
            If k >= mxk Then Exit For
        Next i
        If i > m Then
            If j = cnt Then
                Cells(1, clm + 1).Resize(j, m) = out
                j = 0
                clm = clm + m + 1
            End If
            j = j + 1
            For i = 1 To m
                out(j, i) = a(i)
            Next i
        End If
    Loop While NextCombin(a(), n, m)
    If j Then Cells(1, clm + 1).Resize(j, m) = out
End Sub

Function NextCombin(a() As Long, n As Long, m As Long) As Boolean 'следующее сочетание
    Dim i As Long, j As Long
    For i = m To 1 Step -1
        If a(i) < n - m + i Then
            a(i) = a(i) + 1
            For j = i + 1 To m
                a(j) = a(j - 1) + 1
            Next j
            NextCombin = True
            Exit For
        End If
    Next i
End Function
 
Оба способа, работают прекрасно. Задачу по уникальности решают.  Число комбинаций уменьшили всего лишь на 215457. Я думал будет в разы будет уменьшение. 1й способ позволяет редактировать количество данных M N без корректировки кода.
Изменено: Lerroy-xbbc - 16.02.2018 11:13:55
 
А как сделать комбинаторику трехзначного числа, это число берется с другого листа например 9 5 2 чтобы все 6 вариантов были друг под другом
«В начале было Слово, и Слово было у Бога, и Слово было Бог»
В оригинальном тексте на древнегреческом языке на месте «Слова» стоит «ὁ Λόγος (Логос)». Еще оно переводится как «ум», «основа», «утверждение», «разумение», «значение», «доказательство»...
 
Нужны все перестановки:
9 5 2
9 2 5
5 9 2
5 2 9
2 9 5
2 5 9
или что-то другое?
 
Код
=--(
ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ({1:1:2:2:3:3};1;ПСТР(Лист2!A1;1;1));2;ПСТР(Лист2!A1;2;1));3;ПСТР(Лист2!A1;3;1))&
ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ({2:3:1:3:1:2};1;ПСТР(Лист2!A1;1;1));2;ПСТР(Лист2!A1;2;1));3;ПСТР(Лист2!A1;3;1))&
ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ({3:2:3:1:2:1};1;ПСТР(Лист2!A1;1;1));2;ПСТР(Лист2!A1;2;1));3;ПСТР(Лист2!A1;3;1)))
 
Да, все верно все 6 перестановок цифр числа  
«В начале было Слово, и Слово было у Бога, и Слово было Бог»
В оригинальном тексте на древнегреческом языке на месте «Слова» стоит «ὁ Λόγος (Логос)». Еще оно переводится как «ум», «основа», «утверждение», «разумение», «значение», «доказательство»...
 
открывайте файл, жмите кнопку
Код
Sub Permutat(res, S1 As String, S2 As String, ByRef R As Long)
  Dim i&, L&
  L = Len(S2)
  If L < 2 Then
    res(R) = S1 & S2:  R = R + 1
  Else
    For i = 1 To L
      Permutat res, S1 + Mid(S2, i, 1), Left(S2, i - 1) + Right(S2, L - i), R
    Next
  End If
End Sub
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
Цитата
написал:
Нужны все перестановки:9 5 29 2 55 9 25 2 92 9 52 5 9или что-то другое?
Но хотелось бы сразу в excel я конечно сделала ручной вариант без формул, но спасибо
«В начале было Слово, и Слово было у Бога, и Слово было Бог»
В оригинальном тексте на древнегреческом языке на месте «Слова» стоит «ὁ Λόγος (Логос)». Еще оно переводится как «ум», «основа», «утверждение», «разумение», «значение», «доказательство»...
 
Мне это было необходимо для решения задачи как нумеролога
ФИО
ИОФ
ОФИ
ФОИ
ОИФ
ИФО
Например Фамилия  Иванова до замужества по архисло =49...4+9=13....1+3=4 и это у нас Ф
Имя Марина по архисло 59...5+9=14..1+4=5 и это у нас И
Отчество Геннадьевна по архисло(это программа расчета суммы букв по алфавиту) 101...1+0+1=2 и это О
ФИО у нас дает код 452
и потом я включаю метод переотражений, как стороны куба... и вот для решения этого шага мне и нужна была комбинаторика для получения дополнительных 5 вариантов из 6
ФИО
ИОФ
ОФИ
ФОИ
ОИФ
ИФО
Изменено: Марина Русалева - 13.06.2023 10:47:20
«В начале было Слово, и Слово было у Бога, и Слово было Бог»
В оригинальном тексте на древнегреческом языке на месте «Слова» стоит «ὁ Λόγος (Логос)». Еще оно переводится как «ум», «основа», «утверждение», «разумение», «значение», «доказательство»...
 
Цитата
написал:
Прикрепленные файлы
Книга2.xlsm  (18.29 КБ)
Спасибо большое всем!!!
«В начале было Слово, и Слово было у Бога, и Слово было Бог»
В оригинальном тексте на древнегреческом языке на месте «Слова» стоит «ὁ Λόγος (Логос)». Еще оно переводится как «ум», «основа», «утверждение», «разумение», «значение», «доказательство»...
 
https://www.planetaexcel.ru/forum/index.php?PAGE_NAME=message&FID=1&TID=57850&am...

я протестировал на комбинациях по три из 17, алгоритм вычисляет сначала количество значений, чтобы проверить условие влезет ли на лист количество строк, получается 680 уникальных комбинаций, но выводит только 665, т.к. исключает те, что идут подряд 1,2,3 и 2,3,4... Как убрать это условие, чтобы выводились полностью 680 уникальных комбинаций?
 
001010001010100100=37037073307370703730=370
002020002020200200=74074047704740407470=407
003030003030300300=111111111111111111111=111
004040004040400400=148148184418481814841=481
005050005050500500=185185158815851518581=518
«В начале было Слово, и Слово было у Бога, и Слово было Бог»
В оригинальном тексте на древнегреческом языке на месте «Слова» стоит «ὁ Λόγος (Логос)». Еще оно переводится как «ум», «основа», «утверждение», «разумение», «значение», «доказательство»...
Страницы: 1
Наверх