Está en la página 1de 17

TEMA 6

VUELTA ATRÁS

Departamento de Lenguajes y Sistemas Informáticos

UNIVERSIDAD DE ALICANTE
1

VUELTA ATRÁS (Backtracking)


EJEMPLO INTRODUCTORIO (1)

„ El Problema de la Mochila (general). Sean n objetos con valores


vi y pesos pi y una mochila con capacidad máxima de transporte de
un peso P. Seleccionar un conjunto de objetos de forma que:
… no sobrepase el peso P (restricción)
… el valor transportado sea máximo (función objetivo)

„ ¿Cómo obtener la solución óptima?


… Programación dinámica: Objetos no fragmentables y pesos discretos.
… Algoritmos Voraces: Objetos fragmentables

„ ¿Cómo lo resolvemos si no podemos fragmentar los objetos y


los pesos son valores reales?

1
VUELTA ATRÁS
EJEMPLO INTRODUCTORIO (2)

„ El Problema de la Mochila (general). Sean n objetos con valores


vi y pesos pi y una mochila con capacidad máxima de transporte de
un peso P. Seleccionar un conjunto de objetos de forma que:
… no sobrepase el peso P (restricción)
… el valor transportado sea máximo (función objetivo)

„ ¿Cómo obtener la solución óptima?


… Programación dinámica: Objetos no fragmentables y pesos discretos.
… Algoritmos Voraces: Objetos fragmentables

„ ¿Cómo lo resolvemos si no podemos fragmentar los objetos y


los pesos son valores reales?
… Generar todas las combinaciones posibles (espacio de soluciones)
… Seleccionar las que cumplen las restricciones (soluciones factibles)
… Elegir aquella que maximiza la función objetivo (solución óptima)
3

VUELTA ATRÁS
EJEMPLO INTRODUCTORIO (3)

„ Tipificación del problema:

… Solución = X =< x1 , x2 , …, xn > xi ∈ \

… Restricciones:
⎧ xi = 0 no se selecciona el objeto i
„ Implícitas xi ∈ {0,1} ⎨
⎩ xi = 1 se selecciona el objeto i completo
n
„ Explícitas ∑x p
i =1
i i ≤P

n
… Función objetivo: Max ∑ xi vi (valor transportado)
i =1

2
VUELTA ATRÁS
EJEMPLO INTRODUCTORIO (4)

„ Combinaciones posibles ⎧ P = 16

… Supongamos el siguiente ejemplo: ⎨ ⎧ p = (7,8, 2)
⎪n = 3 ⎨
⎩ ⎩v = (49, 40, 20)
… Espacio de soluciones:

SOLUCIÓN PESO VALOR


(0,0,0) 0 0 Soluciones
(0,0,1) 2 20 factibles
(0,1,0) 8 40
(0,1,1) 10 60
(1,0,0) 7 49
Solución
(1,0,1) 8 69 OPTIMA
(1,1,0) 15 89
Solución NO
(1,1,1) 17 109
factible
5

VUELTA ATRÁS
EJEMPLO INTRODUCTORIO (5)

„ Generación de todas las combinaciones

… Ejemplo n=3: < x1 , x2 , x3 > / xi ∈ {0,1}

??? funcion GENERA (n,k:ent;)


x:vector[{0,1}])
0?? 1??

para j ∈{0,1} hacer


xk = j
00? 01? 10? 11?
opcion
(k=n):Imprimir(x);
(k<n):GENERA (n,k+1,x);
fopcion
000 001 010 011 100 101 110 111
fpara
fin

3
VUELTA ATRÁS
EJEMPLO INTRODUCTORIO (6)

„ Generación de las soluciones factibles


funcion MOCHILA (v,p:vector[real];P:real;n,k:entero;
x:vector[{0,1}])
para j ∈{0,1} hacer
xk = j
si (Σ(k)xipi≤P)
opcion
(k=n) : Imprimir(x);
(k<n) : MOCHILA(v,p,P,n,k+1,x);
fopcion
finsi
fpara
fin

„ Complejidad: n

… Caso peor: ∑x p
i =1
i i ≤ P f (n) = 2· f (n − 1) + n ∈ Ο(2n )

… Caso mejor ∀i, pi > P f (n) ∈ Ω(n 2 ) 7

VUELTA ATRÁS
EJEMPLO INTRODUCTORIO (7)

„ Búsqueda de la solución óptima


funcion MOCHILA (v,p:vector[real]; P,v_mejor:real;
n,k:entero;x,x_mejor:vector[{0,1}])
para j ∈{0,1} hacer
xk = j
si (Σ(k)xipi≤P)
opcion
(k=n) : si valor(x)>v_mejor entonces
x_mejor=x;
v_mejor=valor(x);
finsi

(k<n) : MOCHILA(v,p,P,v_mejor,n,k+1,x,x_mejor);
fopcion
finsi
fpara
fin
8

4
VUELTA ATRÁS
DEFINICIÓN Y ÁMBITO DE APLICACIÓN

„ Algunos problemas sólo podemos resolverlos mediante la obtención y


estudio exhaustivo del conjunto de posibles soluciones al problema.

„ De entre todas ellas, se podrá seleccionar un subconjunto o bien, aquella


que consideremos la mejor (la solución óptima)

„ Para llevar a cabo el estudio exhaustivo Vuelta atrás proporciona una forma
sistemática de generar todas las posibles soluciones a un problema.

„ Generalmente se emplea en la resolución de problemas de selección /


optimización en los que el conjunto de soluciones posibles es finito.

„ En los que se pretende encontrar una o varias soluciones que sean:


… Factibles: que satisfagan unas restricciones y/o
… Óptimas: optimicen una cierta función objetivo
9

VUELTA ATRÁS
CARACTERÍSTICAS

„ La solución debe poder expresarse mediante una tupla de decisiones


< x1 , x2 , .... , xn > donde xi ∈ Di
„ Las decisiones pueden pertenecer a dominios diferentes pero estos
dominios siempre serán discretos.
„ Se generan y estudian todas las posibles soluciones
„ La estrategia siempre proporciona
… Todas las soluciones factibles
… La solución óptima al problema
… Pero... con una complejidad elevada (2n, n!, nn)

10

5
VUELTA ATRÁS
CARACTERÍSTICAS

„ La generación y búsqueda de la solución se realiza mediante un


sistema de prueba y error:
„ Sea < x1 , x2 , ...., xi-1 , ..., > una tupla por completar.
„ Decidimos sobre xi
… Si Cumple restricciones: se añade xi a la solución y se pasa a xi+1
… Si no cumple restricciones: se prueba otra posibilidad para xi
… Si No cumple restricciones y no hay más posibilidades con xi : se
replantea la decisión anterior xi-1
„ La generación y búsqueda se realiza utilizando una imaginaria
estructura de árbol sobre la que se realiza un recorrido en preorden.

11

VUELTA ATRÁS
ESQUEMA RECURSIVO

BACKTRACKING (DP:datos_problema; k:entero; var x:tupla)


comienzo
Pk = {j : j ∈ Dk} (Posibles valores xk)
mientras (Pk ≠ ∅) (comprobar todos los valores para xk)
xk = elemento(Pk) (selección de valor para xk)
si factible(x)
opcion
solucion(x): tratar(x) (Todas,la mejor,etc)
¬ solucion(x): BACKTRACKING(D,k+1,x)
fopcion
finsi
Pk = Pk – {xk}
fmientras
fin

12

6
VUELTA ATRÁS
BACKTRACKING VS. GREEDY

GREEDY BACKTRACKING
„ Los dominios son continuos „ Los dominios no son continuos
„ Buscamos la solución óptima y „ Buscamos todas las soluciones
existe un criterio de decisión voraz factibles o todas las soluciones
que nos conduce a ella. óptimas
„ Buscamos una aproximación a la „ Buscamos una solución óptima y el
solución óptima. problema no tiene solución voraz.

13

VUELTA ATRÁS
EJERCICIOS

EJERCICIOS OBLIGATORIOS
… El Viajante de Comercio (ciclos hamiltonianos)
… Problema de las n reinas
… El laberinto

OTROS EJERCICIOS
… Transformación de un número
… Permutaciones
… El coloreado de grafos (coloreado de mapas)
… La empresa naviera
… El reparto de paquetes
… La asignación de turnos

14

7
Ejercicios
PROBLEMA DEL VIAJANTE DE COMERCIO: Solución VORAZ

„ En un grafo no dirigido y completo encontrar un


ciclo hamiltoniano de mínimo coste, es decir, pasar
por todos los vértices una sola vez y regresar al de
partida de forma que el coste final sea mínimo.

„ Tipificación del problema:


