¿Cómo determinar el resultado de una combinatoria?

Quisiera hacer en Excel 2016 lo siguiente:

Tengo dos elementos: A y B, si realizo una serie con tres elementos obtendría en total 6 combinaciones, a saber: AAA, AAB, ABA, BBB, BBA Y BAB.

Me gustaría hacer eso, no con 3 elementos, sino con 5; de manera que muestre resultados como estos:

Aaaaa, aaaab, aaabb, aabbb, abbbb, bbbbb, etc.

Estos resultados deberían ser mostrados en un rango de hoja.

Tengo varias hojas de permutacion y combinatorias pero no funcionan.

1 respuesta

Respuesta
1

En un libro nuevo, en un módulo ingresa los siguientes códigos

Option Explicit
Dim CurrentRow
Sub GetString()
    Dim InString As String
    InString = InputBox("Ingrese el numero o texto")
    If Len(InString) < 2 Then Exit Sub
    If Len(InString) >= 8 Then
        MsgBox "Demasiadas permutaciones"
        Exit Sub
    Else
        ActiveSheet.Columns(1).Clear
        CurrentRow = 1
        Call GetPermutation("", InString)
    End If
End Sub
Sub GetPermutation(x As String, y As String)
'   Algoritmo de autor desconocido
    Dim i As Integer, j As Integer
    j = Len(y)
    If j < 2 Then
        Cells(CurrentRow, 1) = x & y
        CurrentRow = CurrentRow + 1
    Else
        For i = 1 To j
            Call GetPermutation(x + Mid(y, i, 1), _
            Left(y, i - 1) + Right(y, j - i))
        Next
    End If
End Sub

Luego ejecuta la macro "GetString" y en el cuadro de dialogo ingresa ABCDE

Salu2

No se se hice algo mal o hice un planteamiento erróneo. La macro funciona, pero como las que ya tengo. Lo que necesito es que con los dos elementos A y B me de las 120 combinaciones posibles, para un parámetro de 5. Son solo dos elementos que necesito combinar en todas las posiciones posibles, que son 5 y que daría un total de 120 combinaciones.

Ok, pero eso ya no son permutaciones, sino más bien particiones (o no sé bien como se llamará). De hecho en tu ejemplo con 3 elementos, el resultado no son 6 elementos, ya que tenemos

AAA, AAB, ABA, BAA, ABB, BAB, BBA, BBB

Que son 8 elementos (por eso digo que son particiones). Daría la sensación que el resultado es más bien 2^n, en lugar de n!

Que pasaría con 4 elementos (si lo que dije antes, deberían ser 16 elementos).

Aaaa, aaab, aaba, abaa, baaa, aabb, abba, bbaa, abab, baba, baab, abbb, babb, bbab, bbba, bbbb

Efectivamente son 16 elementos (salvo que veas que me faltó alguno)

Por lo que para el caso que planteas, serán 32 elementos y no 120 como dices.

No tengo el código para obtener esto, pero creo que se ve que para 5 elementos puedes agarrar los 16 elementos obtenidos antes, lo copias 2 veces, al primer rango le agregas una A (adelante o atrás) y al otro rango le agregas una B (en la misma posición que al primero). Así las variaciones para 5 elementos serían:

Aaaaa, aaaab, aaaba, aabaa, abaaa, aaabb, aabba, abbaa, aabab, ababa, abaab, aabbb, ababb, abbab, abbba, abbbb

Baaaa, baaab, baaba, babaa, bbaaa, baabb, babba, bbbaa, babab, bbaba, bbaab, babbb, bbabb, bbbab, bbbba, bbbbb

En este momento no tengo tiempo para hacer este código, pero fijate si con esto que de dije puedes avanzar (luego veré si puedo hacerme un rato de tiempo para armar este código...)

Salu2

¡Gracias! Tratare de avanzar con esa explicacion que me diste. Muy agradecido

Este problema me quedó dando vueltas en la cabeza toda la noche, hasta que finalmente encontré el código...

Option Base 0
Option Explicit
Sub variacionesAB()
Dim cant
cant = InputBox("Ingrese la cantidad de variaciones que desea (entero entre 2 y 15)", "Ingreso de parámetros", 5)
If (cant < 1) Or (cant = "") Then Exit Sub
If cant > 15 Then
  MsgBox "Demasiados elementos, la macro tardará mucho o los resultados exceden la cantidad de filas", vbOKOnly, "PROCESO CANCELADO"
  Exit Sub
End If
Dim Res() As String, I As Integer, J As Integer
ReDim Res(2 ^ cant - 1)
For I = 1 To cant
  For J = 0 To 2 ^ cant - 1
    If (J Mod (2 ^ I)) < (2 ^ (I - 1)) Then
      Res(J) = "A" & Res(J)
    Else
      Res(J) = "B" & Res(J)
    End If
  Next J
Next I
For I = 1 To 2 ^ cant
  Cells(I, 1) = Res(I - 1)
Next I
End Sub

Salu2

¡Gracias! Ha funcionado tal cual esperaba, una pregunta adicional. Trate de modificar el código para que me diera los resultados para A, B y C; pero de verdad que el VB no se me da nada; ¿Cómo podría hacerlo?

Ya con tres variables habría que pensar bien las posibilidades, creo que alcanzaría con cambiar donde asigna las variables A, B, pero habría que revisarlo (por supuesto también hay que cambiar los ciclos, porque ya no son 2^n opciones, sino 3^n

Salu2

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas