Está en la página 1de 14

TCNICA DE DISEO BACKTRACKING

PROBLEMA DEL CABALLO DE ATILA

Ing. Claudia Pereira Facultad de Ciencias Exactas Universidad Nacional del Centro de la Provincia de Buenos Aires

CARACTERSTICAS DEL PROBLEMA


La solucin puede expresarse como una n-tupla (x1,x2,...xn)

donde los xi pertenecen a un cierto dominio. Funcin FACTIBLE: determina si una tupla cumple o no con las restricciones del problema. Funcin SOLUCIN: determina si una tupla factible es solucin al problema. Funcin OBJETIVO a optimizar o satisfacer.
Backtracking: Introduccin

CARACTERSTICAS DEL PROBLEMA


Restricciones del problema: Explcitas: describen el dominio de los xi.

Implcitas: describen las relaciones que deben cumplirse entre los xi.
Backtracking: Introduccin

TCNICA BACKTRACKING
Forma cada tupla de manera progresiva.

Verifica si cada xi aadido a la tupla (x1,x2,..,xi) conduce a una solucin factible. Si FACTIBLE (x1,x2,..,xi) = Falso Corta la bsqueda Prueba con otro valor vlido de xi Si no existen valores vlidos retrocede Si FACTIBLE (x1,x2,..,xi) = Verdadero Repite el procedimiento para incorporar x i+1 a la tupla
Backtracking: Introduccin

ESPACIO DE SOLUCIONES
(x1) (x2) (x3) ........... (x3 ,x1) .... (xn) (xn ,x1) (xn ,x1) .................. (xn ,x1 ,...x1)...(xn ,xn ,...xn)

hijos

(x1 ,x1) (x1 ,x2) ...(x1 ,xn)

niveles

..................

(x1 ,x1 ,...x1) (x1 ,x1 ,...x2)....

#niveles

Cantidad total de nodos:

#hijos

O (#hijos #niveles )
Backtracking: Introduccin

i=0

Desventaja Costo computacional exponencial Solucin Poda por factibilidad

Funciones de PODA Poda por costo Ventaja Si existe solucin al problema entonces esta tcnica la encuentra.
Backtracking: Introduccin

ESQUEMA GENERAL
BACK (estado e, solucion *sol) \\ e: nodo del rbol de soluciones { \\sol: solucin que retorna if ( HOJA (e)) CalcularSolucin (e, sol); else { int nrohijo = 1; estado siguiente; while ( HIJOS (nrohijo, e, siguiente ) ) { if ( !PODADO ( siguiente, sol) ) BACK ( siguiente, sol); ++nrohijo; } } }
Backtracking: Introduccin

PROBLEMA: EL CABALLO DE ATILA


Enunciado: Todos sabemos que por donde pisa el caballo de Atila jams vuelve a crecer el pasto. El caballo fue directamente hacia el jardn de n x n casillas. Empez su paseo por una casilla cualquiera y volvi a ella, es decir, hizo un recorrido cerrado. No visit dos veces una misma casilla, se movi de una casilla a otra vecina en forma horizontal o vertical, pero nunca en diagonal. Por donde pis el caballo, el pasto jams volvi a crecer. Luego de terminado el recorrido en algunas casillas todava haba pasto (seal de que en ellas no haba estado el caballo). Escriba un algoritmo que deduzca el recorrido completo que hizo el caballo.

CARACTERIZACIN DEL PROBLEMA


Solucin (pos1, pos2, pos3,......posn) posi es una casilla del jardn de m x m casillas Restricciones:

Explcitas: posi {pos1, pos2, pos3,......posmxm} Implcitas: en la tupla solucin,


No hay dos posiciones iguales pos1 es una casilla del borde del jardn posi y posi+1 son casillas son adyacentes pos1 y posn son casillas adyacentes deben estar todas las casillas pisadas Ejemplo: el caballo de Atila

Espacio de soluciones

Estado inicial

Movimientos del caballo


........................

Estados factibles No puede seguir avanzando

Estado solucin
Ejemplo: el caballo de Atila

Espacio de soluciones: recorrido

Solucin
Ejemplo: el caballo de Atila

Algoritmo para todas las soluciones


void Atila (estado e, int nroPisada) { e.marcar(nroPisada); if ( ! e.HayMovimientos() ) { if(( nroPisada== e.cantPisadas() ) && (e.vecinaOrigen())) imprimirSolucion(e); } else { estado sgte; int nrohijo=1; while ( hijos(nrohijo, e, sgte)) { if ( sgte.esFactible() ) Atila( sgte, nroPisada+1); nrohijo++;} } }
Ejemplo: el caballo de Atila

Complejidad temporal
Depende de la cantidad de estados generados

O (#hijos #niveles )

T (casillasPisadas) O( 3
Atila

#casillasPisadas

Ejemplo: el caballo de Atila

BIBLIOGRAFA
Computer Algorithms C++; Horowitz, Sahni, Rajasekaran. Algorithms in C; Sedgewick Apuntes de ctedra.