You are on page 1of 19

Ejercicio 1.

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

Solucin ejercicio 1. Backtracking o


El tablero de juego se puede representar mediante una matriz 77 con tres valores posibles:
0 si la casilla est vac a a. 1 si la casilla tiene una pieza. -1 si la casilla es no vlida. Se utiliza para deshabilitar las posiciones de a las esquinas, que no forman parte del tablero.

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

Solucin ejercicio 1. Backtracking (cont.) o


dX = (1, 0, -1, 0) ; dY = (0, 1, 0, -1) //constantes globales fun continental(D[1..7,1..7],sol[1..31],etapa) si etapa = 31 entonces devolver D[4,4] = 1 desde i 1 hasta 7 hacer desde j 1 hasta 7 hacer si D[i,j] = 1 entonces desde v 1 hasta 4 hacer si esValido(D,i,j,v) entonces sol[etapa].origen.x i ; sol[etapa].origen.y j sol[etapa].destino.x i+2*dX[v] ; sol[etapa].destino.y j+2*dY[v] sol[etapa].comido.x i+dX[v] ; sol[etapa].comido.y j+dY[v] hacerMovimiento(D,sol[etapa]) si continental(D,sol,etapa+1) entonces devolver cierto si no deshacerMovimiento(D,sol[etapa]) n si n desde n si n desde n desde devolver falso n fun
Yolanda Garc Jess Correas (DSIC - UCM) a, u 3 / 19

Solucin ejercicio 1. Backtracking (cont.) o

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

Yolanda Garc Jess Correas (DSIC - UCM) a, u

4 / 19

Solucin ejercicio 1. Backtracking (cont.) o


proc hacerMovimiento(D,mov) D[mov.origen.x,mov.origen.y] 0 D[mov.destino.x,mov.destino.y] 1 D[mov.comido.x,mov.comido.y] 0 n proc proc deshacerMovimiento(D,mov) D[mov.origen.x,mov.origen.y] 1 D[mov.destino.x,mov.destino.y] 0 D[mov.comido.x,mov.comido.y] 1 n proc fun llamador continental(sol) crear D[1..7,1..7] D {{-1,-1, 1, 1, 1,-1,-1}, {-1,-1, 1, 1, 1,-1,-1}, { 1, 1, 1, 1, 1, 1, 1}, { 1, 1, 1, 0, 1, 1, 1}, { 1, 1, 1, 1, 1, 1, 1}, {-1,-1, 1, 1, 1,-1,-1}, {-1,-1, 1, 1, 1,-1,-1}} devolver continental(D,sol,1) n fun
Yolanda Garc Jess Correas (DSIC - UCM) a, u 5 / 19

Ejercicio 2. Ramicacin y Poda. o

