[ALGORÍTMO] Patron Matemático Combinatorio

bLaKnI

Buenas compañeros.

Tengo un buen jaleo y no se como coño resolverlo.
Os cuento:

  • Necesito obtener un patrón para definir un algoritmo combinatorio que me permita commutar todos los elementos de diferentes grupos para obtener todas las posibles combinaciones de la conjunción de los grupos.
    Se que suena extraño, pero me explicaré con un ejemplo claro.

Tengo 4 grupos, por ejemplo.

Grupo --> Contenido
1 --> (A|B)
2 --> (A|B|C)
3 --> (A)
4 --> (A|B)

ok?

Mi objetivo es establecer TODAS las posibles combinaciones existentes entre grupos y contenidos de estos:

AAAA
AAAB
ABAA
ABAB
ACAA
ACAB
BAAA
BAAB
BBAA
BBAB
BCAA
BCAB
...

Veis lo que hago? Siempre cambio el del final primero. Y cuando no quedan elementos en el grupo del final, en el anterior lo cambio, y vuelvo a mezclar con el ultimo grupo desde el primer elemento de este ultimo grupo (en este ejemplo, el penultimo grupo solo tenia un elemento, luego el que cambiaba cuando llegaba a B en el ultimo grupo, era el segundo grupo).

He buscado algoritmos de combinatorias y permutaciones. Pero no me sirve el juego factorial de entrada, porque no quiero cambiar ordenes ni permutar. Ni tampoco mezclar. Es sencillamente como "un interruptor".

Vas cambiando cada elemento del ultimo grupo, y cuando es el ultimo, cambias un elemento del grupo anterior, y vuelves a empezar con el ultimo grupo. Cuando no puedes cambiar ninguno del penultimo, cambias uno del anterior y vuelves a empezar todo el proceso con el ultimo y penultimo.

De hecho es una combinatoria multidimensional.
Con una estructura tipo arbol, podria funcionar, pero me gustaria un algoritmo de tipo recursivo que me permitiera obtener todas las posibles variedades.

En realidad, no serian letras los valores de cada grupo, sino numeros concurrentes. La gracia que tiene es que son indices a unos arrayes y que posteriormente, dadas todas las combinaciones posibles, me permitirian obtener unas frases muy concretas.

Si pudierais hecharme un cable, os lo agradeceria mucho!

Grácias! :)

PD: no lo pongo en desarrollo, porque el algoritmo en si lo haria yo. El tema está en que por aquí hay estadístas y matemáticos que podrian orientarme en cual es el camino a seguir.

Grácias de nuevo!

Eristoff

Chavales estan pidiendo una respuesta por aqui...

ISAILOVIC

#2 Todo el mundo tenemos una en mente

bLaKnI

Thrazz, OleMoudi, Cosma, Tostador, Minipelos, C, LoCo, Gnosis, Seuron...
Los que soleis programar. Hechadme un cable porfavor.
Habeis tenido que hacer nunca una asignacion a modo combinacional? No encuentro la recursión y ya llevo demasiadas horas...

edit:

||
V

Mas que pedir, obtener la manera de combinar.
No quiero el numero, pero si puedes darme el numero, es que lo haces con una formula concreta. Esa formula podria ayudarme, ya que no es una Combinacional estandar. Es como una comunion de combinacionales.

(x,Y)U(x2,Y2)U...

Pero preferiria la manera orientada de llegar a las combinaciones.

Si tuviera grupos unidimensionales:

1 --> (A)
1 --> (B)
1 --> (C)
1 --> (D)

seria facil ya que buscar:

ABCD
ABDC
ACBD
BCDA
... es puramente una combinatoria.

La dificultad aparece en la multidimensionalidad, es decir, los multiples elementos por grupo.

borisuco

Pides el número de combinaciones, o las combinaciones en sí?

eeerrhhhhffff, acabo de leerte otra vez. Creo que ya lo he entendido, columna por grupo, ok. Pueees, a ver que se me ocurre

Slevin

#3 TODOS.

borisuco

Estoy matadete y no sé si te estoy entendiendo, creo que además de los elementos de los grupos, se puede variar el orden de los propios grupos, así que para saber el número de combinaciones posibles, pueees, (en caso de haberte entendido)

multiplicaría "N! * (a!b!c!d!...*n!)", siendo "N" el número de grupos, "a" el numero de elementos del grupo 1, "b" el número de elementos del grupo 2, y así hasta N grupos.

Insisto en que estoy lamentable, que no he dormido una mierda, pero vamos, básicamente multiplico las permutaciones posibles dentro de cada grupo, y los posibles órdenes de los grupos.

De cara a obtener todas... pues no sé, supongo que mantendría estables N-1 de los grupos y variaría otro, luego otro, luego otro, en fin, el mismo método que tú, y luego repitiría el proceso cambiando el orden de los grupos. Así, con los N! órdenes de grupos.

Eeeeerrhhhh, ¿soy mínimamente útil? ¿fracaso absoluto? ¿Algo que corregir? ¿Todo?

(Estoy jugando con que los grupos no se repiten, si se repiten, puees, habrá que retocar)

FreemAN-

Te paso el código Prolog de un ejercicio de permutación que tuve que hacer el año pasado.

%Funcion auxiliar que concatenar dos listas
concatenar([],L,L).
concatenar([X|C1],L,[X|C2]) :- concatenar(C1,L,C2).

%Se encarga de hacer la permutacion de un elemento, insertandolo en los
%distintos lugares de la lista
permaux(X,L,Z):-concatenar([X],L,Z).
permaux(X,[Y|C1],Z):-permaux(X,C1,C2),concatenar([Y],C2,Z).

%Aplicamos permaux sobre cada uno de los elementos de la lista a permutar
permuta([],[]).
permuta([X|C],Y):- permuta(C,C1),permaux(X,C1,Y).

A ver si te sirve para algo, aunque creo que este sólo hacía la permutación "simple". Como ves la recursión es clara.

PD: No me acuerdo si funcionaba xd

Magnnus

Variaciones (importa el orden)

SIN repeticion: n!
CON repeticion: nm

Combinaciones (no importa el orden)

SIN repeticion: n! / (n-m)! m!
CON repeticion: (n+m-1) / (n-1)! m!

e aqui en esencia lo que di de combinatoria el año pasado en Matemática Discreta.

evilsol

me encanta que mv este llena de sabios por doquier y este thread pase casi inadvertido...pa que seguir...

_SePHiRoTH_

Eso no se supone que es el principio de Inclusión-Exclusión?

|A+B| = |A| + |B| + |A ^ B| (^ -> Disyunción)

Edit: Como le he echado un vistazo por encima, en caso que no sea esto serán las ecuaciones diofánticas.

#13 Ein? Es que no me lo he leído ni quiero, solo eché un vistazo rápido xD

T

101

borisuco

#11 Te has quedado como Dios, ¿eh?

Usuarios habituales