Sunteți pe pagina 1din 4

Facultad de Ingeniería de Sistemas e Informática

LABORATORIO
CURSO : Algorítmica III
No. : Laboratorio No.09
TEMA : Algoritmos de Retroceso - Backtracking.
DURACIÓN ESTIMADA : 01:20 horas.

I. OBJETIVOS
El presente laboratorio tiene por objetivo:
 Desarrollar una aplicación para implementar el método de algoritmos de retroceso.

II. RESUMEN
En esta práctica usted definirá un proyecto completo en NetBeans con múltiples clases, en
la cual se implemente el método de algoritmos voraces para la solución del problema de
cambio.

III. DEFINICIÓN DEL PROBLEMA

Dado el siguiente conjunto de valores {12, 23, 1, 8, 33, 7, 22}. Cree una aplicación utilizando
algoritmos de retroceso para hallar un subconjunto que sume exactamente 50.

IV. CONSTRUCCION DE LA APLICACIÓN

Crea la clase Backtracking

package bactracking;

import javax.swing.JOptionPane;

public class Backtracking {

private int s[];


private int v[];
private int tact;
private int p;

public Backtracking (int valores[], int suma){

v = new int [valores.length];

respinozad@unmsm.edu.pe Pág. 1
Facultad de Ingeniería de Sistemas e Informática
s = new int [valores.length];

v = valores;
tact = 0;
p = suma;

public void hallarSubconjunto(){

int nivel = 0;
boolean fin = false;

//Inicializa arreglo solucion s


for (int i=0; i<s.length; i++)
s[i]=-1;

do{
generar (nivel);
if (solucion(nivel, p))
fin = true;
else
if (criterio (nivel, p))
nivel++;
else
while (!masHermanos(nivel))
nivel = retroceder (nivel);
}while (fin ==false);

public void generar (int nivel){


s[nivel] = s[nivel] + 1;
if (s[nivel] == 1)
tact= tact + v[nivel];
}

public boolean solucion (int nivel, int p){


int n = s.length;
return (nivel == n-1 && tact == p);
}

public boolean criterio (int nivel, int p){


int n = s.length;
return (nivel < n-1 && tact <= p);
}

public boolean masHermanos (int nivel){


return (s[nivel] < 1);
}

public int retroceder(int nivel){


tact -= v[nivel]*s[nivel];
s[nivel]= -1;
nivel--;
return nivel;
}

respinozad@unmsm.edu.pe Pág. 2
Facultad de Ingeniería de Sistemas e Informática
public void mostrarSolucion(){

String mensaje="";

mensaje = "Valores:\n {";

for (int i=0; i<v.length; i++)


{
mensaje += v[i];
if (i<v.length-1)
mensaje += ", ";
else
mensaje += "}";
}

mensaje += "\n\nSolución Backtracking:\n {";

for (int i=0; i<s.length; i++)


{
mensaje += s[i];
if (i<s.length-1)
mensaje += ", ";
else
mensaje += "}";
}

mensaje += "\n\nSubconjunto cuya suma es "+ p + ":\n {";

for (int i=0; i<s.length; i++)


{
if (s[i]==1){
mensaje += v[i];
if (i<s.length-1)
mensaje += ", ";
else
mensaje += "}\n";
}
}
JOptionPane.showMessageDialog(null, mensaje,
"Algoritmos de retroceso (Backtracking)",
JOptionPane.INFORMATION_MESSAGE);

}
}

Crea la clase PruebaBactracking

package bactracking;

public class PruebaBacktracking {

public static void main(String[] args) {

int valores[] = {12, 23, 1, 8, 33, 7, 22};


int suma = 50;

respinozad@unmsm.edu.pe Pág. 3
Facultad de Ingeniería de Sistemas e Informática
Backtracking sumaDada = new Backtracking(valores, suma);

sumaDada.hallarSubconjunto();

sumaDada.mostrarSolucion();

}
}

V. EJERCICIOS
 Modifica la aplicación para que muestre todas las soluciones que sumen
exactamente un valor dado y un mensaje en caso no encuentre ningún subconjunto.

respinozad@unmsm.edu.pe Pág. 4

S-ar putea să vă placă și