Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Caso de estudio: sea un conjunto de números, obtener un subconjunto cuya suma sea
exactamente un valor. Por ejemplo, sea (13, 11, 7) y el valor a obtener 20, la solución es el
subconjunto que suma ese valor es (13, 7).
2/11
Generación de las soluciones candidatas
El módulo itertools ofrece funciones para generar permutaciones y combinaciones de
elementos:
3/11
Generación de las soluciones candidatas
Cálculo del conjunto potencia (todos los subconjuntos):
def powerset(elementos):
"powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)"
s = list(elementos)
return chain.from_iterable(combinations(s, r) for r in range(len(s)+1))
4/11
Resolución del problema
Analizamos cómo aplicar la búsqueda exhaustiva al problema de la suma de los números
haciendo uso de de las funciones que proporciona el módulo itertools y la función powerset.
return solucion
5/11
Resolución del problema
Probamos la función suma_numeros con los datos del caso de estudio:
Ejercicio: adapta la función que resuelve el problema anterior para que retorne todas las
soluciones que cumplan la condición.
6/11
Suma números - optimización
La técnica de búsqueda exhaustiva también se aplica a la resolución de problemas de
optimización: maximizar un bene cio o reducir un coste.
· Sea un conjunto de números, obtener un subconjunto cuya suma sea exactamente un valor
y tenga el menor tamaño (criterio).
· Por ejemplo, sea el conjunto de números (13, 11, 7, 18) y la suma a obtener 18, los
subconjuntos que suman ese valor son (11, 7) y (18).
· La solución al problema sería (18), puesto que tiene menor tamaño.
7/11
Resolución del problema de optimización
A continuación analizamos cómo aplicar la búsqueda exhaustiva a un problema de
optimización.
· voa: valor de la solución óptima actual. Representa el valor de soa de acuerdo al criterio
jado en el problema. En este problema es el tamaño del conjunto de números de soa.
- Inicialmente toma como valor una cota, superior (problemas de minimización) o inferior
(problemas de maximización).
- El valor inicial de voa es inicialmente peor que la valoración de cualquier solución
candidata.
8/11
Resolución del problema de optimización
def suma_numeros_optimizacion(numeros, suma_objetivo):
soa = []
voa = 1 + len(numeros) # Todas las soluciones candidatas tendrán un tamaño menor
for candidata in powerset(numeros):
suma = 0
for numero in candidata:
suma = suma + numero
if suma == suma_objetivo and len(candidata) < voa: # ¿es solución y es mejor que soa?
soa = candidata
voa = len(candidata)
return soa
Prueba:
9/11
Resolución del problema de optimización
¿Qué sucede si llamamos a la función buscando la suma objetivo de 19?
10/11
Conclusiones
El esquema algorítmico búsqueda exhaustiva está basado en analizar todas las soluciones
candidatas a un problema.
Existen variaciones más inteligentes del esquema, como, por ejemplo, backtracking, capaces de
eliminar conjuntos de soluciones candidatas que no van a ser soluciones al problema.
11/11