… Secuencia de aristas que expresan el recorrido
„ < ( x1 , x2 ), ( x2 , x3 ), …, ( xn−1 , xn ), ( xn , x1 ) >
… Función objetivo: Minimizar el coste de la solución
⎡ n−1 ⎤
„ Min ⎢∑ peso( xi , xi +1 ) + peso( xn , x1 ) ⎥
⎣ i =1 ⎦
… Restricciones:
„ xi ∈ V 1≤ i ≤ n
„ No existen nodos de grado 3
„ No se forman bucles o ciclos excepto al final 15

Ejercicios
PROBLEMA DEL VIAJANTE DE COMERCIO: Solución voraz

funcion VIAJANTE_GREEDY (A:aristas;n:N): cjto_aristas


var y, solución: cjto_aristas;
decisión: arista;
comienzo
solución=∅;
y=ORDENA_PESOS_CRECIENTE(A);
mientras |y|>0 ∧ |solución|≠n hacer
decisión=primero(y);
si (¬∃_vértices_grado3(solución,decisión)) ∧
(¬∃_bucles(solución,decisión) ∨ |solución|=n-1) entonces
solución=AÑADIR(solución,decisión);
fsi
y=ELIMINAR_PRIMERO(y);
fmientras
si (|solución|=n) entonces
devuelve(solución);
si_no
devuelve(∅); /* No hay solución */
fsi
fin

16

8
Ejercicios
PROBLEMA DEL VIAJANTE DE COMERCIO: Solución voraz

„ Criterio de selección: Tomar las aristas de menor peso.


„ Inconveniente: No proporciona la solución óptima, pero
sí una aproximada con coste razonable.
„ Complejidad Ο(n3)
… En función de:
„ n = número de nodos
„ n2 = número de aristas
… ORDENA_PESOS_CRECIENTES → Ο(n2logn2)
… bucle mientras → Ο(n3)
„ Ο(n2) (en el caso peor, comprobar todas las aristas)
„ ∃_vértices_grado3 → Ο(n) (analizar el grado de cada vertice)
„ ∃_bucles → Ο(n) (Recorrer la solución y ver si hay bucles)

17

Ejercicios
PROBLEMA DEL VIAJANTE DE COMERCIO: Solución VUELTA ATRAS

„ Tipificación del problema:


… Secuencia de vértices visitados < x1 , x2 , …, xn >
„ Fijamos el 1 como primer vértice < 1, x2 , …, xn > xi ∈ [2,n]

… Función objetivo: Minimizar el peso total asociado a x

… Restricciones:
„ No podemos pasar dos veces por el mismo vértice, es decir, hay que
comprobar que no hay elementos repetidos:
i ≠ j ⇒ xi ≠ x j 1 ≤ i ≤ n 1 ≤ j ≤ n
„ Debe existir arista entre un vértice y el siguiente:

peso( xi , xi +1 ) ≠ ∞ 1 ≤ i ≤ n -1
„ Debe existir un camino de vuelta al principio:

peso( xn , x1 ) ≠ ∞
18

9
Ejercicios
PROBLEMA DEL VIAJANTE DE COMERCIO: Solución vuelta atrás

/* Inicialización y llamada inicial */


v_mejor=∞;
X[1]=1; // Partimos del vértice 1
VIAJANTE_BT(G,num_vertices(G),2, v_mejor,x, x_mejor);

/* Función */
funcion VIAJANTE_BT (G:grafo;n,k,v_mejor:entero;x,x_mejor:vector[ent]))
comienzo
xk=1;
mientras xk<n hacer
xk=xk+1;
opcion
(k=n) ∧ (peso(xn-1,xn)≠∞) ∧ (peso(xn,x1)≠∞) ∧ ¬Repetido(x,n)):
si peso_total(x)< v_mejor entonces
v_mejor=peso_total(x);
x_mejor=x;
fsi
(k<n) ∧ (peso(xk-1,xk)≠∞) ∧ (¬Repetido(x,k)):
VIAJANTE_BT (G,n,k+1,v_mejor,x,x_mejor);
fopcion
fmientras
fin
19

Ejercicios
PROBLEMA DEL VIAJANTE DE COMERCIO: Solución vuelta atrás

/* Versión Iterativa */
funcion VIAJANTE_BT (var G:grafo)
var x:vector[1,n]; k:entero;
comienzo
x1=1; k=2; xk=1; v_mejor=∞;
mientras k>1 hacer
si xk<n entonces
xk=xk+1;
opcion
(k=n) ∧ (peso(xn-1,xn)≠∞) ∧ (peso(xn,x1)≠∞) ∧ ¬Repetido(x,n)):
si peso_total(x)< v_mejor entonces
v_mejor=peso_total(x);
x_mejor=x;
fsi
(k<n) ∧ (peso(xk-1,xk)≠∞) ∧ (¬Repetido(x,k)):
k=k+1;
xk=1;
fopcion
si_no k=k-1;
fmientras
devuelve x_mejor;
fin
20

