Sei sulla pagina 1di 3

Universidad de Alcalá.

Departamento de Ciencias de la Computación


Algoritmia y Complejidad. Grado en Ingeniería en Informática

Bolas en cajas: Se tienen MaxBolas bolas indistinguibles y MaxCajas cajas vacías y se quiere
saber de qué formas distintas se pueden distribuir las MaxBolas bolas en las MaxCajas cajas (ver
figura de ejemplo). Diseñar un programa que resuelva este problema indicando el método de
programación y las estructuras de datos usadas. Ejemplo con MaxBolas = 2, MaxCajas = 3.
proc Backtracking(E/S sol: vector; E k: natural)
var caja: natural
Desde caja  1 hasta MaxCajas Hacer
sol[caja]  sol[caja]+1
si k=MaxBolas entonces Escribir(sol)
si no
si k<MaxBolas entonces
Backtracking(sol,k+1)
fsi
fsi
fdesde
fproc
La llamada inicial (del ejemplo) sería Backtracking([0, 0, 0], 1).

Corrupción entre hermanos:

Corrupción de padres a hijos:

Soluciones repetidas:

Jesús Lázaro García Pág. 1 / 3


Universidad de Alcalá. Departamento de Ciencias de la Computación
Algoritmia y Complejidad. Grado en Ingeniería en Informática

proc Bolas(E quedan: natural; E/S sol: vector; E actual: natural)


var caja: natural
si quedan=0 entonces Escribir(sol)
si no
Desde caja  actual hasta MaxCajas Hacer
sol[caja]  sol[caja]+1
Bolas(quedan-1, sol, caja)
sol[caja]  sol[caja]-1
fdesde
fsi
fproc
La llamada inicial será Bolas(MaxBolas, sol_vacía, 1).

El problema de la mochila: Se tienen N objetos no fraccionables, cada uno de los cuales cuenta con su peso y valor disponible en una serie de vectores
P[1..N], y V[1..N] La mochila tiene una capacidad máxima TopeMochila que impide que entren la totalidad de los objetos. Diseñar un algoritmo que
encuentre la selección de objetos que se meterán en la mochila para obtener el máximo beneficio.
proc Backtracking(E/S P,V,C: vector;
E/S sol,sol_opt: vector;
E obj_act: natural)
Si (obj_act > N) entonces
Si (PesoTotal(sol) ≤ TopeMochila) Y
(ValorTotal(sol) > ValorTotal(sol_opt)) entonces
sol_opt  sol
fsi
si no
sol[obj_act]  0
Mochila(P,V,C,sol,sol_opt,obj_act+1)
sol[obj_act]  1
Mochila(P,V,C,sol,sol_opt,obj_act+1)
fsi
fproc

Jesús Lázaro García Pág. 2 / 3


Universidad de Alcalá. Departamento de Ciencias de la Computación
Algoritmia y Complejidad. Grado en Ingeniería en Informática

En general, si el problema se amplía para que de cada objeto se tenga disponible una cantidad C[1..N] la cantidad de casos que hay que evaluar se dispara.
Necesitamos guardar la solución actual que estamos construyendo y la mejor solución encontrada (tanto vector como beneficio) y la capacidad actual que queda
en la mochila para evitar hacer cálculos extra.

proc Backtracking(E/S P,V,C: vector; proc Mochila(E/S P,V,C: vector;


E/S sol,sol_opt: vector; E/S sol,sol_opt: vector;
E obj_act: natural) E/S ben,ben_opt: natural;
E obj_act: natural; E cap_act: natural)
Si (obj_act > N) entonces
var cambios: boolean
Si (PesoTotal(sol) ≤ TopeMochila) Y
(ValorTotal(sol) > ValorTotal(sol_opt)) entonces cambios  F
sol_opt  sol Desde i  obj_act hasta N Hacer
fsi Si (P[i]≤cap_act) Y (C[i]>0) entonces
si no cambios  T
Desde i  0 hasta C[obj_act] Hacer C[i]  C[i]-1
sol[obj_act]  i sol[i]  sol[i]+1
Mochila(P,V,C,sol,sol_opt,obj_act+1)
ben  ben+V[i]
fdesde
Mochila(P,V,C,sol,sol_opt,
fsi
ben,ben_opt,i,cap_act-P[i])
fproc
C[i]  C[i]+1
sol[i]  sol[i]-1
Problemas:
Casos básicos: ben  ben-V[i]
fsi
fdesde
Si (NO cambios) entonces
Eficiencia: Si ben>ben_opt entonces
sol_opt  sol
ben_opt  ben
¿Corrupción?: fsi
fsi
fproc

Jesús Lázaro García Pág. 3 / 3

Potrebbero piacerti anche