Informe Trabajo Prctico de Programacin Dinmica y Greedy: Fernndez, Agustin - Canut, Iker October 22, 2019
Informe Trabajo Prctico de Programacin Dinmica y Greedy: Fernndez, Agustin - Canut, Iker October 22, 2019
Informe Trabajo Prctico de Programacin Dinmica y Greedy: Fernndez, Agustin - Canut, Iker October 22, 2019
1
1 Greedy
1.1 Introduccin
Dado un tablero de ajedrez y una casilla inicial, queremos decidir si es posible que un caballo recorra todos y cada
uno de los escaques sin duplicar ninguno.
No es necesario en este problema que el caballo vuelva al escaque de partida.
1.4 Empates
Hay muchas formas de decidir que hacer en el caso de empates.
1. RANDOM: Una posibilidad, que es la que implementa Warnsdorff, es elegir un casillero random cuando
hay empates. Esto hace que eventualmente hayan errores.
2 6
4 8
3 7
1 5
Como se dijo anteriormente, esto puede dar lugar a errores. A continuacin se marcan en verde las casillas
donde el algoritmo, siguiendo el orden marcado anteriormente, encuentra un camino vlido.
2
Claramente, las casillas pintadas en amarillo, tambin son vlidas. Y se puede demostrar girando el tablero, ya
que ahi si se encuentra un camino.
3. Propuesta de Arnd Roth: Roth busca romper los empates buscando el sucesor que est a mayor distancia
del centro del tablero. La primera falla aparece en un tablero de 428 filas, y los errores representan menos
del 1% en tableros con menos de 2000 filas.
4. Propuesta de Ira Pohl: Pohl decidi romper los empates aplicando la regla de Warnsdorff una segunda
vez. Es decir, comenzando en los casilleros que empataron, fijndose cual tiene menos dominio sobre el tablero
(sumando las posibilidades). Esto puede representar una bsqueda innecesariamente exhaustiva, y en un caso
bsico, como es empezar en una esquina, donde reina la simetra, tiene problemas.
• NxN, ∀ N Par: En el caso de que N sea par, no son necesarias las optimizaciones, de Roth ni de Pohl,
para encontrar caminos vlidos. En todos los casilleros con N par, desde cualquier celda se puede encontrar
un camino nicamente aplicando la heurstica de Warnsdorff.
3
1.6 Implementacin en Haskell
Comenzamos con funciones simples:
pertenece x [] = []
pertenece x ( y : ys ) = if ( x == y ) then [ x ] else pertenece x ys
Luego hay una funcin un poco mas larga que se llama menorElemento, que tiene el siguiente formato:
menorElemento casillerosDondePuedeEstarElCaballo restoDelTablero =
casilleroConMenorDominio
1 1
3 3
3 3
> [(2,2),(1,3),(1,5),(4,2),(5,3),(5,5)]
menorElemento ( enum erarP osib ilid ades (3 ,4) ( makeSet 5)) ( makeSet 5)
> (1,5)
4
El resto es armar un Loop que vaya seleccionando la casilla con menor dominio, y aplicando las funciones que
vimos antes de manera recursiva, sacando los casilleros que se visitan y guardando en un array las casillas visitadas.
loop casilla [] = []
loop casilla posibilidades = casilla : loop
( menorElemento ( enum erar Posib ilid ades casilla posibilidades ) posibilidades )
( quitarElemento casilla posibilidades )
Para dejar linda la llamada inicial, se creo una funcion llamada game que se encarga de los preparativos:
game casillaInicial anchoTablero =
if ( length ( loop casillaInicial ( makeSet anchoTablero )) ==
length ( makeSet anchoTablero ))
then ( loop casillaInicial ( makeSet anchoTablero ))
else error " No_se_puede_armar "
Si el recorrido que devuelve tiene el mismo tamao que casillas en el tablero, se visitaron todas las casillas.
game (3,3) 5
>[(3,3),(2,1),(1,3),(2,5),(4,4),(5,2),(3,1),(1,2),(2,4),(4,5),(5,3),
(4,1),(2,2),(1,4),(3,5),(5,4),(4,2),(3,4),(1,5),(2,3),(1,1),(3,2),(5,1),(4,3),(5,5)]
game (5,3) 11
>[(5,3),(4,1),(2,2),(1,4),(2,6),(1,8),(2,10),(4,11),(6,10),(8,11),(10,10),(11,8),(10,6),
(11,4),(10,2),(8,1),(6,2),(4,3),(3,1),(1,2),(2,4),(1,6),(2,8),(1,10),(3,11),(4,9),(5,11),
(3,10),(1,11),(2,9),(1,7),(2,5),(1,3),(2,1),(3,3),(4,5),(3,7),(5,8),(4,10),(2,11),(1,9),
(3,8),(4,6),(3,4),(1,5),(2,7),(3,9),(5,10),(7,11),(6,9),(4,8),(3,6),(5,7),(6,5),(4,4),(3,2),
(1,1),(2,3),(3,5),(4,7),(5,5),(6,7),(5,9),(6,11),(7,9),(9,10),(11,11),(10,9),(9,11),(11,10),
(10,8),(8,9),(7,7),(5,6),(6,8),(7,10),(8,8),(7,6),(6,4),(5,2),(7,1),(8,3),(9,1),(11,2),(10,4),
(11,6),(9,7),(8,5),(7,3),(6,1),(4,2),(5,4),(6,6),(7,8),(8,10),(10,11),(9,9),(8,7),(7,5),(6,3),
(5,1),(7,2),(9,3),(10,1),(8,2),(7,4),(9,5),(10,3),(11,1),(9,2),(8,4),(9,6),(11,5),(10,7),(11,9),
(9,8),(11,7),(10,5),(8,6),(9,4),(11,3)]
5
2 Programacin Dinmica
2.1 Introduccin
Se quiere encontrar una parentizacin apropiada para maximizar el valor de la siguiente expresin:
x1 /x2 /x3 .../xn−1 /xn
donde x1 , x2 , x3 , ..., xn son numeros naturales positivos y / denota la divisin.
2.3 Conceptos
Dada una parentizacin completa (P1..n ), la funcin c evaludada en P1..n es el resultado de aplicar las divisiones segn
la parentizacin. Una parentizacin optima de una expresin ser la que maximice la funcin c.
Una parentizacin completa P1..n de la expresin X1..n contiene dos parentizaciones completas P1..k y Pk+1..n de las
subsecuencias X1..k y Xk+1..n ∀ 1 ≤ k ≤ n − 1. Esto se cumple recursivamente.
2.4 Propiedad
Se cumple la siguiente propiedad:
Resulta que:
6
t1 = M [ i ][ k ] / m [ k +1][ j ];
t2 = m [ i ][ k ] / M [ k +1][ j ];
if ( M [ i ][ j ] < t1 )
M [ i ][ j ] = t1 ;
if ( m [ i ][ j ] > t2 )
m [ i ][ j ] = t2 ;
}
}
return M [1][ n ]
}