Sunteți pe pagina 1din 50

Robert Espinoza Domnguez

Algoritmos de retroceso

Retroceso o Backtracking

El backtracking (o mtodo de retroceso o vuelta


atrs) es una tcnica general de resolucin de
problemas, aplicable en problemas de
optimizacin, juegos y otros tipos.

El backtracking realiza una bsqueda exhaustiva


y sistemtica en el espacio de soluciones. Por ello,
suele resultar muy ineficiente.

Retroceso o Backtracking

Se puede entender como opuesto a los


algoritmos voraces o de avance rpido.
Voraz:

aadir elementos a la solucin y no


deshacer ninguna decisin tomada.

Backtracking:

aadir y quitar todos los


elementos. Probar todas las combinaciones.

Caractersticas

Una solucin se puede expresar como una tupla:


(x1, x2, ..., xn), satisfaciendo unas restricciones
P(x1, x2, ..., xn) y tal vez optimizando cierta funcin
objetivo.
En cada momento, el algoritmo se encontrar en
cierto nivel k, con una solucin parcial (x1, ..., xk).
Si se puede aadir un nuevo elemento a la solucin
xk+1, se genera y se avanza al nivel k+1.
Si no, se prueban otros valores de xk.
Si no existe ningn valor posible por probar,
entonces se retrocede al nivel anterior k-1.

Caractersticas

Se sigue hasta que la solucin parcial sea una


solucin completa del problema, o hasta que no
queden ms posibilidades por probar.

El resultado es equivalente a hacer un recorrido


en profundidad en el rbol de soluciones. Sin
embargo este rbol es implcito, no se almacena
en ningn lugar.

Mtodo general.

Inicio

x1=0

x1=0
x2=0

x1=0
x2=0
x3=0

x1=1

x1=0
x2=1

x1=0
x2=0
x3=1

x1=0
x2=1
x3=0

x1=1
x2=0

x1=0
x2=1
x3=1

x1=1
x2=0
x3=0

x1=1
x2=1

x1=1
x2=0
x3=1

x1=1
x2=1
x3=0

x1=1
x2=1
x3=1

Caractersticas

Inicio

x1=0

x1=0
x2=0

x1=0
x2=0
x3=0

x1=1

x1=0
x2=1

x1=0
x2=0
x3=1

x1=0
x2=1
x3=0

x1=1
x2=0

x1=0
x2=1
x3=1

x1=1
x2=0
x3=0

x1=1
x2=1

x1=1
x2=0
x3=1

x1=1
x2=1
x3=0

x1=1
x2=1
x3=1

Caractersticas
Representacin simplificada del rbol.

x1
x2

2
0

x3

9
1

10
1

13

11

12

14

15

Ejemplo

Dado un conjunto de nmeros enteros


{13, 11, 7}, encontrar si existe algn
subconjunto cuya suma sea
exactamente 20.

Ejemplo Posibilidad 1
En cada nivel i decidir si el elemento i est o no en la
solucin. Representacin de la solucin: (x1, x2, x3),
donde xi = (0, 1).
rbol de
soluciones 1

(13)

k=2

(11)

k=3

(7)

10

13

11

12

14

15

11

k=1

18

13

20

24

31

Sumas
totales

Ejemplo Posibilidad 1

Cada nodo representa un paso del algoritmo, una


solucin parcial en cada momento dado.
El rbol indica un orden de ejecucin (recorrido en
profundidad) pero no se almacena en ningn lugar.
Una solucin es un nodo hoja con valor de suma 20.
Posible mejora: En cada nodo llevamos el valor de la
suma hasta ese punto. Si el valor es mayor que 20,
retroceder al nivel anterior

Ejemplo Posibilidad 2
En cada nivel i decidir qu elemento se aade (1, 2 3) en
la solucin. Representacin de la solucin: (s1, , s3),
donde m n y si {1, 2, 3}.
0

rbol de
soluciones 2

13

24
3

31

11

6
3

20

18

k=1

k=2
7

k=3

Ejemplo Posibilidad 2

Cada nodo es una posible solucin. Ser vlida si la


suma es 20.
El recorrido es tambin en profundidad.
Necesitamos funciones para generar los nodos, para
descartar nodos y para saber si un nodo es solucin
Cmo ser la eficiencia del algoritmo? Depende del
nmero de nodos.

rboles de retroceso (backtracking)

El rbol es simplemente una forma de


representar la ejecucin del algoritmo.
Es implcito, no almacenado (no
necesariamente).
El recorrido es en profundidad, normalmente de
izquierda a derecha.
La primera decisin para aplicar backtracking:
cmo es la forma del rbol?
Preguntas relacionadas: Qu significa cada
valor de la tupla solucin (x1, ..., xn)? Cmo es
la representacin de la solucin al problema?

5.1. rboles de retroceso (backtracking)

Tipos comunes de rboles de backtracking:


rboles

binarios.

rboles

n-arios.

rboles

permutacionales.

rboles

combinatorios.

rboles binarios
s= (x1, x2, ..., xn), con xi {0, 1}
x1

x2

5
1

Tipo de problemas: elegir ciertos elementos de entre un


conjunto, sin importar el orden de los elementos.
Problema de la mochila 0/1.
Encontrar un subconjunto de {12, 23, 1, 8, 33, 7, 22} que
sume exactamente 50.

rboles k-arios
s= (x1, x2, ..., xn), con xi {1,..,k}
1

x1

x2

2
6

10
3

2
8

11

12

Tipo de problemas: varias opciones para cada xi.


Problema del cambio de monedas.
Problema de las n reinas.

13

rboles permutacionales
s = (x1, x2, ..., xn), con xi {1,..,n} y xi xj
1
1

2
2

6
3

3
3

5
2

x1

7
3

11

9
1

12

14

2
10

x3

1
13

Tipo de problemas: los xi no se pueden repetir.


Generar todas las permutaciones de (1, ..., n).
Asignar n trabajos a n personas, asignacin uno-a-uno.

x2

15

rboles combinatorios
s= (x1, x2, ..., xm), con mn, xi {1,..,n} y xi < xi+1
1
1

2
2
3

6
3
5

x1
8

x2
7

3
4

x3

Tipo de problemas: los mismos que con rboles binarios


Binario: (0, 1, 0, 1, 0, 0, 1) Combinatorio: (2, 4, 7)

Mtodo general.

Cuestiones a resolver antes de programar:


Qu tipo de rbol es adecuado para el problema?

Cmo generar un recorrido segn ese rbol?

Cmo es la representacin de la solucin?


Cmo es la tupla solucin? Qu indica cada xi y qu valores
puede tomar?
Generar un nuevo nivel.
Generar los hermanos de un nivel.
Retroceder en el rbol.

Qu ramas se pueden descartar por no conducir a


soluciones del problema?

Poda por restricciones del problema.


Poda segn el criterio de la funcin objetivo.

Mtodo general
Mtodo Clase.Backtracking (var s: TuplaSolucin)
nivel 1
s sINICIAL
fin falso
Hacer
Generar (nivel, s)
Si Solucin (nivel, s) entonces
fin verdadero
Sino Si Criterio (nivel, s) entonces
nivel nivel + 1
Sino Mientras NO MasHermanos (nivel, s) hacer
Retroceder (nivel, s)
fMientras
fSi
fSi
Mientras fin = falso
fMetodo

Mtodo general

Variables:

s: Almacena la solucin parcial hasta cierto punto.


sINICIAL: Valor de inicializacin.
nivel: Indica el nivel actual en el que se encuentra el algoritmo.
fin: Valdr verdadero cuando hayamos encontrado alguna
solucin.

Funciones:

Generar (nivel, s): Genera el siguiente hermano (o el primero)


para el nivel actual.
Solucin (nivel, s): Comprueba si la tupla (s[1], ..., s[nivel]) es
una solucin vlida para el problema.

Mtodo general

Criterio (nivel, s): Comprueba si a partir de (s[1], ..., s[nivel])


se puede alcanzar una solucin vlida. En otro caso se
rechazarn todos los descendientes (poda).
MasHermanos (nivel, s): Devuelve verdadero si hay ms
hermanos del nodo actual que todava no han sido
generados.
Retroceder (nivel, s): Retrocede un nivel en el rbol de
soluciones. Disminuye en 1 el valor de nivel, y posiblemente
tendr que actualizar la solucin actual, quitando los
elementos retrocedidos.

Adems, suele ser comn utilizar variables temporales con


el valor actual (beneficio, peso, etc.) de la tupla solucin.

Mtodo general

Cmo seran estas funciones en los ejemplos anteriores?


Otros posibles casos de problemas:
1. No est garantizado que exista una solucin, puede existir
alguna o no.
2. Queremos obtener todas las soluciones, no slo una.
3. El problema es de optimizacin. De todas las soluciones
posibles queremos aquella que maximice (o minimice) una
funcin objetivo.

Anlisis de tiempos de ejecucin

Depende del nmero de nodos generados y del tiempo


requerido para cada nodo.
Por lo general el tiempo de cada nodo es constante.
Suponiendo que una solucin sea de la forma:
(x1, x2, , xn), en el peor caso se generarn todas las
posibles combinaciones para cada x1.
Si el nmero de posible de valores para cada xi es mi,
entonces se generan:
m1
m1 m2

m1 m2 mn

nodos en el nivel 1
nodos en el nivel 2
nodos en el nivel 3

Anlisis de tiempos de ejecucin

Ejemplo. Para el problema de la suma de


subconjuntos mi = 2. El nmero de nodos generados
es:
t(n) = 2 + 22 + 23 + + 2n = 2n-1 - 2
Ejemplo. Calcular todas las permutaciones de (1, 2,
, n). En el primer nivel tenemos n posibilidades, en el
segundo nivel (n-1), , en el nivel n una posibilidad.
t(n) = n + n(n-1) + n(n-1)(n-2) + + n! O(n!)
En general tendremos tiempos con rdenes de
complejidad factoriales o exponenciales.

Conclusiones

Backtracking: Recorrido exhaustivo y sistemtico en un


rbol de soluciones.
Pasos para aplicarlo:

Relativamente fcil disear algoritmos que encuentren


soluciones ptimas pero...

Decidir la forma del rbol.


Establecer el esquema del algoritmo.
Disear las funciones genricas del esquema.

Los algoritmos de backtracking son muy ineficientes.

Mejoras: mejorar los mecanismos de poda, incluir otros


tipos de recorridos (no solo en profundidad)
Tcnica de Ramificacin y Poda.

Ejemplo. Subconjuntos de suma dada

Subconjuntos de suma dada

Encontrar un subconjunto del


Conjunto T= {t1, t2, ..., tn} que
sume exactamente P.

Subconjuntos de suma dada

Variables:
Representacin de la solucin con un rbol binario.
s: array [1..n] de {-1, 0, 1}
s[i] = 0 el nmero i-simo no se utiliza
s[i] = 1 el nmero i-simo s se utiliza
s[i] = -1 valor de inicializacin (nmero i-simo
no estudiado)
sINICIAL: (-1, -1, ..., -1)
fin: Valdr verdadero cuando se haya encontrado
solucin.
tact: Suma acumulada hasta ahora (inicialmente 0).

Subconjuntos de suma dada


Funciones:

Generar (nivel, s)
s[nivel] s[nivel] + 1
si s[nivel] =1 entonces tact:= tact + tnivel

Solucin (nivel, s)
devolver (nivel = n) Y (tact = P)

Criterio (nivel, s)
devolver (nivel<n) Y (tactP)

MasHermanos (nivel, s)
devolver s[nivel] < 1

Subconjuntos de suma dada

Retroceder (nivel, s)
tact:= tact tnivel*s[nivel]
s[nivel]:= -1
nivel:= nivel 1

Subconjuntos de suma dada


Mtodo Clase.Backtracking (var s: TuplaSolucin)
nivel 1
s sINICIAL
fin falso
Hacer
Generar (nivel, s)
si Solucin (nivel, s) entonces
fin verdadero
sino si Criterio (nivel, s) entonces
nivel nivel + 1
sino
mientras NOT MasHermanos (nivel, s) hacer
Retroceder (nivel, s)
finsi
Mientras fin = falso
Fin Mtodo

