Professional Documents
Culture Documents
Backtracking
([GV00], p. 239) En el juego del Continental se colocan 32 piezas en un tablero de 33 casillas, tal y como se indica en la gura:
o o o o o o o o o o o o o o o o o o o o
o o o
o o o
o o o
o o o
Solo se permiten movimientos en vertical y horizontal. Una pieza solo puede moverse saltando sobre otra y situndose en la a siguiente casilla, que debe estar vac La pieza sobre la que se salta se retira a. del tablero. Se consigue terminar con xito cuando queda una sola pieza en la posicin e o central del tablero. Disead un algoritmo de backtracking que encuentre una serie de movimientos n para llegar al nal del juego.
Yolanda Garc Jess Correas (DSIC - UCM) a, u 1 / 19
La solucin consiste en la secuencia de movimientos hasta llegar a la o posicin nal. o Es posible que una casilla del tablero sea visitada varias veces por distintas piezas a lo largo de una partida: no podemos utilizar un tablero para representar la solucin o Utilizaremos una secuencia X = x1 , ..., xm , en la que xi representa el movimiento i-simo. Adems, m = 31. e a Cada movimiento debe contener informacin para deshacerlo si es o necesario:
posicin del tablero desde la que se mueve. o posicin a la que se mueve. o posicin de la cha que se salta. o
Yolanda Garc Jess Correas (DSIC - UCM) a, u 2 / 19
fun esValido(D,i,j,v) // Ya se ha comprobado que D[i,j]=1 destX i+2*dX[v] ; destY j+2*dY[v] comX i+dX[v] ; comY j+dY[v] si 1 destX 7 1 destY 7 D[destX,destY]=0 D[comX,comY]=1 entonces devolver cierto si no devolver falso n fun
4 / 19
[Septiembre 2003] Deseamos ir lo ms rpido posible de una ciudad a otra. a a Disponemos de un mapa que nos indica las distancias por carretera entre ciudades as como la velocidad mxima a la que podemos circular por ellas. Supongamos a que tenemos una cantidad de combustible C al comenzar el viaje y que el consumo de nuestro automvil por kilmetro depende de la velocidad de la o o siguiente manera: consumo por kilmetro = kv 2 , donde k es una constante conocida. o Se pide encontrar el camino que minimiza el tiempo del viaje diseando un n algoritmo de ramicacin y poda. o Nota: suponemos que viajamos en cada tramo siempre a la velocidad mxima. a
6 / 19
Los datos de entrada pueden estar contenidos en una matriz de adyacencia con dos datos: la distancia entre dos ciudades y la velocidad mxima permitida. a La solucin ser la secuencia de ciudades que deben visitarse. o a La estructura de cada nodo puede ser:
Solucin actual o Nivel actual duracin solucin actual o o consumo solucin actual o Cota inferior
7 / 19
8 / 19
10 / 19
proc aadirHijosLNV(hijos[1..N], numhijos, destino, mejorSol[1..n], Lnv, Cota) n desde i 1 hasta numhijos hacer si hijos[i].Cinf < Cota entonces si hijos[i].sol[hijos[i].etapa] = destino entonces mejorSol hijos[i].sol Cota hijos[i].duracion //nuevo valor de la cota inferior si no introducir(Lnv,hijos[i],hijos[i].Cinf) //mont culo ordenado por la cota inferior n si n si n desde n proc
11 / 19
Ejercicio 3. Backtracking
En un tablero de ajedrez de dimensiones N N estn situados algunos a peones y una torre. La torre puede mover en horizontal o en vertical, pero no puede saltar a otras piezas para realizar un movimiento. La posicin de o los peones es conocida. Determina el nmero m u nimo de movimientos que necesita la torre para moverse de una posicin a otra utilizando un o algoritmo de backtracking.
14 / 19
Solucin Ejercicio 3. o
El tablero se puede representar mediante una matriz cuadrada en la que se localiza las posiciones de los peones. La solucin se puede representar como una matriz cuadrada de o valores booleanos que indique el camino de la torre:
El camino que realice la torre no debe pasar dos veces por una misma casilla.
Se podr realizar este ejercicio utilizando ramicacin y poda: a o qu esquema de poda se debe utilizar? e
15 / 19
Ejercicio 4.
Dadas n tareas y m empleados, deseamos realizar las n tareas distribuyndolas entre los m empleados de tal forma que el tiempo de la e planicacin sea m o nimo. El tiempo de realizacin de cada tarea por cada o empleado es conocido. La asignacin de tareas debe cumplir las siguientes o condiciones: Todas las tareas tienen que ser realizadas. Dos tareas no pueden ser realizadas al mismo tiempo por el mismo empleado.
17 / 19
Solucin ejercicio 4. o
proc tareas(etapa,T[1..n,1..m], tOpt, asigOpt[1..n], asigAct[1..n],Trab[1..m],tTrabMaxIni) //etapa: tarea a procesar //Trab[j]: tiempo que tarda el trabajador j para realizar sus tareas asignadas //tTrabMaxIni: tiempo que tarda el trabajador que ms tarda en sus tareas a desde j 1 hasta m hacer //j: empleado a considerar asigAct[etapa] j Trab[j] T[etapa,j]+Trab[j] si tTrabMaxIni < Trab[j] entonces tTrabMax Trab[j] si no tTrabMax tTrabMaxIni si tOpt > tTrabMax entonces si k=n entonces tOpt tTrabMax asigOpt asigAct si no tareas(k+1,tOpt,asigOpt,asigAct,Trab,tTrabMax) n si n si Trab[j] Trab[j]-T[k,j] // No es necesario deshacer tTrabMax n desde n proc
18 / 19
proc llamador(T[1..n,1..m], tOpt, solOpt[1..m]) crear Trab[1..m], asigAct[1..n] desde q 1 hasta m hacer Trab[q] 0 n desde desde q 1 hasta n hacer asigAct[q] 0 n desde tOpt + tareas(1,T,tOpt,solOpt,asigAct,Trab,0) n proc
19 / 19