lunes 15 de diciembre de 2008

Generación de Combinaciones

Generación de Combinaciones
[Generación de combinaciones en .NET]


Introducción
El uso de combinaciones es un tema muy utilizado en la probabilidad y en los juegos de azar como la lotería, sin embargo la generación de estas combinaciones puede ser un tema difícil de entender y aplicar.


Combinaciones

Las combinaciones son un arreglo de objetos sin importar el orden, es decir, si un arreglo ya salio no puede volver a salir en cualquier otro orden. Las combinaciones se definen de un conjunto de N elementos tomados de r en r. Aquí la formula general.


C(N,r) = N! / (N-r)! r!


Este teorema también puede establecerse como sigue:

El número de subconjuntos diferentes de r elementos cada uno, que puede formarse a partir de un conjunto de N elementos.



Ejemplo:

Tenemos 9 envases decorados diferentes y solo 6 posiciones para acomodarlos, los envases deberán ser tomados de 6 en 6. Cuantos paquetes de 6 diferentes envases podremos formar.


El código:

Aquí una función recursiva que genera todas las posibles combinaciones.

Código en C#:

///
/// Funcion recursiva que genera combinaciones de números de N en r
///

/// Inicialmente se debe de pasar 1 y este automaticamente se va incrementando"
/// Es el numero de elementos del Universo"
/// Es el numero de elementos del grupo"
/// Se utiliza para ir calculando en que numero de elemento vamos"
/// Arreglo que contiene la colección de elementos de la combinación"
/// Variable de texto donde se van mostrando las posibles combinaciones"
void Ciclo(int t, int N, int r, int x, ref int[] Elem, ref string strTex)
{

// Se repite hasta que t sea mayor que el número de formas posibles
while (t <= (N - (r - x))) { // Se generaran r ciclos recursivos if (r > x)
{
Elem[x-1] = t;
Ciclo((t + 1), N, r, (x + 1), ref Elem, ref strTex);
}
else
{
Elem[x-1] = t;

// Concatenamos la combinación
for (int i = 0; i < x; i++)
{
strTex += Elem[i].ToString("[#,##0]");
}
strTex += "\r\n";
}
t++;
}
}


Forma en que se manda a llamar la función.
Código en C#:

// Declaramos variables
int N = 9; // Nueve envases
int r = 6; // Seis espacios
int[] Elem = new int[r]; // Vector de la Combinación
string strTex = "";

// Iniciamos llamada recursiva a la función.
Ciclo(1, N, r, 1, ref Elem, ref strTex);

// Mostrar resultado en una caja de texto
txtCombina.Text = strTex;

0 comentarios:

Publicar un comentario en la entrada

Gracias por tus comentarios