[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

Yolanda Garc Jess Correas (DSIC - UCM) a, u

6 / 19

Solucin ejercicio 2. Ramicacin y Poda o o

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

Yolanda Garc Jess Correas (DSIC - UCM) a, u

7 / 19

Solucin ejercicio 2. Ramicacin y Poda o o


Puede haber ramas del rbol que no lleven a ninguna solucin: la cota a o solamente se actualiza cuando se encuentra una solucin. o La cota inferior de un nodo puede ser:
la duracin del camino recorrido hasta el momento, o ms el tiempo de viaje desde la ciudad actual hasta la ciudad que a est ms cerca (en tiempo). e a

Se pueden utilizar dos cotas si se comprueba la factibilidad de cada nodo:


por ejemplo, calculando el camino m nimo (en consumo de combustible) en el grafo resultante de eliminar las ciudades ya visitadas y las carreteras que llegan a ellas, y vericando que el combustible disponible es suciente. Se puede utilizar el algoritmo de Dijkstra para realizar este clculo. a

Yolanda Garc Jess Correas (DSIC - UCM) a, u

8 / 19

Solucin ejercicio 2. Ramicacin y Poda (cont.) o o


proc viajante(D[1..N,1..N],origen,destino,C,mejorSol[1..N], Cota) crear Lnv // mont culo nodoRaiz(raiz,D,origen,destino) Cota introducir(Lnv, origen, raiz) mientras not(vacia(Lnv)) hacer sacar(Lnv,x) si x.Cinf < Cota entonces generarHijos(x, hijos, numhijos, D, C, destino) aadirHijosLNV(hijos, numhijos, destino, mejorSol, Lnv, Cota) n si no vaciar(Lnv) n si n mientras n proc
Yolanda Garc Jess Correas (DSIC - UCM) a, u 9 / 19

Solucin ejercicio 2. Ramicacin y Poda (cont.) o o


proc generarHijos(padre, hijos[1..N], numHijos, D[1..n,1..n], C, destino) numHijos 0 ; newEtapa padre.etapa +1 desde i = 1 hasta N hacer distEtapa D[padre.sol[padre.etapa],i].distancia velEtapa D[padre.sol[padre.etapa],i].velocidad consumo padre.consumo + distEtapa*k*velEtapa2 si no visitado(i, padre.sol, padre.etapa) consumo < C entonces numHijos numHijos +1 crear hijos[numHijos] hijos[numHijos].sol padre.sol hijos[numHijos].sol[newEtapa] i hijos[numHijos].etapa newEtapa hijos[numHijos].duracion padre.duracion + distEtapa/velEtapa hijos[numHijos].consumo consumo hijos[numHijos].Cinf calcularCotaInf(hijos[numHijos],D,destino) n si n desde n proc

Yolanda Garc Jess Correas (DSIC - UCM) a, u

10 / 19

Solucin ejercicio 2. Ramicacin y Poda (cont.) o o

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

Yolanda Garc Jess Correas (DSIC - UCM) a, u

11 / 19

Solucin ejercicio 2. Ramicacin y Poda (cont.) o o


proc nodoRaiz(raiz,D[1..N,1..N],origen,destino) crear raiz raiz.sol[1] origen raiz.etapa 1 raiz.duracion 0 raiz.consumo 0 raiz.Cinf calcularCotaInf(raiz,D,destino) n proc fun no visitado(v,sol[1..N],etapa) desde i 1 hasta etapa hacer si v = sol[i] entonces devolver falso n desde devolver cierto n fun
Yolanda Garc Jess Correas (DSIC - UCM) a, u 12 / 19

Solucin ejercicio 2. Ramicacin y Poda (cont.) o o


fun calcularCotaInf(nodo,D[1..N,1..N],destino) cotaInferior nodo.duracion actual nodo.sol[nodo.etapa] si actual = destino entonces minFila desde i 1 hasta N hacer si no visitado(i, nodo.sol, nodo.etapa) entonces minFila min{ minFila, D[actual,i].distancia/D[actual,i].velocidad} n si n desde cotaInferior cotaInferior + minFila n si devolver cotaInferior n fun Cul es la complejidad de calcularCotaInf()? Cmo se podr a o a mejorar?
Yolanda Garc Jess Correas (DSIC - UCM) a, u 13 / 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.

Yolanda Garc Jess Correas (DSIC - UCM) a, u

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.

El rbol de bsqueda de soluciones tendr la siguiente forma: a u a


Cada nivel corresponde a un movimiento realizado. Cada arista corresponde a una posible casilla vlida no visitada. a

Se podr realizar este ejercicio utilizando ramicacin y poda: a o qu esquema de poda se debe utilizar? e

Yolanda Garc Jess Correas (DSIC - UCM) a, u

15 / 19

Solucin Ejercicio 3 (cont.). o


dX = (1, 0, -1, 0) ; dY = (0, 1, 0, -1) //constantes globales proc Torre(x,y,Xn,Yn,T[1..N,1..N],solAct[1..N,1..N],movIni,solMin[1..N,1..N],movMin) exito falso ; v 1 // Bucle externo: las cuatro direcciones posibles mientras v 4 exito hacer nx x + dX[v]; ny y + dY[v] //Bucle interno: movimientos posibles en una direccin o mientras 1 nx N 1 ny N T[nx,ny] = pen solAct[nx,ny] exito o hacer mov movIni+1 si mov < movMin entonces solAct[nx,ny] cierto si nx=Xn ny=Yn entonces movMin mov ; solMin solAct ; exito cierto si no Torres(nx,ny,Xn,Yn,T[1..N,1..N],solAct[1..N,1..N],mov,movMin)) n si nx nx + dX[v] ; ny ny + dY[v] n mientras // Deshacemos las casillas marcadas en la l nea nx nx - dX[v] ; ny ny - dY[v] mientras nx = x ny = y hacer solAct[nx,ny] falso ; nx x - dX[v] ; ny y - dY[v] n mientras vv+1 n mientras n proc
Yolanda Garc Jess Correas (DSIC - UCM) a, u 16 / 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.

Yolanda Garc Jess Correas (DSIC - UCM) a, u

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

Yolanda Garc Jess Correas (DSIC - UCM) a, u

18 / 19

Solucin ejercicio 4 (cont.). o

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

Yolanda Garc Jess Correas (DSIC - UCM) a, u

19 / 19

You might also like