Foros del Web » Programación para mayores de 30 ;) » Java »

Problema para formar subconjuntos en java utilizando algoritmo de Backtracking

Estas en el tema de Problema para formar subconjuntos en java utilizando algoritmo de Backtracking en el foro de Java en Foros del Web. Mi problema es el siguiente: Tengo un grupo de n cursos Cada curso tiene varias lineas horarias de dictado Se desea encontrar o saber la ...
  #1 (permalink)  
Antiguo 21/12/2010, 18:39
 
Fecha de Ingreso: diciembre-2010
Ubicación: Lambayeque, Perú
Mensajes: 7
Antigüedad: 14 años
Puntos: 1
Problema para formar subconjuntos en java utilizando algoritmo de Backtracking

Mi problema es el siguiente:
Tengo un grupo de n cursos
Cada curso tiene varias lineas horarias de dictado
Se desea encontrar o saber la forma de elegir un horario de tal forma que el alumno se inscriba en la mayor cantidad de cursos
Para ello se desea utilizar el algoritmo de backtracking
Para esto partimos del ejemplo básico:
Tenemos 3 cursos:curso1,curso2,curso3 con sus respectivas lineas horarias
curso1{'a','b','c'} curso1 tiene la linea horaria 'a', linea horaria 'b', linea horaria 'c'
curso2{'D','E'} curso2 tiene la linea horaria 'D', linea horaria 'E'
curso3{'1','2','3'} curso3 tiene la linea horaria '1', linea horaria '2', linea horaria '3'
se desea conseguir todas las combinaciones de los cursos para ello se sigue el siguiente algoritmo
0
// \\
// \\
// \\
// \\
curso1 V F
// \\ // \\
curso2 V F V F
// \\ // \\ // \\ // \\
V F V F V F V F
1 2 3 4 5 6 7 8

El algoritmo buscaria por profundidad llegaria primero al nodo 1(V,V,V) que implica {curso1,curso2,curso3}, luego ira al nodo2(V,V,F) que implica {curso1,curso2} y
asi sucesivamente. Para eso he utilizado el algoritmo que está en la pagina 187(Construir todos los subconjuntos) del link http://acm.uva.es/p/jorgeteran.pdf
La cuestion es al llegar al nodo 1 debe empezar otra ramificación para empezar la combinación de lineas horarias(Ahí es donde les solicito su ayuda).
Para el Nodo 1 se formaria un arbol que llegaria a 18 nodos los cuales serian en el orden siguiente:
{'a', 'D', '1'}
{'a', 'D', '2'}
{'a', 'D', '3'}
{'a', 'E', '1'}
{'a', 'E', '2'}
{'a', 'E', '3'}
{'b', 'D', '1'}
{'b', 'D', '2'}
{'b', 'D', '3'}
{'b', 'E', '1'}
{'b', 'E', '2'}
{'b', 'E', '3'}
{'c', 'D', '1'}
{'c', 'D', '2'}
{'c', 'D', '3'}
{'c', 'E', '1'}
{'c', 'E', '2'}
{'c', 'E', '3'}
Para el Nodo 2 como implica solo las lineas horarias de los cursos1 y curso2 sería
{'a', 'D'}
{'a', 'E'}
{'b', 'D'}
{'b', 'E'}
{'c', 'D'}
{'c', 'E'}

He acomodado la clase que se muestra en http://acm.uva.es/p/jorgeteran.pdf
de tal forma que está si muestra todos los nodos finales(combinaciones de lineas horarias que se puede formar con los cursos)
el problema es que no es en el orden correcto que se requiere. Ahi adjunto el código para ver quien me ayuda a q éste algoritmo siga el orden correcto que debe seguir.

public class SubconjuntosX {
List<Object[]> conjuntos;

public SubconjuntosX(List<Object[]> conjuntos) {
this.conjuntos = conjuntos;
Object[][] presente = new Object[conjuntos.size()][2];
for(int i = 0; i < conjuntos.size(); i++)
{
presente[i][0] = false;
presente[i][1] = new boolean[conjuntos.get(i).length];
}
// Inicialmente conjuntos esta todo en false
imprimeSubconjuntos(presente, 0);
}

private void procesarSolucion(Object[][] presente) {
// imprimir la solucion,
// conjuntos indica cuales imprimir
List<Object> subconjuntos = new ArrayList<Object>();
for (int i = 0; i < presente.length; i++)
{

if (Boolean.parseBoolean(presente[i][0].toString()))
{
boolean[] presente1 = (boolean[])presente[i][1];
for(int j = 0; j < presente1.length; j++)
{
if(presente1[j])
subconjuntos.add(conjuntos.get(i)[j]);
}
}
}
System.out.println(subconjuntos);
}

private void imprimeSubconjuntos(Object[][] presente,int posicionActual)
{
if(presente.length == posicionActual)
{
procesarSolucion(presente);
}
else
{
presente[posicionActual][0] = true;

// procesar una nueva solucion
for(int i = 0; i < conjuntos.get(posicionActual).length; i++)
{
boolean[] presente1 = new boolean[conjuntos.get(posicionActual).length];
presente1[i] = true;
presente[posicionActual][1] = presente1;

imprimeSubconjuntos(presente, posicionActual + 1);
}
// retornar (bactrack) al caso anterior
presente[posicionActual][0] = false;
// procesar una nueva solucion
imprimeSubconjuntos(presente, posicionActual + 1);
}
}
}

