¿Es posible intercambiar las filas y columnas de la matriz G2 para que sea igual a G1?

Esa es mi duda, tengo rato intentando que la matriz G2 sea igual que G1 solo realizando intercambios de filas y columnas, espero me puedan ayudar ya que solo he podido intercambiar algunas columnas y me quedo estancado (En la parte de abajo de la imagen esta el intento que hice por resolverlo).

  • Solo se deben hacer intercambios de filas y columnas en G2
  • G1 debe permanecer igual

1 respuesta

Respuesta
1

·

Sí, es posible conseguirlo. He creado una hoja de Excel con una pequeña macro que permite probar las combinaciones de filas que solo son 12 y luego comprueba si las columnas son iguales aunque no estén en orden.

Cuando cambiamos de lugar una fila o columna se mantiene el número de ceros o unos de todas las filas y columnas aunque en distinto lugar que antes.

En filas hay una con 5 unos, dos con 4 unos y tres con 3 unos, hagamos los cambios que hagamos seguirá habiendo ese número de filas de cada clase. Con las columnas pasa lo mismo, hay once columnas con 2 unos y seguirá habiendo siempre ese número.

Entonces la fila de 5 unos que es la primera tendrá que ir obligatoriamente al lugar de destino donde está la fila de 5 unos que es la quinta. Esto quiere decir que la fila primera, va a la fila quinta. Y las dos filas de 4 unos irán a las dos filas de 4 unos en el destino, esto da dos posibilidades. Y las filas de tres unos irán donde hay tres unos en el destino, esto son permutaciones de 3 que son 6.

Las combinaciones posibles son 6·2 = 12 que es poca cosa para un ordenador. Y una vez cambiadas las filas las columnas ya tienen que tener la misma estructura que el destino. Para hacer una comparación más sencilla a cada columna le asigno un número que sería el número binario que representa. Si la columna es (c1, c2, c3, c4, c5, c6) se calcula así:

b = 32·c1 + 16·c2 + 8·c3 + 4·c4 + 2·c5 + c6

Luego ordeno esos números de menor a mayor y los puedo comparar con los mismos de la matriz destino, si son todos iguales es que se puede hacer el cambio.

Esta es la macro:

Sub comprobar()
Dim i, j, fila As Integer
Dim SonIguales As Boolean
For i = 1 To 12
    Range("M12:w17").Clear
    For j = 1 To 6
        fila = Cells(i + 8, j)
        Range("A" & fila & ":K" & fila).Copy Destination:=Range("M" & 11 + j)
    Next
    SonIguales = True
    For k = 13 To 23
        If Cells(9, k) <> Cells(19, k) Then SonIguales = False: Exit For
    Next
    If SonIguales Then
        MsgBox ("Son Iguales, combinación " & i)
    End If
Next
End Sub

Y estas las fórmulas:

En M8   

=M1*32+M2*16+M3*8+M4*4+M5*2+M6

Esa fórmula se pega de N8 a W8 y de M18 a W18

En M9

=K.ESIMO.MENOR($M$8:$W$8;COLUMNA()-12)

Y esa formula se pega desde N9 hasta W9

En M19

=K.ESIMO.MENOR($M$18:$W$18;COLUMNA()-12)

Y secopia y pega desde N19 hasta W19

Entre A9 y F20 escribí yo a mano los intercambios de filas posibles

·

Y estos los resultados:

La combinación 4 es la que está en la fila 12 de la hoja columnas A a F y que hace estos intercambios de filas de la matriz

1 al 5,  2 al 4, 3 al 2, 4 al 1, 5 al 6, 6 al 3

Y luego las columnas comparas los números de la fila 18 de la hoja columnas M a W con las mismas de la fila 8. Tienes que el 10 está el primero y en la matriz destino esta el noveno, luego hay que cambiar la columna primera al noveno lugar, el 9 es la segunda columna y en destino está el octavo, luego se cambia la columna segunda con la octava, etc.

Y esta es la otra forma de hacerlo

La combinación 12 es la que está en la fila 20 de la hoja, hace estos cambios de filas

1 a 5, 2 a 4, 3 a 3, 4 a 6,  5 a 1 y 6 a 2

Luego si haces las comparaciones como antes lleva la columna 1 a 6, 2 a 1, 3 a 5 etc.

En realidad una vez se sabe los cambios de filas necesarios no es tan difícil calcular los de las columnas.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas