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

Ramifica y Poda

Estas en el tema de Ramifica y Poda en el foro de Java en Foros del Web. Hola buenas, Tengo un algoritmo al que le cargas una lista de canciones con una valoracion y una duracion y pides al usuario que te ...
  #1 (permalink)  
Antiguo 07/05/2015, 15:23
Avatar de DCienfuegos  
Fecha de Ingreso: febrero-2009
Ubicación: Asturias
Mensajes: 195
Antigüedad: 15 años, 9 meses
Puntos: 3
Ramifica y Poda

Hola buenas,

Tengo un algoritmo al que le cargas una lista de canciones con una valoracion y una duracion y pides al usuario que te diga un numero de minutos y que el algoritmo lo que haga sea añadir a dos listas las mejores opciones en vase a la valoracion y el tiempo.

Lo tengo en backtracking hecho funcionando a la perfección pero al hacerlo ahora con Ramifica y Poda soy incapaz a que funcione.

Así a simple vista a alguien se le ocurre algo? Sera problema del heuristico?

Gracias.
PD. si alguien se ve super generoso y quiere ver el proyecto entero se lo envio

Código:
package alg32889855.p7;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class NodoCancion extends Nodo{

	
	
	
	private static List <Cancion> A = new ArrayList <Cancion>();
	private static List <Cancion> B = new ArrayList <Cancion>();
	private Integer tiempo;
	private boolean[] cancionesUsadas;
	private static List<Cancion> cancionesLeidas=new ArrayList<Cancion>();
	
	public static  List<Cancion> canciones = new ArrayList<Cancion>();
	public NodoCancion(Nodo padre,Integer tiempo,List<Cancion>A,List<Cancion> B,List<Cancion>canciones,boolean[] cancionesUsadas,List<Cancion> cancionesLeidas){
		this.profundidad=padre.profundidad;
		this.idPadre=padre.hashCode();
		this.tiempo=tiempo;
		this.cancionesUsadas=cancionesUsadas;
		this.A=A;
		this.B=B;
		this.canciones=canciones;
		for(int i=0;i<3;i++){
			// 
			if(i==1 && (getDuracion(A) + canciones.get(profundidad).getDuracion()) < tiempo){
				A.add(canciones.get(profundidad));
				cancionesLeidas.add(canciones.get(profundidad));
				cancionesUsadas[profundidad]=true;
			}
			if(i==2 && (getDuracion(B) + canciones.get(profundidad).getDuracion()) < tiempo){
				B.add(canciones.get(profundidad));
				cancionesLeidas.add(canciones.get(profundidad));
				cancionesUsadas[profundidad]=true;
			}
		}
		calcularValorHeuristico();
		profundidad++;
	}
	public NodoCancion(List<Cancion>A,List<Cancion> B,List<Cancion>canciones,Integer tiempo){
		this.A=A;
		this.B=B;
		this.canciones=canciones;
		this.tiempo=tiempo;
		this.cancionesUsadas=new boolean[canciones.size()];
		profundidad++;
	}
	
	

	@Override
	public void calcularValorHeuristico() {
		// TODO Auto-generated method stub
		int value=0;
		for(int i=0;i<=profundidad;i++){
			if(cancionesUsadas[i]){
				value+=cancionesLeidas.get(i).getValoracion();
			}
		}
		valorHeuristico=value;
		
	}
	@Override
	public ArrayList<Nodo> expandir(){
		ArrayList<Nodo> hijos = new ArrayList<Nodo>();
		for(int i=0;i<canciones.size();i++){
			if(!cancionesUsadas[i]){
				hijos.add(new NodoCancion(this,tiempo,A,B,canciones,cancionesUsadas,cancionesLeidas));
			}
		}
		
		return hijos;
	}
		
	
	public int getPuntuacion (List <Cancion> canciones){
		
		int contador = 0;
		for (int i=0; i<canciones.size(); i++){
			contador+=canciones.get(i).getValoracion();
		}
		return contador;	
	}
	
	public int getDuracion (List <Cancion> canciones){
		
		int contador = 0;
		for (int i=0; i<canciones.size(); i++){
			contador+=canciones.get(i).getDuracion();
		}
		return contador;	
	}
	public void imprimir(List<Cancion> canciones){
		for(int i=0; i<canciones.size();i++){
			System.out.println(canciones.get(i));
		}
	}

	@Override
	public boolean solucion() {
		if(profundidad==canciones.size()){
		System.out.println("Lista 1:\n");
		imprimir(A);
		System.out.println("Lista 2:\n");
		imprimir(B);
		return true;
		}
		else{
			return false;
		}
	}
	@Override
	public int valorInicialPoda() {
		// TODO Auto-generated method stub
		Integer puntuacion=getPuntuacion(canciones);
		Integer tiempo=getDuracion(canciones);
		return puntuacion/tiempo;
	}
	

}

Etiquetas: arraylist, valor
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 21:08.