Y asi es como la llamo:
List<Object[]> conjunto = new ArrayList<Object[]>();
Object[] object1 = {'a','b','c'};
Object[] object2 = {'D','E'};
Object[] object3 = {'1','2','3'};
conjunto.add(object1);
conjunto.add(object2);
conjunto.add(object3);
SubconjuntosX subconjuntos = new SubconjuntosX(conjunto);
  #2 (permalink)  
Antiguo 21/12/2010, 22:15
 
Fecha de Ingreso: diciembre-2010
Ubicación: Lambayeque, Perú
Mensajes: 7
Antigüedad: 14 años
Puntos: 1
Respuesta: Problema para formar subconjuntos en java utilizando algoritmo de Backtrac

Ahora que lo veo la segunda parte de la ramificacion vendria hacer algo como el producto cartesiano de los conjuntos. Si alguien tiene un algoritmo por bactracking que realize producto cartesiano de n conjuntos. Se lo agredecería mucho
  #3 (permalink)  
Antiguo 22/12/2010, 09:20
 
Fecha de Ingreso: diciembre-2010
Ubicación: Lambayeque, Perú
Mensajes: 7
Antigüedad: 14 años
Puntos: 1
Respuesta: Problema para formar subconjuntos en java utilizando algoritmo de Backtrac

Después de pader un poco. Aquí esta la solución
package inputfile;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
/**
*
* @author Usuario
*/
public class SubconjuntosY {
List<Object[]> conjuntos;
boolean podar = false;
private HashMap<Integer,List<List<Object>>> hConjuntos = new HashMap<Integer,List<List<Object>>>();

public SubconjuntosY(List<Object[]> conjuntos) {
this.conjuntos = conjuntos;
Object[][] presente = new Object[conjuntos.size()][2];
for(int i = 0; i < conjuntos.size(); i++)
{
presente[i][0] = false;
presente[i][1] = new boolean[conjuntos.get(i).length];
}
// Inicialmente conjuntos esta todo en false
arbolPrincipal(presente, 0);
}

private void procesarSolucionPrincipal(Object[][] presente)
{
List<boolean[]> subconjuntos = new ArrayList<boolean[]>();
for (int i = 0; i < presente.length; i++)
{
if (Boolean.parseBoolean(presente[i][0].toString()))
{
//boolean[] presente1 = (boolean[])presente[i][1];
subconjuntos.add((boolean[])presente[i][1]);
}
}
if(subconjuntos.size() > 0)
this.arbolSecundario(presente, subconjuntos, 0);
}

private void arbolPrincipal(Object[][] presente,int posicionActual)
{
if(presente.length == posicionActual)
{
procesarSolucionPrincipal(presente);
//podar = true;
}
else
{
if(!podar)
{
presente[posicionActual][0] = true;
arbolPrincipal(presente, posicionActual + 1);
if(!podar)
{
presente[posicionActual][0] = false;
arbolPrincipal(presente, posicionActual + 1);
}
}
}
}

private void procesarSolucionSecundaria(Object[][] presente,List<boolean[]> subconjuntos)
{
List<Object> combinaciones = new ArrayList<Object>();
for(int i = 0; i < subconjuntos.size(); i++)
{
for(int j = 0; j < subconjuntos.get(i).length; j++)
{
if(subconjuntos.get(i)[j])
{
int k = -1;
for(int m = 0; m < presente.length; m++)
{
if(Boolean.parseBoolean(presente[m][0].toString()))
k++;
if(k == i)
{
combinaciones.add(conjuntos.get(m)[j]);
break;
}
}
break;
}
}
}
System.out.println(combinaciones);
}

private void arbolSecundario(Object[][] presente,List<boolean[]> subconjuntos,int posicionActual)
{
if(subconjuntos.size() == posicionActual)
{
procesarSolucionSecundaria(presente,subconjuntos);
}
else
{
for(int i = 0; i < subconjuntos.get(posicionActual).length; i++)
{
subconjuntos.set(posicionActual, new boolean[subconjuntos.get(posicionActual).length]);
subconjuntos.get(posicionActual)[i] = true;
arbolSecundario(presente,subconjuntos, posicionActual + 1);
}
}
}

public HashMap<Integer, List<List<Object>>> getHConjuntos() {
return hConjuntos;
}
}

Etiquetas: formar, algoritmos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:16.