10
Ejercicios
PROBLEMA DE LAS n REINAS

„ En un tablero de n x n, colocar n reinas sin que se “maten” entre sí.

„ Tipificación del problema:


… Secuencia de decisiones en la que cada xi es la columna en la que se
encuentra la reina i (fila i)
… Restricciones:
„ Dos reinas no pueden estar en la misma columna
i ≠ j ⇒ xi ≠ x j 1 ≤ i ≤ n 1 ≤ j ≤ n

„ Dos reinas no pueden estar en la misma diagonal


i + xi ≠ j + x j
xi − i ≠ x j − j
„ Aunando ambas restricciones:
xi − x j ≠ i − j
21

Ejercicios
PROBLEMA DE LAS n REINAS

funcion nREINAS (n,k:entero; x:vector[{1,...,n}])


comienzo
xk=0;
mientras xk<n hacer
xk= xk+1;
opcion
(k=n) ∧ CORRECTO(x,n): Imprimir(x);
(k<n) ∧ CORRECTO(x,k): nREINAS(n,k+1,x);
fopcion
fmientras
fin

funcion CORRECTO (var x: vector[{1,...,n}]; k:entero)


var i:entero; ok:booleano
comienzo
i=1; ok=cierto;
mientras (i>k) ∧ ok hacer
si (xi=xk) ∨ (abs(xi-xk)=abs(i-k)) entonces ok=falso;
i=i+1;
fmientras
devuelve ok
fin

22

11
Ejercicios
PROBLEMA DEL LABERINTO (2 MOVIMIENTOS)

„ Buscar todos los caminos posibles en una laberinto representado por


una matriz de n x m, partiendo de la posición (1,1)
hasta llegar a la posición (n,m).
„ Sólo se pueden hacer dos movimientos:
„ derecha (→)
„ abajo (↓).

„ Tipificación del problema:


… Secuencia de decisiones < x1 , x2 ,…, x? > en la que cada xi es la
dirección en la que nos movemos:
0 ir hacia la derecha ( → )
xi ∈ {0,1}
1 ir hacia abajo ( ↓ )
… Restricciones:
„ No salirse del laberinto ni tocar los muros
23

Ejercicios
PROBLEMA DEL LABERINTO

funcion LABERINTO (n,m,k:entero; x:vector[{0,1}] )


comienzo
xk=-1;
mientras xk<1 hacer
xk = xk+1;
opcion
(k=n+m-2) ∧ CORRECTO(x,k): Imprimir(x);
(k<n+m-2) ∧ CORRECTO(x,k): LABERINTO(n,m,k+1,x);
fopcion
fmientras
fin
funcion CORRECTO (var x:vector[{0,1}]; k:entero): booleano
var i, filas, columnas:entero
comienzo
i=1; filas=1; columnas=1;
mientras i ≤ k hacer
si xi=0 entonces columnas++
si_no filas++;
i=i+1;
fmientras
si (filas ≤ n) ∧ (columnas ≤ m) entonces
devuelve M[filas,columnas]
si_no devuelve falso
fin
24

12
Ejercicios
PROBLEMA DE LA TRANSFORMACIÓN DE UN NÚMERO

„ Transformar un número n en otro m usando dos funciones f(x) y g(x)


con un número máximo de transformaciones P.
… f(x) = 3x
… g(x) = x/2 (división entera)
Tipificación del problema:
… Secuencia de decisiones < x1 , x2 ,…, x? >
0 se aplica f ( x)
„ xi ∈ {0,1}
1 se aplica g( x)

… Función que comprueba las transformaciones realizadas:


„ F(x,q,n) = x1(x2( x3 .... xq(n) ....)) = m , q ≤ P

… Restricciones:
„ k ≤ P k = nº de transformaciones
„ F(x,k,n) ≠ 0
„ F(x,k,n) ≠ F(x,i,n) i<k (valor repetido) 25

Ejercicios
PROBLEMA DE LA TRANSFORMACIÓN DE UN NÚMERO

v_mejor=P+1; /* inicialización previa de v_mejor */

