252
TÉCNICAS DE DISEÑO DE ALGORITMOS
DosSubconjuntos(k+1) ELSIF suma[1]=suma[2] THEN ComunicarSolucion; END; suma[j]:=suma[j]-numeros[k] (* cancelar anotacion *) END END DosSubconjuntos;
En este problema podemos también definir una restricción en forma de cota que permita realizar la poda de aquellos nodos del árbol de expansión que sepamos que no conducen a una solución. La idea consiste en sumar al principio todos los elementos del conjunto, que en cualquier caso hemos de hacer para ver si es un número par. Con esta suma, que almacenaremos en la variable global sumatotal, podemos dejar de explorar aquellos nodos del árbol de expansión que verifiquen que la suma de uno de los dos subconjuntos que están construyendo sea mayor que la mitad de la suma total: PROCEDURE DosSubconjuntos2(k:CARDINAL); VAR j:CARDINAL; BEGIN FOR j:=1 TO 2 DO X[k]:=j; suma[j]:=suma[j]+numeros[k]; IF suma[j]<=(sumatotal DIV 2) THEN (* poda *) IF k<n THEN DosSubconjuntos2(k+1) ELSIF suma[1]=suma[2] THEN ComunicarSolucion; END END; suma[j]:=suma[j]-numeros[k] (* cancelar anotacion *) END END DosSubconjuntos2;
De esta forma conseguimos incrementar las restricciones del problema, lo que contribuye a una menor expansión del número de nodos y por tanto a una mayor eficiencia del algoritmo resultante.
6.17 LAS MÚLTIPLES MOCHILAS (0,1) Dados n elementos, cada uno con un beneficio bi y un peso pi asociado (1≤i≤n), y m mochilas, cada una con una capacidad kj (1≤j≤m), el problema de las Múltiples Mochilas (0,1) puede describirse como la asignación de los elementos a las mochilas de forma que se maximice el beneficio total de todos los elementos asignados sin superar la capacidad de las mochilas, y teniendo en cuenta que cada elemento puede ser asignado a una mochila o a ninguna, y que un elemento aportará beneficio sólo si éste es introducido en una mochila.