Subconjuntos de suma dada


Variaciones del esquema general:
1) Y si no es seguro que exista una solucin?
2) Y si queremos almacenar todas las soluciones
(no slo una)?
3) Y si el problema es de optimizacin (maximizar o
minimizar)?

Subconjuntos de suma dada - Caso 1

Puede que no exista ninguna solucin.


Mtodo Clase.Backtracking (var s: TuplaSolucin)
nivel 1
s sINICIAL
fin falso
Para poder generar todo el
rbol de backtracking
Hacer
Generar (nivel, s)
si Solucin (nivel, s) entonces
fin true
sino si Criterio (nivel, s) entonces
nivel nivel + 1
sino
mientras NOT MasHermanos (nivel, s) Y (nivel > 0)
hacer Retroceder (nivel, s)
finsi
Mientras fin
= falso
Fin=
falso Y (nivel > 0)

Subconjuntos de suma dada - Caso 2

Queremos almacenar todas las soluciones.


Mtodo Clase.Backtracking (var s: TuplaSolucin)
nivel 1
En algunos problemas los nodos
intermedios pueden ser soluciones
s sINICIAL
O bien, retroceder despus de encontrar
fin falso
una solucin
Hacer
Generar (nivel, s)
si Solucin (nivel, s) entonces
Almacenar
(nivel, s)
fin
verdadero
si
Criterio
(nivel,(nivel,
s) entonces
sino
si Criterio
s) entonces
nivel nivel + 1
sino
mientras NOT MasHermanos (nivel, s) Y (nivel > 0)
hacer Retroceder (nivel, s)
finsi
nivel
>0
Mientras fin
= falso

Subconjuntos de suma dada - Caso 3

Problema de optimizacin (maximizacin).


Mtodo Clase.Backtracking (var s: TuplaSolucin)
nivel 1
voa: valor ptimo actual
s sINICIAL
soa: solucin ptima actual
fin
voafalso
-; soa
Hacer
Generar (nivel, s)
y Valor(s) > voa entonces
si Solucin (nivel, s) entonces
voa
Valor(s); soa s
fin verdadero
si
Criterio
(nivel,(nivel,
s) entonces
sino
si Criterio
s) entonces
nivel nivel + 1
sino
mientras NOT MasHermanos (nivel, s) Y (nivel>0)
hacer Retroceder (nivel, s)
finsi
Nivel
>0
Mientras fin
= falso

Problema de la mochila 0/1

Problema de la mochila 0/1

Los objetos no se pueden partir (se cogen enteros o


nada).
Datos del problema:
n: nmero de objetos disponibles.
M: capacidad de la mochila.
p = (p1, p2, ..., pn) pesos de los objetos.
b = (b1, b2, ..., bn) beneficios de los objetos.

Formulacin matemtica:

Maximizar xi bi sujeto a la restriccin xi pi M, y xi{0,1}


i=1..n

i=1..n

Problema de la mochila 0/1

Caractersticas del problema

Es un problema de optimizacin (maximizacin)


Slo nos interesa una solucin, la ptima
Existir al menos una solucin (no incluir ningn objeto)

Problema de la mochila 0/1

Ejemplo: n = 4; M = 7
b = (2, 3, 4, 5)
p = (1, 2, 3, 4)
4 kg
3 kg
2 kg

7 Kg.
PVP 5

PVP 4

PVP 3

1 kg PVP 2

Qu solucin devuelve el algoritmo voraz para el problema


de la mochila?
Qu solucin devuelve el algoritmo voraz adaptado al caso
0/1 (o se coge un objeto entero o no)?
Cul es la solucin ptima?

Problema de la mochila 0/1

Ejemplo: n = 2; M = 100
b = (2, 190)
p = (1, 100)
100 kg

100 Kg.

1 kg
PVP 2

PVP 190

Qu solucin devuelve el algoritmo voraz para el


problema de la mochila?
Qu solucin devuelve el algoritmo voraz adaptado al
caso 0/1 (o se coge un objeto entero o no)?
Cul es la solucin ptima?

Problema de la mochila 0/1.