funcion TRANSFORMA (P,n,m,k:entero; x,x_mejor:vector;


v_mejor:entero)
comienzo
para j ∈{‘f’,`g’} hacer
xk=j;
opcion
F(x,k,n)=m: si k<v_mejor entonces
v_mejor=k;
x_mejor=x;
finsi;
(P>k ∧ F(x,k,n)≠m ∧ F(x,k,n)≠0 ∧
(k<v_mejor) ∧ ¬Repetido(x,k,n)):
TRANSFORMA(n,m,k+1,x,x_mejor,v_mejor);
fopcion
fpara
fin

26

13
Ejercicios
PERMUTACIONES

„ Dado un vector V de n elementos de tipo general ∂, implementar


un algoritmo que sea capaz de hallar todas las permutaciones de
sus elementos.

27

Ejercicios
EL COLOREADO DE GRAFOS

„ Dado un grafo conexo y un número de colores m>0, llamamos


colorear el grafo a asignar un número i (1 <= i <= m) a cada
vértice, de forma que dos vértices adyacentes nunca tengan
asignados números (o colores) iguales.

„ Deseamos diseñar dos algoritmos.


… El primero obtendrá todas las formas diferentes de colorear un grafo
dado
… El segundo permitirá colorear un grafo dado empleando el mínimo
número de colores diferentes

28

14
Ejercicios
LA EMPRESA NAVIERA

„ Supongamos una empresa naviera que dispone de una flota de N


buques cada uno de los cuales transporta mercancías de un valor
vi que tardan en descargarse un tiempo ti. Solo hay un muelle de
descarga y su máximo tiempo de utilización es T.

„ Diseñar un algoritmo que determine el orden de descarga de los


buques de forma que el valor descargado sea máximo sin
sobrepasar el tiempo de descarga T. (Si se elige un buque para
descargarlo, es necesario que se descargue en su totalidad).

29

Ejercicios
EL REPARTO DE PAQUETES

„ Una empresa de transportes dispone de M vehículos para repartir


N paquetes todos al mismo destino. Cada paquete tiene un peso
Pi y tiene que estar entregado antes de un tiempo TPi. Por otra
parte, cada vehículo puede transportar una carga máxima Cj,
tarda un tiempo TVj en llegar al destino y consume una cantidad
Lj de litros de combustible independiente de la carga que
transporte.

„ Diseñar un algoritmo que obtenga la forma en que se deben


transportar los objetos (en qué vehículo j debe ir cada objeto i)
para que el consumo sea mínimo.

30

15
Ejercicios
EL LABERINTO

„ Una matriz bidimensional nxn puede representar un laberinto


cuadrado. Cada posición contiene un entero que indica si la
casilla es transitable (1) o no lo es (0). Las casillas [1,1] y [n,n]
corresponden a la entrada y salida del laberinto y siempre serán
transitables.
„ Podemos desplazarnos de una casilla a otra adyacente
empleando los movimientos: arriba, abajo, derecha o izquierda
(no se permiten movimientos en diagonal).
„ Dada una matriz con un laberinto, el problema consiste en diseñar
un algoritmo que encuentre un camino, si existe, para ir de la
entrada a la salida.

31

Ejercicios
LA ASIGNACIÓN DE TURNOS

„ Estamos al comienzo del curso y los alumnos deben distribuirse


en turnos de prácticas. Para solucionar este problema se
propone que valoren los turnos de práctica disponibles a los que
desean ir en función de sus preferencias. El número de alumnos
es N y el de turnos disponibles es T. Se dispone una matriz de
preferencias P con N filas y T columnas en la que cada alumno
escribe, en su fila correspondiente, un número entero (entre 0 y
T) que indica la preferencia del alumno por cada turno (un valor 0
indica que no quiere o no puede ir a dicho turno). Por otra parte,
dispondremos de un vector C con T elementos que incluye la
capacidad de cada turno y que, por supuesto no podremos
sobrepasar.

32

16
Ejercicios
LA ASIGNACIÓN DE TURNOS

„ Por ejemplo, supongamos que hay 5 alumnos. Según el ejemplo en de


matriz P, el alumno 1 no puede ir al tuno T1 y al que más preferencia
asigna es al T3. Por otro lado, el vector contiene las capacidades máximas
de cada turno.

P T1 T2 T3 C
A1 0 1 2 T1 3
A2 1 2 3 T2 2
A3 3 2 1 T3 4
A4 0 0 1
A5 2 1 0

„ Se pretende encontrar una solución para satisfacer el número máximo de


alumnos según su orden de preferencia sin exceder la capacidad de los
turnos.

33

17