Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
LABORATORIO
CURSO No. TEMA DURACIN ESTIMADA : : : : Algortmica III Laboratorio No.08 Programacin Dinmica 01:30 horas.
I.
OBJETIVOS El presente laboratorio tiene por objetivo: Desarrollar una aplicacin usando el mtodo de programacin dinmica. RESUMEN En esta prctica usted definir un proyecto completo en NetBeans con mltiples clases, en la cual se aplique el mtodo de programacin dinmica para la solucin del problema de la mochila. DEFINICIN DEL PROBLEMA Cree una aplicacin utilizando programacin dinmica para solucionar el problema de la mochila, que consiste en elegir de un grupo de objetos aquellos que maximicen el valor total que llevaremos en la mochila, suponiendo que cada objeto tiene un valor y un peso y no se pueden dividir, adems que la mochila tiene una capacidad mxima de peso que puede transportar. Tenemos N objetos de pesos p1, p2, p3, , pn y valores v1, v2, v3, , vn, adems e1, e2, e3, , en indica si se ha elegido el objeto (1) o no (0). La mochila tiene una capacidad de M Nuestro objetivo es maximizar
II.
III.
Con la restriccin
vi > 0, pi > 0 y ei {0, 1}, 1 i N Crearemos una tabla de tal manera que: , 0 1, , 1, 0, 0
Por ejemplo si tenemos cinco objetos: Objeto 1: Objeto 2: Objeto 3: Objeto 4: Objeto 5: peso = 1 peso = 2 peso = 5 peso = 6 peso = 7 valor = 1 valor = 6 valor = 18 valor = 22 valor = 28
Pg. 1
Algortmica III - Facultad de Ingeniera de Sistemas e Informtica Construiremos la tabla V de N objetos por 11 del peso mximo a transportar 0 1 2 3 4 5 0 0 1 2 3 4 5 6 7 8 9 10 11
0
1
0 0 0 0 0
0 1
6
0 1
7
1 1 1 1
6 6 6
7 7 7
0 1 7 7 7 7
0 1 7
18 18 18
0 1 7
19 22 22
0 1 7
24 24 28
0 1 7
25 28 29
0 1 7
25 29 34
0 1 7
25 29 35
0 1 7
25 40 40
El valor V(5, 11) = 40 el es valor mximo optimizado, y se han elegido los objetos 3 y 4. Crearemos una clase Objeto y una clase Mochila, luego crearemos una clase con la funcin main para probar nuestra aplicacin. IV. CONSTRUCCION DE LA APLICACIN
Pg. 2
Algortmica III - Facultad de Ingeniera de Sistemas e Informtica } public int getElegido() { return elegido; } }
V = new int[obj.length][capacidad+1]; E = new boolean[obj.length][capacidad+1]; for (i=0; i<=n; i++) { V[i][0]=0; E[i][0]= false; } for (j=0; j<=m; j++) { V[0][j] = 0; E[0][j] = false; } for (i=1; i<=n; i++) Robert Espinoza Domnguez Pg. 3
Algortmica III - Facultad de Ingeniera de Sistemas e Informtica { for (j=1; j<=m; j++) { if (j<obj[i].getPeso()) { V[i][j] = V[i-1][j]; E[i][j] = false; } else { if (V[i-1][j] > V[i-1][j-obj[i].getPeso()]+obj[i].getValor()) { V[i][j] = V[i-1][j]; E[i][j] = false; } else { V[i][j] = V[i-1][j-obj[i].getPeso()]+ obj[i].getValor(); E[i][j] = true; } } } } return V[n][m]; } public int max(int x, int y) { if (x>y) return x; else return y; } public void Componer() { int num; int elem = obj.length-1; int cap = capacidad; obj[0].setElegido(0); while (elem!=0 && cap !=0) { if (E[elem][cap]==true) { obj[elem].setElegido(1); cap = cap - obj[elem].getPeso(); } elem--; } } public int getV(int i, int j) { return V[i][j];
Pg. 4
Algortmica III - Facultad de Ingeniera de Sistemas e Informtica } public boolean getE(int i, int j) { return E[i][j]; } public int getValor(int i) { return obj[i].getValor(); } public int getPeso(int i) { return obj[i].getPeso(); } public int getElegido(int i) { return obj[i].getElegido(); } }
// Crea el objeto mochila Mochila miMochila = new Mochila(peso, valor, capacidad); //Calcula el valor mximo total de los objetos elegidos valorMaximo = miMochila.elegirObjetos(); System.out.printf("Valor mximo total = %d\n\n", valorMaximo); System.out.printf("Tabla de valores mximos\n"); System.out.printf("------------------------\n"); System.out.printf("\t |"); for (int j = 1; j<=capacidad; j++) System.out.printf("\t%d", j); System.out.println(); for (int j = 1; j<=capacidad; j++) System.out.print("-----"); System.out.println(); for (int i=1; i<=n; i++) { System.out.printf("\t%d|", i); Robert Espinoza Domnguez Pg. 5
Algortmica III - Facultad de Ingeniera de Sistemas e Informtica for (int j = 1; j<=capacidad; j++) System.out.printf("\t%d",miMochila.getV(i,j)); System.out.println(); } // Hallar la secuencia de objetos elegidos miMochila.Componer(); System.out.printf("\nObjetos elegidos\n"); System.out.printf("----------------\n\n"); for (int i = 1; i<=n; i++) if (miMochila.getElegido(i)==1) { System.out.printf("Objeto %d: \tPeso = %d, Valor = %d\n\n", i, miMochila.getPeso(i), miMochila.getValor(i)); } } } V. EJERCICIOS Crea una interfaz grfica que reemplace la clase PruebaMochila y prueba con los siguientes objetos: Objeto 1: Objeto 2: Objeto 3: Objeto 4: Objeto 5: Objeto 6: Objeto 7: Objeto 8: peso = 1 peso = 2 peso = 5 peso = 8 peso = 10 peso = 14 peso = 18 peso = 22 valor = 1 valor = 6 valor = 10 valor = 15 valor = 18 valor = 25 valor = 50 valor = 70
Capacidad de la mochila 60 Modifica la aplicacin para que el usuario ingrese los objetos y sus datos as como la capacidad de la mochila y devuelva el mximo valor optimizado y los objetos elegidos.
Pg. 6