Aplicacin de backtracking (proceso metdico):
1) Determinar cmo es la forma del rbol de
backtracking cmo es la representacin de la
solucin.
2) Elegir el esquema de algoritmo adecuado,
adaptndolo en caso necesario.
3) Disear las funciones genricas para la aplicacin
concreta: segn la forma del rbol y las
caractersticas del problema.
4) Posibles mejoras: usar variables locales con valores
acumulados, hacer ms podas del rbol, etc.

Problema de la mochila 0/1


1. Representacin de la solucin.
Con un rbol binario: s= (x1, x2, ..., xn), con xi {0,1}

xi = 0 No se coge el objeto i
xi = 1 S se coge el objeto i
xi = -1 Objeto i no estudiado
En cada nivel i se prueba
0
la posibilidad de incluir
2
o no el objeto i
0
1
Las soluciones
estn en nivel n
3
6
0
4

1
5

0
7

9
0

0
11

x2

10
1

x1

13
1
12

0
14

x3

15

Problema de la mochila 0/1


1. Representacin de la solucin.

Tambin es posible usar un rbol combinatorio:


s= (x1, x2, ..., xm), con m n, xi {1,..,n} y xi < xi+1

xi Nmero de objeto escogido


m Nmero total de objetos escogidos
Las soluciones estn en cualquier nivel

2
2
3

6
3
5

x1
8
x2

3
4

x3

Problema de la mochila 0/1


2. Elegir el esquema de algoritmo: caso optimizacin.
Mtodo Clase.Backtracking (var s: array [1..n] de entero)
nivel 1; s sINICIAL
pact: Peso actual
voa -; soa
bact: Beneficio actual
pact 0; bact 0
Hacer
Generar (nivel, s)
si Solucin (nivel, s) AND (bact > voa) entonces
voa bact; soa s
si Criterio (nivel, s) entonces
nivel nivel + 1
sino
mientras NOT MasHermanos (nivel, s) AND (nivel>0)
hacer Retroceder (nivel, s)
finsi
Mientras nivel > 0
Fin Mtodo

Problema de la mochila 0/1


3) Funciones genricas del esquema.

Generar (nivel, s) Probar primero 0 y luego 1


s[nivel] s[nivel] + 1
pact pact + p[nivel]*s[nivel]
bact bact + b[nivel]*s[nivel]

Solucin (nivel, s)

devolver (nivel =n) Y (pact M)

Criterio (nivel, s)

devolver (nivel < n) Y (pact M)

MasHermanos (nivel, s)
devolver s[nivel] < 1

Retroceder (nivel, s)
pact pact p[nivel]*s[nivel]
bact bact b[nivel]*s[nivel]
s[nivel] -1
nivel nivel 1

si s[nivel] = 1 entonces
pact pact + p[nivel]
bact bact + b[nivel]
finsi

Problema de la mochila 0/1

Ejemplo: n = 4; M = 7;
b = (2, 3, 4, 5)
2
p = (1, 2, 3, 4)
0

3
0
4

0 1
5

pact: 0 4
bact: 0 5

7
9

12

15

x1

1
17

10

18

19

1 0
16

9
12

20

x2

1
25
1

14

1 0
13

11

1 0

0
8

0
22

1 0
21

23

26

24

8
11

29

1 0
27

x3

0
28

7
10

1
30

x4

31

10
14

Problema de la mochila 0/1

El algoritmo resuelve el problema, encontrando


la solucin ptima pero es muy ineficiente.
Cunto es el orden de complejidad?
Nmero de nodos generados = 2n+1 1
El algoritmo es del orden O(2n)

Problema adicional: en el ejemplo, se


generan todos los nodos posibles, no hay
ninguna poda. La funcin Criterio es siempre
cierta (excepto para algunos nodos hoja).

Problema de la mochila 0/1

Solucin: Intentar eliminar algunos nodos del


rbol de soluciones con una funcin Criterio
ms restrictiva.

Incluir una poda segn el criterio de optimizacin.


Poda segn el criterio de peso: si el peso actual
es mayor que M podar el nodo.
Poda segn el criterio de optimizacin: si el
beneficio actual no puede mejorar el voa podar el
nodo.

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