Вы находитесь на странице: 1из 10

Programacin IV.

Gua 12
Tema: Algoritmos Backtracking.
Comprender el funcionamiento de un Algoritmo Backtracking.
Identificar problemas que pueden resolverse con Algoritmos Bactracking.
Codificar algoritmos backtracking en C#.
Gua Nmero !.
Computadora con programa "icrosoft #isual C#.
$a% problemas para los que no se conoce un algoritmo para su resoluci&n o al menos' no
cuentan con un algoritmo eficiente para calcular su soluci&n. (n estos casos' la nica
posibilidad es una e)ploraci&n directa de todas las posibilidades.
*a t+cnica Backtracking es un m+todo de bsqueda de soluciones e),austiva sobre grafos
dirigidos acclicos' el cual se acelera mediante poda de ramas poco prometedoras.
(s decir-
.e representan todas las posibilidades en un /rbol.
.e resuelve buscando la soluci&n por el /rbol 0de una determinada manera1.
$a% 2onas que se evitan por no contener soluciones 0poda1.
*a soluci&n del problema se representa en una lista ordenada 03' 3!'4' 3n1 0no llenando
necesariamente todas las componentes1.
Cada 3i se escoge de un con5unto de candidatos.
A cada lista se le llama estado.
.e trata de buscar estados soluci&n del problema.
1
Facultad: Ingeniera
Escuela: Computacin
Asignatura: Programacin IV
O!eti"os Espec#icos
$ateriales % E&uipo
Introduccin Terica
Programacin IV. Gua 12
6iene condiciones de parada-
a1 cuando se alcan2a un estado soluci&n
b1 cuando se alcan2an todos los estados soluci&n
(n su forma b/sica' la idea de backtracking se aseme5a a un recorrido en profundidad dentro de
un grafo dirigido. (l grafo en cuesti&n suele ser un /rbol' o por lo menos no contiene ciclos. .ea
cual sea su estructura' e)iste s&lo implcitamente. (l ob5etivo del recorrido es encontrar
soluciones para algn problema.
(l recorrido tiene +)ito si' procediendo de esta forma' se puede definir por completo una
soluci&n. (n este caso el algoritmo puede bien detenerse 0si lo nico que se necesita es una
soluci&n del problema1 o bien seguir buscando soluciones alternativas 0si deseamos
e)aminarlas todas1.
7or otra parte' el recorrido no tiene +)ito si en alguna etapa la soluci&n parcial construida ,asta
el momento no se puede completar. (n tal caso' el recorrido vuelve atr/s e)actamente igual
que en un recorrido en profundidad' eliminando sobre la marc,a los elementos que se ,ubieran
a8adido en cada fase. Cuando vuelve a un nodo que tiene uno o m/s vecinos sin e)plorar'
prosigue el recorrido de una soluci&n.
*os problemas que deben satisfacer un determinado tipo de restricciones son problemas
completos' donde el orden de los elementos de la soluci&n no importa. (stos problemas
consisten en un con5unto 0o lista1 de variables a la que a cada una se le debe asignar un valor
su5eto a las restricciones del problema. *a t+cnica va creando todas las posibles combinaciones
de elementos para obtener una soluci&n. .u principal virtud es que en la ma%ora de las
implementaciones se puede evitar combinaciones' estableciendo funciones de acotaci&n 0o
poda1 reduciendo el tiempo de e5ecuci&n. *a t+cnica backtracking 0vuelta atr/s1 est/ mu%
relacionada con la bsqueda binaria.
Diseo e implementacin Backtracking.
(sencialmente' la idea es encontrar la me5or combinaci&n posible en un momento determinado'
por eso' se dice que este tipo de algoritmo es una bsqueda en profundidad.
Normalmente' se suele implementar este tipo de algoritmos como un procedimiento recursivo.
*a diferencia con la bsqueda en profundidad es que se suelen dise8ar funciones de cota' de
forma que no se generen algunos estados si no van a conducir a ninguna soluci&n' o a una
2
Programacin IV. Gua 12
soluci&n peor de la que %a se tiene. 9e esta forma se a,orra espacio en memoria % tiempo de
e5ecuci&n.
Al dise8ar un algoritmo backtraking debemos considerar los siguientes elementos-
a' :epresentaci&n de la solucin en una lista ordenada 03' 3!'4' 3n1.
' ;na funcin objetivo para determinar si la lista a anali2ar es una soluci&n.
c' ;nas restricciones a los candidatos para rellenar la lista-
Implcitas del problema. #alores que puede tomar cada valor 3i
Explcitas o externas al problema. 7or e5emplo' problema de la moc,ila' el peso
no debe superar la capacidad de la moc,ila.
d' ;na funcin de poda para eliminar partes del /rbol de bsqueda
e' <rgani2aci&n del problema en un rbol de bs!ueda.
f1 Construir la soluci&n al problema en distintas etapas.
g1 (n cada paso se elige un candidato % se a8ade a la soluci&n' % se avan2a en la soluci&n
parcial.
,1 .i no es posible continuar en la construcci&n ,acia una soluci&n completa' se abandona
+sta % la ltima componente se cambia por otro valor.
i1 .i no quedan m/s valores por probar' se retrocede al candidato anterior' se desec,a' %
se selecciona otro candidato.
7ara dise8ar un algoritmo con la t+cnica backtracking' debemos seguir los siguientes pasos-
(. Buscar una representaci&n del tipo 03' 3!'4' 3n1 para las soluciones del problema.
). Identificar las restricciones implcitas % e)plcitas del problema.
*. (stablecer la organi2aci&n del /rbol que define los diferentes estados en los que se
encuentra una 0sub1soluci&n.
+. 9efinir una funci&n soluci&n para determinar si una lista ordenada es soluci&n
,. 9efinir una funci&n de poda Bk 03' 3!'4' 3k1 para eliminar ramas del /rbol que puedan
derivar en soluciones poco deseables o inadecuadas.
=. Aplicar la estructura gen+rica de un algoritmo backtracking
Estructura gen"rica para un algoritmo backtracking.
.oluci&n >i? .i para i @ ' !'...' n
3
Programacin IV. Gua 12
funcion BACA6:ACAINGB:(C 0 k' solucion>n?1
para 5 .i
si 0 7<9A 0k' 5' solucion1 @@ true 1 ,acer
sol>k? @ 5
si 0 6(.6B.<* 0solucion1 @@ true 1 ,acer
devolver solucion
si 0 k C n 1
BACA6:ACAINGB:(C0kD'solucion>n?1
*a eficiencia en un algoritmo backtracking suele ser de tipo e)ponencial a
n
.
*a eficiencia depende de-
la ramificaci&n del /rbol
del tiempo de e5ecuci&n de la funci&n soluci&n
del tiempo de e5ecuci&n de la funci&n poda
del a,orro de utili2ar la poda
*as buenas funciones de poda no son mu% eficientes.
(ntre los problemas tpicos que se pueden resolver f/cilmente con las t+cnicas de vuelta atr/s
tenemos- la vuelta del caballo' sudoku' laberintos' sopa de letras' problema de las pare5as'
formaci&n de una palabra con EnF cubos' problema del domin&' problema del reparto del botn'
coloreado de grafos' problema del via5ante sobre grafos dirigidosG entre otros.
Ejemplo #. $roblema del %udoku.
(l .udoku es un rompecabe2as matem/tico de colocaci&n que se populari2& en Hap&n en IJ=
% se di& a conocer en el /mbito internacional en !KKL.
(l ob5etivo es rellenar una cuadrcula de IMI celdas dividida en subcuadrculas de NMN con las
cifras del al I partiendo de algunos nmeros %a dispuestos en algunas de las celdas.
No se debe repetir ninguna cifra en una misma fila' columna o subcuadrcula.
#isuali2aci&n de .udoku-
4
Procedimiento
Programacin IV. Gua 12
A continuaci&n' implementaremos el algoritmo backtracking para resolver el problema del
.udoku en un pro%ecto de #isual C#.
. Crear un pro%ecto de consola' se sugiere llamarlo EAlgoritmo BacktrackingF.
!. Cambiamos el nombre del E7rogram.csF a E.udoku.csF.
N. Agregar el siguiente c&digo a la clase E.udokuF
5
using .%stemG
using .%stem.Collections.GenericG
using .%stem.6e)tG
namespace AlgoritmoBBactracking
O
class .udoku
O
PP 9eclaraci&n de variable que definir/ el tama8o del tablero
public static int 9imension @ IG
PP Qunci&n para imprimir el tablero del .udoku
public static void imprimir0int> ' ? tablero1
O
for 0int i @ KG i C 9imensionG iDD1
O
if 0i R N @@ K1
Console.Srite*ine0 1G
for 0int 5 @ KG 5 C 9imensionG 5DD1
O
if 05 R N @@ K1
Console.Srite0T T1G
Console.QoregroundColor @ ConsoleColor.UelloVG PP cambia el color de la
Console.Srite0tablero>i' 5?1G PP fuente
W
Console.Srite*ine0 1G
W
W
Programacin IV. Gua 12 6
PP(sta funci&n resuelve el .udoku
public static Boolean resolver0int> ' ? tablero1
O
for 0int i @ KG i C 9imensionG iDD1
O
for 0int 5 @ KG 5 C 9imensionG 5DD1
O
if 0tablero>i' 5? X@ K1
continueG
else
O
PPCalcula los elementos de la soluci&n' para ello revisa si es posible insertar
PPel valor k en las coordenadas correspondientes
for 0int k @ G k C@ IG kDD1
O
if 0es7osibleInsertar0tablero' i' 5' k11
O
PP.i el valor de A es consistente' entonces establece en la posici&n el
PPvalor de A' % luego se ,ace una llamada recursiva
tablero>i' 5? @ kG
Boolean b @ resolver0tablero1G
if 0b1
return trueG
tablero>i' 5? @ KG
W
W
PP Cuando se termina de recorrer el tablero % no se ,a retornado el valor de
PP verdadero' entonces' el tablero no tiene soluci&n
return falseG
W
W
W
Console.Srite*ine0 1G
Console.QoregroundColor @ ConsoleColor.S,iteG
Console.Srite*ine0T.olucion encontrada- T1G
imprimir0tablero1G
return trueG
W
PP Qunci&n para verificar si se a8ade un valor al tablero' el tablero siga siendo
PP consistente' es decir' que el valor no se repita en la fila o columna
public static Boolean es7osibleInsertar0int > ' ? tablero' int i' int 5' int valor1
O
PP7rimeramente' se verifica que el valor no se encuentre en la misma fila
for 0int a @ KG a C 9imensionG aDD1
O
if 0a X@ i YY tablero>a' 5? @@ valor1
return falseG
W
Programacin IV. Gua 12 7
PP*uego' se verifica que el valor no se encuentre en la misma columna
for 0int a @ KG a C 9imensionG aDD1
O
if 0a X@ 5 YY tablero>i' a? @@ valor1
return falseG
W
PP.e verifica que el valor no se encuentre en la misma cuadricula
int % @ 0i P N1 Z NG
int ) @ 05 P N1 Z NG
for 0int a @ KG a C 9imension P NG aDD1
O
for 0int b @ KG b C 9imension P NG bDD1
O
if 0a X@ i YY b X@ 5 YY tablero>% D a' ) D b? @@ valor1
return falseG
W
W
return trueG
W

PP Qunci&n principal del programa
static void "ain0string> ? args1
O
PP Generamos un tablero inicial de .udoku
int> ' ? tablero @ neV int > ' ? O
OK'['K' K'K'K' K'J'KW'
OK'L'J' ='K'K' K'K'W'
OK'K'N' '\'K' K'K'KW'

OI'K'=' K'L'K' N'K'KW'
OK'K'K' K'K'K' K'K'KW'
OK'K'L' K'!'K' 'K'[W'
OK'K'K' K'='L' ['K'KW'
ON'K'K' K'K'' I'!'KW'
OK'\'K' K'K'K' K''KW'
WG
Console.Srite*ine0T(l Huego a resolver es- T1G
imprimir0tablero1G
if0Xresolver0tablero11
Console.Srite*ine0T(l .udoku no tiene soluci&nT1G
Console.Srite*ine0 1G
Console.QoregroundColor @ ConsoleColor.C%anG
Console.Srite*ine0T7resione la tecla (nter para salirT1G
Console.:ead0 1G
W
W
W
Programacin IV. Gua 12
Ejercicio #.
:ealice un programa en C# para implementar la soluci&n al problema del .udoku en una
interfa2 gr/fica de formulario 0SindoVs Qorms1.
*a aplicaci&n debe permitir reali2ar las siguientes operaciones-
Generar nuevos 5uegos 0distintos cada ve2 que se seleccione esta opci&n1 de
manera autom/tica.
Generar nuevos 5uegos 0cargar un tablero en blanco' para que el usuario coloque la
condici&n inicial del 5uego1.
Comprobar soluci&n 0debe verificarse la soluci&n reali2ada por el usuario1.
:esolver 5uego actual.
(n las im/genes se muestran e5emplos de c&mo podra lucir su aplicaci&n-

8
An-lisis de resultados
Programacin IV. Gua 12
7ara la siguiente semana-
Investigue el problema de la vuelta del caballo 0variante del 5uego de a5edre21' % realice su
soluci&n con algoritmo backtracking.
*a implementaci&n debe reali2arse con #isual C# en una interfa2 gr/fica de formulario
0SindoVs Qorms1.
*a soluci&n debe permitir reali2ar las siguientes acciones-
7ermitir al usuario indicar el tama8o del tablero.
7ermitir al usuario colocar el caballo en la posici&n inicial que desee.
*os movimientos del caballo deben observarse en pantalla' es decir' que debe quedar
en pantalla' las distintas posiciones que %a ocup& el caballo 0es decir' que debe e)istir
una simulaci&n de los movimientos del caballo.
(l programa indicar/ si e)iste soluci&n o no e)iste soluci&n.
9
In"estigacin Complementaria
Programacin IV. Gua 12
EVALUACIN
% 1-4 5-7 8-10 Nota
CONOCIMIENTO .el )/
al */0
Conocimiento
de#iciente
de los
#undamentos
tericos
Conocimiento
% e1plicacin
incompleta de
los
#undamentos
tericos
Conocimiento
completo %
e1plicacin
clara de los
#undamentos
tericos
APLICACIN
DEL
CONOCIMIENTO
.el +/0
al 2/0
ACTITUD .el (,0
al */0
3o tiene
actitud
proacti"a.
Actitud
propositi"a %
con
propuestas no
aplicales al
contenido de
la gua.
Tiene actitud
proacti"a %
sus propuestas
son concretas.
TOTA4 (//0
10
5ua (): Algoritmos Backtracking
Hoja de cotejo:
12
$-&uina 3o: Alumno:
.ocente: 54:
Fec6a:

Вам также может понравиться