Saludos indetectables! Hoy les traigo un source en Java que implementé en una práctica de la universidad. No voy a poner toda la práctica porque es muy extensa, y lo que realmente interesa es el algoritmo, que sirve para sacar soluciones haciendo todas las posibles combinaciones (fuerza bruta) que ya sabéis que se le puede dar buen uso. Cabe decir que estos algoritmos son matemáticamente muy eficientes y con una buena estructura de datos podremos abarcar millones de soluciones en poco tiempo.

Bueno la práctica consistía en.. dado un tablero (de un juego) tratar de buscar TODAS las posibles colocaciones que fueran solución y añadirlas en una lista. El algoritmo es recursivo, en el caso base comprueba que es solución y si no lo es.. mira si el siguiente "movimiento" de tablero, o lo que es lo mismo su lista de hijos en el árbol de soluciones, es solución.

Código: Seleccionar todo

	public void vueltaAtras(Tablero t) throws Exception{
		if(esSolucion(t)) {
			listaResultados.anyadeElem(t);
		}
		else{
			Lista<Tablero> listaCandidatos = candidatos(t); //heur. para obtener los movimientos candidato
			while(!listaCandidatos.esVacia()){
				Tablero hijo = listaCandidatos.damePrimero(); //separar el hijo de la lista
				listaCandidatos.eliminaPrimero();//eliminarlo de la lista de candidatos a comprobar
				vueltaAtras(hijo);//caso recursivo.. comprobar la lista de candidatos del hijo
			}
		}
	}
Lo que nos piden en el examen (que tengo dentro de 3 horas aprox.) es que en el árbol de soluciones.. cuando encuentre una solución pare y saque directamente esa solución sin seguir mirando soluciones

Código: Seleccionar todo

	public Tablero vueltaAtras(Tablero t) throws Exception{
                    //ahora devuelve un tablero solucion (si no devuelve null)
		if(esSolucion(t)) {
			return t;
		}
		else{ Tablero_Soluc = null;
			bool encontrado = false;
                        Lista<Tablero> listaCandidatos = candidatos(t);
			while((! encontrado)&&(! listaCandidatos.esVacia()){
				Tablero hijo = listaCandidatos.damePrimero(); 
				listaCandidatos.eliminaPrimero();
				Tablero_Soluc = vueltaAtras(hijo);
                                if(Tablero_Soluc != null) encontrado = true; 
			}
                        return Tablero_Soluc;
		}
	}
Estos algoritmos son una forma de comprobar todas las posibles soluciones (siempre que sean soluciones finitas, no infinitas) sin saber exactamente cuál es el tamaño de nuestros datos.

Bueno espero que os guste :)
un saludo! R-007
Responder

Volver a “Otros lenguajes”