SlideShare une entreprise Scribd logo
1  sur  52
Télécharger pour lire hors ligne
Tema 23: Técnicas de diseño descendente de
algoritmos
Informática (2014–15)
José A. Alonso Jiménez
Grupo de Lógica Computacional
Departamento de Ciencias de la Computación e I.A.
Universidad de Sevilla
IM Tema 23: Técnicas de diseño descendente de algoritmos
Tema 23: Técnicas de diseño descendente de algoritmos
1. La técnica de divide y vencerás
La técnica de divide y vencerás
La ordenación por mezcla como ejemplo de DyV
La ordenación rápida como ejemplo de DyV
2. Búsqueda en espacios de estados
El patrón de búsqueda en espacios de estados
El problema de las n reinas
El problema de la mochila
3. Búsqueda por primero el mejor
El patrón de búsqueda por primero el mejor
El problema del 8 puzzle
4. Búsqueda en escalada
El patrón de búsqueda en escalada
El problema del cambio de monedas por escalada
El algoritmo de Prim del árbol de expansión mínimo por escalada
2 / 52
IM Tema 23: Técnicas de diseño descendente de algoritmos
La técnica de divide y vencerás
La técnica de divide y vencerás
Tema 23: Técnicas de diseño descendente de algoritmos
1. La técnica de divide y vencerás
La técnica de divide y vencerás
La ordenación por mezcla como ejemplo de DyV
La ordenación rápida como ejemplo de DyV
2. Búsqueda en espacios de estados
3. Búsqueda por primero el mejor
4. Búsqueda en escalada
3 / 52
IM Tema 23: Técnicas de diseño descendente de algoritmos
La técnica de divide y vencerás
La técnica de divide y vencerás
La técnica de divide y vencerás
La técnica divide y vencerás consta de los siguientes pasos:
1. Dividir el problema en subproblemas menores.
2. Resolver por separado cada uno de los subproblemas:
si los subproblemas son complejos, usar la misma técnica
recursivamente;
si son simples, resolverlos directamente.
3. Combinar todas las soluciones de los subproblemas en una
solución simple.
4 / 52
IM Tema 23: Técnicas de diseño descendente de algoritmos
La técnica de divide y vencerás
La técnica de divide y vencerás
La técnica de divide y vencerás
(divideVenceras ind resuelve divide combina pbInicial)
resuelve el problema pbInicial mediante la técnica de divide y
vencerás, donde
(ind pb) se verifica si el problema pb es indivisible,
(resuelve pb) es la solución del problema indivisible pb,
(divide pb) es la lista de subproblemas de pb,
(combina pb ss) es la combinación de las soluciones ss de los
subproblemas del problema pb y
pbInicial es el problema inicial.
module DivideVenceras (divideVenceras) where
divideVenceras :: (p -> Bool) -> (p -> s) -> (p -> [p])
-> (p -> [s] -> s) -> p -> s
divideVenceras ind resuelve divide combina pbInicial =
dv' pbInicial where
dv' pb
| ind pb = resuelve pb
| otherwise = combina pb [dv' sp | sp <- divide pb]
5 / 52
IM Tema 23: Técnicas de diseño descendente de algoritmos
La técnica de divide y vencerás
La ordenación por mezcla como ejemplo de DyV
Tema 23: Técnicas de diseño descendente de algoritmos
1. La técnica de divide y vencerás
La técnica de divide y vencerás
La ordenación por mezcla como ejemplo de DyV
La ordenación rápida como ejemplo de DyV
2. Búsqueda en espacios de estados
3. Búsqueda por primero el mejor
4. Búsqueda en escalada
6 / 52
IM Tema 23: Técnicas de diseño descendente de algoritmos
La técnica de divide y vencerás
La ordenación por mezcla como ejemplo de DyV
La ordenación por mezcla como ejemplo de DyV
(ordenaPorMezcla xs) es la lista obtenida ordenando xs por el
procedimiento de ordenación por mezcla. Por ejemplo,
ghci> ordenaPorMezcla [3,1,4,1,5,9,2,8]
[1,1,2,3,4,5,8,9]
import I1M.DivideVenceras
ordenaPorMezcla :: Ord a => [a] -> [a]
ordenaPorMezcla xs =
divideVenceras ind id divide combina xs
where
ind xs = length xs <= 1
divide xs = [take n xs, drop n xs]
where n = length xs `div` 2
combina _ [l1,l2] = mezcla l1 l2
7 / 52
IM Tema 23: Técnicas de diseño descendente de algoritmos
La técnica de divide y vencerás
La ordenación por mezcla como ejemplo de DyV
La ordenación por mezcla como ejemplo de DyV
(mezcla xs ys) es la lista obtenida mezclando xs e ys. Por
ejemplo,
mezcla [1,3] [2,4,6] [1,2,3,4,6]
mezcla :: Ord a => [a] -> [a] -> [a]
mezcla [] b = b
mezcla a [] = a
mezcla a@(x:xs) b@(y:ys)
| x <= y = x : (mezcla xs b)
| otherwise = y : (mezcla a ys)
8 / 52
IM Tema 23: Técnicas de diseño descendente de algoritmos
La técnica de divide y vencerás
La ordenación rápida como ejemplo de DyV
Tema 23: Técnicas de diseño descendente de algoritmos
1. La técnica de divide y vencerás
La técnica de divide y vencerás
La ordenación por mezcla como ejemplo de DyV
La ordenación rápida como ejemplo de DyV
2. Búsqueda en espacios de estados
3. Búsqueda por primero el mejor
4. Búsqueda en escalada
9 / 52
IM Tema 23: Técnicas de diseño descendente de algoritmos
La técnica de divide y vencerás
La ordenación rápida como ejemplo de DyV
La ordenación rápida como ejemplo de DyV
(ordenaRapida xs) es la lista obtenida ordenando xs por el
procedimiento de ordenación rápida. Por ejemplo,
ghci> ordenaRapida [3,1,4,1,5,9,2,8]
[1,1,2,3,4,5,8,9]
import I1M.DivideVenceras
ordenaRapida :: Ord a => [a] -> [a]
ordenaRapida xs =
divideVenceras ind id divide combina xs
where
ind xs = length xs <= 1
divide (x:xs) = [[ y | y <- xs, y <= x],
[ y | y <- xs, y > x]]
combina (x:_) [l1,l2] = l1 ++ [x] ++ l2
10 / 52
IM Tema 23: Técnicas de diseño descendente de algoritmos
Búsqueda en espacios de estados
El patrón de búsqueda en espacios de estados
Tema 23: Técnicas de diseño descendente de algoritmos
1. La técnica de divide y vencerás
2. Búsqueda en espacios de estados
El patrón de búsqueda en espacios de estados
El problema de las n reinas
El problema de la mochila
3. Búsqueda por primero el mejor
4. Búsqueda en escalada
11 / 52
IM Tema 23: Técnicas de diseño descendente de algoritmos
Búsqueda en espacios de estados
El patrón de búsqueda en espacios de estados
Descripción de los problemas de espacios de estados
Las características de los problemas de espacios de estados son:
un conjunto de las posibles situaciones o nodos que constituye el
espacio de estados (estos son las potenciales soluciones que se
necesitan explorar),
un conjunto de movimientos de un nodo a otros nodos, llamados
los sucesores del nodo,
un nodo inicial y
un nodo objetivo que es la solución.
Se supone que el grafo implícito de espacios de estados es acíclico.
12 / 52
IM Tema 23: Técnicas de diseño descendente de algoritmos
Búsqueda en espacios de estados
El patrón de búsqueda en espacios de estados
El patrón de búsqueda en espacios de estados
(buscaEE s o e) es la lista de soluciones del problema de espacio de
estado definido por la función sucesores (s), el objetivo (o) y estado
inicial (e).
module BusquedaEnEspaciosDeEstados (buscaEE) where
import I1M.Pila
buscaEE:: (Eq nodo) => (nodo -> [nodo]) -> (nodo -> Bool)
-> nodo -> [nodo]
buscaEE sucesores esFinal x = busca' (apila x vacia)
where busca' p
| esVacia p = []
| esFinal (cima p) = cima p : busca' (desapila p)
| otherwise = busca' (foldr apila (desapila p)
(sucesores x))
where x = cima p
13 / 52
IM Tema 23: Técnicas de diseño descendente de algoritmos
Búsqueda en espacios de estados
El problema de las n reinas
Tema 23: Técnicas de diseño descendente de algoritmos
1. La técnica de divide y vencerás
2. Búsqueda en espacios de estados
El patrón de búsqueda en espacios de estados
El problema de las n reinas
El problema de la mochila
3. Búsqueda por primero el mejor
4. Búsqueda en escalada
14 / 52
IM Tema 23: Técnicas de diseño descendente de algoritmos
Búsqueda en espacios de estados
El problema de las n reinas
El problema de las n reinas
El problema de las n reinas consiste en colocar n reinas en un
tablero cuadrado de dimensiones n por n de forma que no se
encuentren más de una en la misma línea: horizontal, vertical o
diagonal.
Se resolverá mediante búsqueda en espacio de estados
import I1M.BusquedaEnEspaciosDeEstados
Las posiciones de las reinas en el tablero se representan por su
columna y su fila.
type Columna = Int
type Fila = Int
15 / 52
IM Tema 23: Técnicas de diseño descendente de algoritmos
Búsqueda en espacios de estados
El problema de las n reinas
El problema de las n reinas
Una solución de las n reinas es una lista de posiciones.
type SolNR = [(Columna,Fila)]
(valida sp p) se verifica si la posición p es válida respecto de
la solución parcial sp; es decir, la reina en la posición p no
amenaza a ninguna de las reinas de la sp (se supone que están
en distintas columnas). Por ejemplo,
valida [(1,1)] (2,2) False
valida [(1,1)] (2,3) True
valida :: SolNR -> (Columna,Fila) -> Bool
valida solp (c,r) = and [test s | s <- solp]
where test (c',r') = and [c'+r'/=c+r,
c'-r'/=c-r,
r'/=r] 16 / 52
IM Tema 23: Técnicas de diseño descendente de algoritmos
Búsqueda en espacios de estados
El problema de las n reinas
El problema de las n reinas
Los nodos del problema de las n reinas son ternas formadas por la
columna de la siguiente reina, el número de columnas del tablero
y la solución parcial de las reinas colocadas anteriormente.
type NodoNR = (Columna,Columna,SolNR)
(sucesoresNR e) es la lista de los sucesores del estado e en el
problema de las n reinas. Por ejemplo,
ghci> sucesoresNR (1,4,[])
[(2,4,[(1,1)]),(2,4,[(1,2)]),(2,4,[(1,3)]),(2,4,[(1,4)])]
sucesoresNR :: NodoNR -> [NodoNR]
sucesoresNR (c,n,solp)
= [(c+1,n,solp++[(c,r)]) | r <- [1..n],
valida solp (c,r)]
17 / 52
IM Tema 23: Técnicas de diseño descendente de algoritmos
Búsqueda en espacios de estados
El problema de las n reinas
El problema de las n reinas
(esFinalNR e) se verifica si e es un estado final del problema
de las n reinas.
esFinalNR :: NodoNR -> Bool
esFinalNR (c,n,solp) = c > n
18 / 52
IM Tema 23: Técnicas de diseño descendente de algoritmos
Búsqueda en espacios de estados
El problema de las n reinas
Solución del problema de las n reinas por EE
(buscaEE_NR n) es la primera solución del problema de las n
reinas, por búsqueda en espacio de estados. Por ejemplo,
ghci> buscaEE_NR 8
[(1,1),(2,5),(3,8),(4,6),(5,3),(6,7),(7,2),(8,4)]
buscaEE_NR :: Columna -> SolNR
buscaEE_NR n = s
where ((_,_,s):_) = buscaEE sucesoresNR
esFinalNR
(1,n,[])
19 / 52
IM Tema 23: Técnicas de diseño descendente de algoritmos
Búsqueda en espacios de estados
El problema de las n reinas
Solución del problema de las n reinas por EE
(nSolucionesNR n) es el número de soluciones del problema de
las n reinas, por búsqueda en espacio de estados. Por ejemplo,
nSolucionesNR 8 92
nSolucionesNR :: Columna -> Int
nSolucionesNR n =
length (buscaEE sucesoresNR
esFinalNR
(1,n,[]))
20 / 52
IM Tema 23: Técnicas de diseño descendente de algoritmos
Búsqueda en espacios de estados
El problema de la mochila
Tema 23: Técnicas de diseño descendente de algoritmos
1. La técnica de divide y vencerás
2. Búsqueda en espacios de estados
El patrón de búsqueda en espacios de estados
El problema de las n reinas
El problema de la mochila
3. Búsqueda por primero el mejor
4. Búsqueda en escalada
21 / 52
IM Tema 23: Técnicas de diseño descendente de algoritmos
Búsqueda en espacios de estados
El problema de la mochila
El problema de la mochila
Se tiene una mochila de capacidad de peso p y una lista de n
objetos para colocar en la mochila. Cada objeto i tiene un peso
wi y un valor vi . Considerando la posibilidad de colocar el mismo
objeto varias veces en la mochila, el problema consiste en
determinar la forma de colocar los objetos en la mochila sin
sobrepasar la capacidad de la mochila colocando el máximo valor
posible.
Se resolverá mediante búsqueda en espacio de estados
import I1M.BusquedaEnEspaciosDeEstados
import Data.List (sort)
22 / 52
IM Tema 23: Técnicas de diseño descendente de algoritmos
Búsqueda en espacios de estados
El problema de la mochila
El problema de la mochila
Los pesos son número enteros.
type Peso = Int
Los valores son números reales.
type Valor = Float
Los objetos son pares formado por un peso y un valor.
type Objeto = (Peso,Valor)
Una solución del problema de la mochila es una lista de objetos.
type SolMoch = [Objeto]
23 / 52
IM Tema 23: Técnicas de diseño descendente de algoritmos
Búsqueda en espacios de estados
El problema de la mochila
El problema de la mochila
Los estados del problema de la mochila son 5–tuplas de la forma
(v,p,l,o,s) donde
v es el valor de los objetos colocados,
p es el peso de los objetos colocados,
l es el límite de la capacidad de la mochila,
o es la lista de los objetos colocados (ordenados de forma
creciente según sus pesos) y
s es la solución parcial.
type NodoMoch = (Valor,Peso,Peso,[Objeto],SolMoch)
24 / 52
IM Tema 23: Técnicas de diseño descendente de algoritmos
Búsqueda en espacios de estados
El problema de la mochila
El problema de la mochila
(sucesoresMoch e) es la lista de los sucesores del estado e en
el problema de la mochila.
sucesoresMoch :: NodoMoch -> [NodoMoch]
sucesoresMoch (v,p,limite,objetos,solp)
= [( v+v',
p+p',
limite,
[o | o@(p'',_) <- objetos,(p''>=p')],
(p',v'):solp )
| (p',v') <- objetos,
p+p' <= limite]
25 / 52
IM Tema 23: Técnicas de diseño descendente de algoritmos
Búsqueda en espacios de estados
El problema de la mochila
El problema de la mochila
(esObjetivoMoch e) se verifica si e es un estado final el
problema de la mochila.
esObjetivoMoch :: NodoMoch -> Bool
esObjetivoMoch (_,p,limite,((p',_):_),_) =
p+p'>limite
26 / 52
IM Tema 23: Técnicas de diseño descendente de algoritmos
Búsqueda en espacios de estados
El problema de la mochila
Solución del problema de la mochila por EE
(buscaEE_Mochila os l) es la solución del problema de la mochila
para la lista de objetos os y el límite de capacidad l. Por ejemplo,
> buscaEE_Mochila [(2,3),(3,5),(4,6),(5,10)] 8
([(5,10.0),(3,5.0)],15.0)
> buscaEE_Mochila [(2,3),(3,5),(5,6)] 10
([(3,5.0),(3,5.0),(2,3.0),(2,3.0)],16.0)
> buscaEE_Mochila [(2,2.8),(3,4.4),(5,6.1)] 10
([(3,4.4),(3,4.4),(2,2.8),(2,2.8)],14.4)
buscaEE_Mochila :: [Objeto] -> Peso -> (SolMoch,Valor)
buscaEE_Mochila objetos limite = (sol,v)
where
(v,_,_,_,sol) =
maximum (buscaEE sucesoresMoch
esObjetivoMoch
(0,0,limite,sort objetos,[]))
27 / 52
IM Tema 23: Técnicas de diseño descendente de algoritmos
Búsqueda por primero el mejor
El patrón de búsqueda por primero el mejor
Tema 23: Técnicas de diseño descendente de algoritmos
1. La técnica de divide y vencerás
2. Búsqueda en espacios de estados
3. Búsqueda por primero el mejor
El patrón de búsqueda por primero el mejor
El problema del 8 puzzle
4. Búsqueda en escalada
28 / 52
IM Tema 23: Técnicas de diseño descendente de algoritmos
Búsqueda por primero el mejor
El patrón de búsqueda por primero el mejor
El patrón de búsqueda por primero el mejor
(buscaPM s o e) es la lista de soluciones del problema de espacio
de estado definido por la función sucesores (s), el objetivo (o) y
estado inicial (e), obtenidas buscando por primero el mejor.
module BusquedaPrimeroElMejor (buscaPM) where
import I1M.ColaDePrioridad
buscaPM :: (Ord nodo) =>
(nodo -> [nodo]) -- sucesores
-> (nodo -> Bool) -- esFinal
-> nodo -- nodo actual
-> [nodo] -- solución
buscaPM sucesores esFinal x = busca' (inserta x vacia)
where
busca' c
| esVacia c = []
| esFinal (primero c)
= (primero c):(busca' (resto c))
| otherwise
= busca' (foldr inserta (resto c) (sucesores x))
where x = primero c
29 / 52
IM Tema 23: Técnicas de diseño descendente de algoritmos
Búsqueda por primero el mejor
El problema del 8 puzzle
Tema 23: Técnicas de diseño descendente de algoritmos
1. La técnica de divide y vencerás
2. Búsqueda en espacios de estados
3. Búsqueda por primero el mejor
El patrón de búsqueda por primero el mejor
El problema del 8 puzzle
4. Búsqueda en escalada
30 / 52
IM Tema 23: Técnicas de diseño descendente de algoritmos
Búsqueda por primero el mejor
El problema del 8 puzzle
El problema del 8 puzzle
Para el 8–puzzle se usa un cajón cuadrado en el que hay situados 8
bloques cuadrados. El cuadrado restante está sin rellenar. Cada
bloque tiene un número. Un bloque adyacente al hueco puede
deslizarse hacia él. El juego consiste en transformar la posición inicial
en la posición final mediante el deslizamiento de los bloques. En
particular, consideramos el estado inicial y final siguientes:
+---+---+---+ +---+---+---+
| 2 | 6 | 3 | | 1 | 2 | 3 |
+---+---+---+ +---+---+---+
| 5 | | 4 | | 8 | | 4 |
+---+---+---+ +---+---+---+
| 1 | 7 | 8 | | 7 | 6 | 5 |
+---+---+---+ +---+---+---+
Estado inicial Estado final
31 / 52
IM Tema 23: Técnicas de diseño descendente de algoritmos
Búsqueda por primero el mejor
El problema del 8 puzzle
El problema del 8 puzzle
Se resolverá mediante primero el mejor.
import I1M.BusquedaPrimeroElMejor
import Data.Array
Una posición es un par de enteros.
type Posicion = (Int,Int)
Un tablero es un vector de posiciones, en el que el índice indica el
elemento que ocupa la posición.
type Tablero = Array Int Posicion
32 / 52
IM Tema 23: Técnicas de diseño descendente de algoritmos
Búsqueda por primero el mejor
El problema del 8 puzzle
El problema del 8 puzzle
inicial8P es el estado inicial del 8 puzzle. En el ejemplo es
+---+---+---+
| 2 | 6 | 3 |
+---+---+---+
| 5 | | 4 |
+---+---+---+
| 1 | 7 | 8 |
+---+---+---+
inicial8P :: Tablero
inicial8P = array (0,8) [(2,(1,3)),(6,(2,3)),(3,(3,3)),
(5,(1,2)),(0,(2,2)),(4,(3,2)),
(1,(1,1)),(7,(2,1)),(8,(3,1))]
33 / 52
IM Tema 23: Técnicas de diseño descendente de algoritmos
Búsqueda por primero el mejor
El problema del 8 puzzle
El problema del 8 puzzle
final8P es el estado final del 8 puzzle. En el ejemplo es
+---+---+---+
| 1 | 2 | 3 |
+---+---+---+
| 8 | | 4 |
+---+---+---+
| 7 | 6 | 5 |
+---+---+---+
final8P :: Tablero
final8P = array (0,8) [(1,(1,3)),(2,(2,3)),(3,(3,3)),
(8,(1,2)),(0,(2,2)),(4,(3,2)),
(7,(1,1)),(6,(2,1)),(5,(3,1))]
34 / 52
IM Tema 23: Técnicas de diseño descendente de algoritmos
Búsqueda por primero el mejor
El problema del 8 puzzle
El problema del 8 puzzle
(distancia p1 p2) es la distancia Manhatan entre las
posiciones p1 y p2. Por ejemplo,
distancia (2,7) (4,1) 8
distancia :: Posicion -> Posicion -> Int
distancia (x1,y1) (x2,y2) = abs (x1-x2) + abs (y1-y2)
(adyacente p1 p2) se verifica si las posiciones p1 y p2 son
adyacentes. Por ejemplo,
adyacente (3,2) (3,1) True
adyacente (3,2) (1,2) False
adyacente :: Posicion -> Posicion -> Bool
adyacente p1 p2 = distancia p1 p2 == 1
35 / 52
IM Tema 23: Técnicas de diseño descendente de algoritmos
Búsqueda por primero el mejor
El problema del 8 puzzle
El problema del 8 puzzle
(todosMovimientos t) es la lista de los tableros obtenidos
aplicándole al tablero t todos los posibles movimientos; es decir,
intercambiando la posición del hueco con sus adyacentes.
todosMovimientos :: Tablero -> [Tablero]
todosMovimientos t =
[t//[(0,t!i),(i,t!0)] | i<-[1..8],
adyacente (t!0) (t!i)]
Los nodos del espacio de estados son listas de tableros
[tn, . . . , t1] tal que ti es un sucesor de ti−1.
data Tableros = Est [Tablero] deriving Show
36 / 52
IM Tema 23: Técnicas de diseño descendente de algoritmos
Búsqueda por primero el mejor
El problema del 8 puzzle
El problema del 8 puzzle
(sucesores8P e) es la lista de sucesores del estado e.
sucesores8P :: Tableros -> [Tableros]
sucesores8P (Est(n@(t:ts))) =
[Est (t':n) | t' <- todosMovimientos t,
t' `notElem` ts]
(esFinal8P n) se verifica si e es un nodo final del 8 puzzle.
esFinal8P :: Tableros -> Bool
esFinal8P (Est (t:_)) = t == final8P
37 / 52
IM Tema 23: Técnicas de diseño descendente de algoritmos
Búsqueda por primero el mejor
El problema del 8 puzzle
El problema del 8 puzzle
(heur1 t) es la suma de la distancia Manhatan desde la
posición de cada objeto del tablero t a su posición en el estado
final. Por ejemplo,
heur1 inicial8P 12
heur1 :: Tablero -> Int
heur1 t =
sum [distancia (t!i) (final8P!i) | i <- [0..8]]
Dos estados se consideran iguales si tienen la misma heurística.
instance Eq Tableros
where Est(t1:_) == Est(t2:_) = heur1 t1 == heur1 t2
38 / 52
IM Tema 23: Técnicas de diseño descendente de algoritmos
Búsqueda por primero el mejor
El problema del 8 puzzle
El problema del 8 puzzle
Un estado es menor o igual que otro si tiene una heurística
menor o igual.
instance Ord Tableros where
Est (t1:_) <= Est (t2:_) = heur1 t1 <= heur1 t2
(buscaPM_8P) es la lista de las soluciones del 8 puzzle por
búsqueda primero el mejor.
buscaPM_8P = buscaPM sucesores8P
esFinal8P
(Est [inicial8P])
39 / 52
IM Tema 23: Técnicas de diseño descendente de algoritmos
Búsqueda en escalada
El patrón de búsqueda en escalada
Tema 23: Técnicas de diseño descendente de algoritmos
1. La técnica de divide y vencerás
2. Búsqueda en espacios de estados
3. Búsqueda por primero el mejor
4. Búsqueda en escalada
El patrón de búsqueda en escalada
El problema del cambio de monedas por escalada
El algoritmo de Prim del árbol de expansión mínimo por
escalada
40 / 52
IM Tema 23: Técnicas de diseño descendente de algoritmos
Búsqueda en escalada
El patrón de búsqueda en escalada
El patrón de búsqueda en escalada
(buscaEscalada s o e) es la lista de soluciones del problema de
espacio de estado definido por la función sucesores (s), el objetivo (o) y
estado inicial (e), obtenidas buscando por escalada.
module BusquedaEnEscalada (buscaEscalada) where
buscaEscalada :: Ord nodo => (nodo -> [nodo])
-> (nodo -> Bool) -> nodo -> [nodo]
buscaEscalada sucesores esFinal x =
busca' (inserta x vacia) where
busca' c
| esVacia c = []
| esFinal (primero c) = [primero c]
| otherwise =
busca' (foldr inserta vacia (sucesores x))
where x = primero c
41 / 52
IM Tema 23: Técnicas de diseño descendente de algoritmos
Búsqueda en escalada
El problema del cambio de monedas por escalada
Tema 23: Técnicas de diseño descendente de algoritmos
1. La técnica de divide y vencerás
2. Búsqueda en espacios de estados
3. Búsqueda por primero el mejor
4. Búsqueda en escalada
El patrón de búsqueda en escalada
El problema del cambio de monedas por escalada
El algoritmo de Prim del árbol de expansión mínimo por
escalada
42 / 52
IM Tema 23: Técnicas de diseño descendente de algoritmos
Búsqueda en escalada
El problema del cambio de monedas por escalada
El problema del cambio de monedas por escalada
El problema del cambio de monedas consiste en determinar cómo
conseguir una cantidad usando el menor número de monedas
disponibles.
Se resolverá por búsqueda en escalada.
import I1M.BusquedaEnEscalada
Las monedas son números enteros.
type Moneda = Int
monedas es la lista del tipo de monedas disponibles. Se supone
que hay un número infinito de monedas de cada tipo.
monedas :: [Moneda]
monedas = [1,2,5,10,20,50,100]
43 / 52
IM Tema 23: Técnicas de diseño descendente de algoritmos
Búsqueda en escalada
El problema del cambio de monedas por escalada
El problema del cambio de monedas por escalada
Las soluciones son listas de monedas.
type Soluciones = [Moneda]
Los estados son pares formados por la cantidad que falta y la
lista de monedas usadas.
type NodoMonedas = (Int, [Moneda])
44 / 52
IM Tema 23: Técnicas de diseño descendente de algoritmos
Búsqueda en escalada
El problema del cambio de monedas por escalada
El problema del cambio de monedas por escalada
(sucesoresMonedas e) es la lista de los sucesores del estado e
en el problema de las monedas. Por ejemplo,
ghci> sucesoresMonedas (199,[])
[(198,[1]),(197,[2]),(194,[5]),(189,[10]),
(179,[20]),(149,[50]),(99,[100])]
sucesoresMonedas :: NodoMonedas -> [NodoMonedas]
sucesoresMonedas (r,p) =
[(r-c,c:p) | c <- monedas, r-c >= 0]
(esFinalMonedas e) se verifica si e es un estado final del
problema de las monedas.
esFinalMonedas :: NodoMonedas -> Bool
esFinalMonedas (v,_) = v==0
45 / 52
IM Tema 23: Técnicas de diseño descendente de algoritmos
Búsqueda en escalada
El problema del cambio de monedas por escalada
El problema del cambio de monedas por escalada
(cambio n) es la solución del problema de las monedas por
búsqueda en escalada. Por ejemplo,
cambio 199 [2,2,5,20,20,50,100]
cambio :: Int -> Soluciones
cambio n =
snd (head (buscaEscalada sucesoresMonedas
esFinalMonedas
(n,[])))
46 / 52
IM Tema 23: Técnicas de diseño descendente de algoritmos
Búsqueda en escalada
El algoritmo de Prim del árbol de expansión mínimo por escalada
Tema 23: Técnicas de diseño descendente de algoritmos
1. La técnica de divide y vencerás
2. Búsqueda en espacios de estados
3. Búsqueda por primero el mejor
4. Búsqueda en escalada
El patrón de búsqueda en escalada
El problema del cambio de monedas por escalada
El algoritmo de Prim del árbol de expansión mínimo por
escalada
47 / 52
IM Tema 23: Técnicas de diseño descendente de algoritmos
Búsqueda en escalada
El algoritmo de Prim del árbol de expansión mínimo por escalada
El algoritmo de Prim del árbol de expansión mínimo por
escalada
Se resolverá mediante búsqueda en escalada.
import I1M.BusquedaEnEscalada
import I1M.Grafo
import Data.Array
import Data.List
Ejemplo de grafo.
g1 :: Grafo Int Int
g1 = creaGrafo D (1,5) [(1,2,12),(1,3,34),(1,5,78),
(2,4,55),(2,5,32),
(3,4,61),(3,5,44),
(4,5,93)]
48 / 52
IM Tema 23: Técnicas de diseño descendente de algoritmos
Búsqueda en escalada
El algoritmo de Prim del árbol de expansión mínimo por escalada
El algoritmo de Prim del árbol de expansión mínimo por
escalada
Una arista esta formada dos nodos junto con su peso.
type Arista a b = (a,a,b)
Un nodo (NodoAEM (p,t,r,aem)) está formado por
el peso p de la última arista añadida el árbol de expansión mínimo
(aem),
la lista t de nodos del grafo que están en el aem,
la lista r de nodos del grafo que no están en el aem y
el aem.
type NodoAEM a b = (b,[a],[a],[Arista a b])
49 / 52
IM Tema 23: Técnicas de diseño descendente de algoritmos
Búsqueda en escalada
El algoritmo de Prim del árbol de expansión mínimo por escalada
El algoritmo de Prim del árbol de expansión mínimo por
escalada
(sucesoresAEM g n) es la lista de los sucesores del nodo n en el
grafo g. Por ejemplo,
ghci> sucesoresAEM g1 (0,[1],[2..5],[])
[(12,[2,1],[3,4,5],[(1,2,12)]),
(34,[3,1],[2,4,5],[(1,3,34)]),
(78,[5,1],[2,3,4],[(1,5,78)])]
sucesoresAEM :: (Ix a,Num b) => (Grafo a b) -> (NodoAEM a b)
-> [(NodoAEM a b)]
sucesoresAEM g (_,t,r,aem) =
[(peso x y g, (y:t), delete y r, (x,y,peso x y g):aem)
| x <- t , y <- r, aristaEn g (x,y)]
50 / 52
IM Tema 23: Técnicas de diseño descendente de algoritmos
Búsqueda en escalada
El algoritmo de Prim del árbol de expansión mínimo por escalada
El algoritmo de Prim del árbol de expansión mínimo por
escalada
(esFinalAEM n) se verifica si n es un estado final; es decir, si
no queda ningún elemento en la lista de nodos sin colocar en el
árbol de expansión mínimo.
esFinalAEM (_,_,[],_) = True
esFinalAEM _ = False
51 / 52
IM Tema 23: Técnicas de diseño descendente de algoritmos
Búsqueda en escalada
El algoritmo de Prim del árbol de expansión mínimo por escalada
El algoritmo de Prim del árbol de expansión mínimo por
escalada
(prim g) es el árbol de expansión mínimo del grafo g, por el
algoritmo de Prim como búsqueda en escalada. Por ejemplo,
prim g1 [(2,4,55),(1,3,34),(2,5,32),(1,2,12)]
prim g = sol
where [(_,_,_,sol)] = buscaEscalada (sucesoresAEM g)
esFinalAEM
(0,[n],ns,[])
(n:ns) = nodos g
52 / 52

Contenu connexe

Tendances

S1 4 ejercicios_integrales_basicas
S1 4 ejercicios_integrales_basicasS1 4 ejercicios_integrales_basicas
S1 4 ejercicios_integrales_basicasjesquerrev1
 
CÁLCULO INTEGRAL. CAPÍTULO 4. DERIVACIÓN Y DIFERENCIACIÓN DE FUNCIONES ESCALA...
CÁLCULO INTEGRAL. CAPÍTULO 4. DERIVACIÓN Y DIFERENCIACIÓN DE FUNCIONES ESCALA...CÁLCULO INTEGRAL. CAPÍTULO 4. DERIVACIÓN Y DIFERENCIACIÓN DE FUNCIONES ESCALA...
CÁLCULO INTEGRAL. CAPÍTULO 4. DERIVACIÓN Y DIFERENCIACIÓN DE FUNCIONES ESCALA...Pablo García y Colomé
 
S1 4 ejercicios_integrales_basicas
S1 4 ejercicios_integrales_basicasS1 4 ejercicios_integrales_basicas
S1 4 ejercicios_integrales_basicasjesquerrev1
 
Problemasjava2
Problemasjava2Problemasjava2
Problemasjava2Aldahir IS
 
Cálculo integral. Capítulo 2. Las integrales definida e indefinida
Cálculo integral. Capítulo 2. Las integrales definida e indefinidaCálculo integral. Capítulo 2. Las integrales definida e indefinida
Cálculo integral. Capítulo 2. Las integrales definida e indefinidaPablo García y Colomé
 
Alg(2) 4° 2 b
Alg(2) 4° 2 bAlg(2) 4° 2 b
Alg(2) 4° 2 b349juan
 
Concavidad puntos de inflexión asintotas
Concavidad puntos de inflexión asintotasConcavidad puntos de inflexión asintotas
Concavidad puntos de inflexión asintotasfreddy remache
 
Unidad nº funciones 1º parte
Unidad nº funciones 1º parteUnidad nº funciones 1º parte
Unidad nº funciones 1º parteMiguel Rodriguez
 
Solucionario mt 054 2011 75 preguntas ok
Solucionario mt 054 2011 75 preguntas okSolucionario mt 054 2011 75 preguntas ok
Solucionario mt 054 2011 75 preguntas okjuanlarasoto
 
Funciones resueltos
Funciones resueltosFunciones resueltos
Funciones resueltosElvis Valera
 
Maximos y minimos
Maximos y minimosMaximos y minimos
Maximos y minimosuagrm
 
Clase integracion matlab
Clase integracion matlabClase integracion matlab
Clase integracion matlabdhanniell
 

Tendances (20)

S1 4 ejercicios_integrales_basicas
S1 4 ejercicios_integrales_basicasS1 4 ejercicios_integrales_basicas
S1 4 ejercicios_integrales_basicas
 
Capítulo 2. Funciones
Capítulo 2. FuncionesCapítulo 2. Funciones
Capítulo 2. Funciones
 
S1 1 derivadas
S1 1 derivadasS1 1 derivadas
S1 1 derivadas
 
CÁLCULO INTEGRAL. CAPÍTULO 4. DERIVACIÓN Y DIFERENCIACIÓN DE FUNCIONES ESCALA...
CÁLCULO INTEGRAL. CAPÍTULO 4. DERIVACIÓN Y DIFERENCIACIÓN DE FUNCIONES ESCALA...CÁLCULO INTEGRAL. CAPÍTULO 4. DERIVACIÓN Y DIFERENCIACIÓN DE FUNCIONES ESCALA...
CÁLCULO INTEGRAL. CAPÍTULO 4. DERIVACIÓN Y DIFERENCIACIÓN DE FUNCIONES ESCALA...
 
S1 4 ejercicios_integrales_basicas
S1 4 ejercicios_integrales_basicasS1 4 ejercicios_integrales_basicas
S1 4 ejercicios_integrales_basicas
 
Problemasjava2
Problemasjava2Problemasjava2
Problemasjava2
 
Cálculo integral. Capítulo 2. Las integrales definida e indefinida
Cálculo integral. Capítulo 2. Las integrales definida e indefinidaCálculo integral. Capítulo 2. Las integrales definida e indefinida
Cálculo integral. Capítulo 2. Las integrales definida e indefinida
 
Alg(2) 4° 2 b
Alg(2) 4° 2 bAlg(2) 4° 2 b
Alg(2) 4° 2 b
 
Concavidad puntos de inflexión asintotas
Concavidad puntos de inflexión asintotasConcavidad puntos de inflexión asintotas
Concavidad puntos de inflexión asintotas
 
Unidad nº funciones 1º parte
Unidad nº funciones 1º parteUnidad nº funciones 1º parte
Unidad nº funciones 1º parte
 
Solucionario mt 054 2011 75 preguntas ok
Solucionario mt 054 2011 75 preguntas okSolucionario mt 054 2011 75 preguntas ok
Solucionario mt 054 2011 75 preguntas ok
 
2004 iii 14 funciones
2004 iii 14 funciones2004 iii 14 funciones
2004 iii 14 funciones
 
Blog
BlogBlog
Blog
 
Blog
BlogBlog
Blog
 
Funciones resueltos
Funciones resueltosFunciones resueltos
Funciones resueltos
 
Mat lab03
Mat lab03Mat lab03
Mat lab03
 
Tic9°
Tic9°Tic9°
Tic9°
 
Derivadas
DerivadasDerivadas
Derivadas
 
Maximos y minimos
Maximos y minimosMaximos y minimos
Maximos y minimos
 
Clase integracion matlab
Clase integracion matlabClase integracion matlab
Clase integracion matlab
 

Similaire à Algoritmos descendentes técnicas divide vencerás

Similaire à Algoritmos descendentes técnicas divide vencerás (20)

I1M2010-T23: Técnicas de diseño descendente de algoritmos.
I1M2010-T23: Técnicas de diseño descendente de algoritmos.I1M2010-T23: Técnicas de diseño descendente de algoritmos.
I1M2010-T23: Técnicas de diseño descendente de algoritmos.
 
Resvecmat
ResvecmatResvecmat
Resvecmat
 
Res vecmat8
Res vecmat8Res vecmat8
Res vecmat8
 
Divide y Venceras
Divide y VencerasDivide y Venceras
Divide y Venceras
 
Sistema de ecuaciones lineales
Sistema de ecuaciones linealesSistema de ecuaciones lineales
Sistema de ecuaciones lineales
 
Competencia 4
Competencia 4Competencia 4
Competencia 4
 
Inecuaciones de primer grado
Inecuaciones de primer gradoInecuaciones de primer grado
Inecuaciones de primer grado
 
Trabajofinal.ht
Trabajofinal.htTrabajofinal.ht
Trabajofinal.ht
 
Trabajofinal.ht
Trabajofinal.htTrabajofinal.ht
Trabajofinal.ht
 
Mate 3 consignas bloque 1 2016
Mate 3 consignas bloque 1 2016Mate 3 consignas bloque 1 2016
Mate 3 consignas bloque 1 2016
 
Recursividad
RecursividadRecursividad
Recursividad
 
SISTEMA DE ECUACIONES CUADRATICAS
SISTEMA DE ECUACIONES CUADRATICAS SISTEMA DE ECUACIONES CUADRATICAS
SISTEMA DE ECUACIONES CUADRATICAS
 
Back Tracking
Back TrackingBack Tracking
Back Tracking
 
Guía de clase, bloque 2, tercer grado
Guía de clase, bloque 2, tercer gradoGuía de clase, bloque 2, tercer grado
Guía de clase, bloque 2, tercer grado
 
Guía de matemáticas de 3 grado bloque 2
Guía de matemáticas de 3 grado bloque 2Guía de matemáticas de 3 grado bloque 2
Guía de matemáticas de 3 grado bloque 2
 
Ejemplos de algoritmos
Ejemplos de algoritmosEjemplos de algoritmos
Ejemplos de algoritmos
 
Actividades 1ª evaluación
Actividades 1ª evaluaciónActividades 1ª evaluación
Actividades 1ª evaluación
 
Actividades 1ª evaluación
Actividades 1ª evaluaciónActividades 1ª evaluación
Actividades 1ª evaluación
 
Ejemplos de algoritmos
Ejemplos de algoritmosEjemplos de algoritmos
Ejemplos de algoritmos
 
11°letra
11°letra11°letra
11°letra
 

Plus de José A. Alonso

Tema 12: Analizadores sintácticos funcionales.
Tema 12: Analizadores sintácticos funcionales.Tema 12: Analizadores sintácticos funcionales.
Tema 12: Analizadores sintácticos funcionales.José A. Alonso
 
I1M-T19: El TAD de los árboles de búsqueda
I1M-T19: El TAD de los árboles de búsquedaI1M-T19: El TAD de los árboles de búsqueda
I1M-T19: El TAD de los árboles de búsquedaJosé A. Alonso
 
LMF-T6: Sintaxis y semántica de la lógica de primer orden
LMF-T6: Sintaxis y semántica de la lógica de primer ordenLMF-T6: Sintaxis y semántica de la lógica de primer orden
LMF-T6: Sintaxis y semántica de la lógica de primer ordenJosé A. Alonso
 
LMF-T6: Sintaxis y semántica de la lógica de primer orden
LMF-T6: Sintaxis y semántica de la lógica de primer ordenLMF-T6: Sintaxis y semántica de la lógica de primer orden
LMF-T6: Sintaxis y semántica de la lógica de primer ordenJosé A. Alonso
 
LMF-T5b: Aplicaciones de la lógica proposicional
LMF-T5b: Aplicaciones de la lógica proposicionalLMF-T5b: Aplicaciones de la lógica proposicional
LMF-T5b: Aplicaciones de la lógica proposicionalJosé A. Alonso
 
LMF-T5: Resolución proposicional
LMF-T5: Resolución proposicionalLMF-T5: Resolución proposicional
LMF-T5: Resolución proposicionalJosé A. Alonso
 
LMF-T3: Tableros semánticos
LMF-T3: Tableros semánticosLMF-T3: Tableros semánticos
LMF-T3: Tableros semánticosJosé A. Alonso
 
LMF-T2: Deducción natural proposicional
LMF-T2: Deducción natural proposicionalLMF-T2: Deducción natural proposicional
LMF-T2: Deducción natural proposicionalJosé A. Alonso
 
I1M-T21: El TAD de los polinomios en Haskell
I1M-T21: El TAD de los polinomios en HaskellI1M-T21: El TAD de los polinomios en Haskell
I1M-T21: El TAD de los polinomios en HaskellJosé A. Alonso
 
LMF-T1: Sintaxis y semántica de la lógica proposicional
LMF-T1: Sintaxis y semántica de la lógica proposicionalLMF-T1: Sintaxis y semántica de la lógica proposicional
LMF-T1: Sintaxis y semántica de la lógica proposicionalJosé A. Alonso
 
LI-T12: LI2011-12: Introducción a la programación lógica con Prolog
LI-T12: LI2011-12: Introducción a la programación lógica con PrologLI-T12: LI2011-12: Introducción a la programación lógica con Prolog
LI-T12: LI2011-12: Introducción a la programación lógica con PrologJosé A. Alonso
 
LI-T6: Sintaxis y semántica de la lógica de primer orden
LI-T6: Sintaxis y semántica de la lógica de primer ordenLI-T6: Sintaxis y semántica de la lógica de primer orden
LI-T6: Sintaxis y semántica de la lógica de primer ordenJosé A. Alonso
 
LI-T5b: Algoritmos para SAT. Aplicaciones
LI-T5b: Algoritmos para SAT. AplicacionesLI-T5b: Algoritmos para SAT. Aplicaciones
LI-T5b: Algoritmos para SAT. AplicacionesJosé A. Alonso
 
Panorama del razonamiento automático
Panorama del razonamiento automáticoPanorama del razonamiento automático
Panorama del razonamiento automáticoJosé A. Alonso
 
LI -T5: Resolución proposicional
LI -T5: Resolución proposicionalLI -T5: Resolución proposicional
LI -T5: Resolución proposicionalJosé A. Alonso
 
I1M2010-T24: Programación dinámica en Haskell
I1M2010-T24: Programación dinámica en HaskellI1M2010-T24: Programación dinámica en Haskell
I1M2010-T24: Programación dinámica en HaskellJosé A. Alonso
 
LI2011-T11: Resolución en lógica de primer orden
LI2011-T11: Resolución en lógica de primer ordenLI2011-T11: Resolución en lógica de primer orden
LI2011-T11: Resolución en lógica de primer ordenJosé A. Alonso
 
LI2011-T9: Formas normales de Skolem y cláusulas
LI2011-T9: Formas normales de Skolem y cláusulasLI2011-T9: Formas normales de Skolem y cláusulas
LI2011-T9: Formas normales de Skolem y cláusulasJosé A. Alonso
 
LI2011-T7: Deducción natural en lógica de primer orden
LI2011-T7: Deducción natural en lógica de primer ordenLI2011-T7: Deducción natural en lógica de primer orden
LI2011-T7: Deducción natural en lógica de primer ordenJosé A. Alonso
 

Plus de José A. Alonso (20)

Tema 12: Analizadores sintácticos funcionales.
Tema 12: Analizadores sintácticos funcionales.Tema 12: Analizadores sintácticos funcionales.
Tema 12: Analizadores sintácticos funcionales.
 
I1M-T19: El TAD de los árboles de búsqueda
I1M-T19: El TAD de los árboles de búsquedaI1M-T19: El TAD de los árboles de búsqueda
I1M-T19: El TAD de los árboles de búsqueda
 
LMF-T6: Sintaxis y semántica de la lógica de primer orden
LMF-T6: Sintaxis y semántica de la lógica de primer ordenLMF-T6: Sintaxis y semántica de la lógica de primer orden
LMF-T6: Sintaxis y semántica de la lógica de primer orden
 
LMF-T6: Sintaxis y semántica de la lógica de primer orden
LMF-T6: Sintaxis y semántica de la lógica de primer ordenLMF-T6: Sintaxis y semántica de la lógica de primer orden
LMF-T6: Sintaxis y semántica de la lógica de primer orden
 
LMF-T5b: Aplicaciones de la lógica proposicional
LMF-T5b: Aplicaciones de la lógica proposicionalLMF-T5b: Aplicaciones de la lógica proposicional
LMF-T5b: Aplicaciones de la lógica proposicional
 
LMF-T5: Resolución proposicional
LMF-T5: Resolución proposicionalLMF-T5: Resolución proposicional
LMF-T5: Resolución proposicional
 
LMF-T4: Formas normales
LMF-T4: Formas normalesLMF-T4: Formas normales
LMF-T4: Formas normales
 
LMF-T3: Tableros semánticos
LMF-T3: Tableros semánticosLMF-T3: Tableros semánticos
LMF-T3: Tableros semánticos
 
LMF-T2: Deducción natural proposicional
LMF-T2: Deducción natural proposicionalLMF-T2: Deducción natural proposicional
LMF-T2: Deducción natural proposicional
 
I1M-T21: El TAD de los polinomios en Haskell
I1M-T21: El TAD de los polinomios en HaskellI1M-T21: El TAD de los polinomios en Haskell
I1M-T21: El TAD de los polinomios en Haskell
 
LMF-T1: Sintaxis y semántica de la lógica proposicional
LMF-T1: Sintaxis y semántica de la lógica proposicionalLMF-T1: Sintaxis y semántica de la lógica proposicional
LMF-T1: Sintaxis y semántica de la lógica proposicional
 
LI-T12: LI2011-12: Introducción a la programación lógica con Prolog
LI-T12: LI2011-12: Introducción a la programación lógica con PrologLI-T12: LI2011-12: Introducción a la programación lógica con Prolog
LI-T12: LI2011-12: Introducción a la programación lógica con Prolog
 
LI-T6: Sintaxis y semántica de la lógica de primer orden
LI-T6: Sintaxis y semántica de la lógica de primer ordenLI-T6: Sintaxis y semántica de la lógica de primer orden
LI-T6: Sintaxis y semántica de la lógica de primer orden
 
LI-T5b: Algoritmos para SAT. Aplicaciones
LI-T5b: Algoritmos para SAT. AplicacionesLI-T5b: Algoritmos para SAT. Aplicaciones
LI-T5b: Algoritmos para SAT. Aplicaciones
 
Panorama del razonamiento automático
Panorama del razonamiento automáticoPanorama del razonamiento automático
Panorama del razonamiento automático
 
LI -T5: Resolución proposicional
LI -T5: Resolución proposicionalLI -T5: Resolución proposicional
LI -T5: Resolución proposicional
 
I1M2010-T24: Programación dinámica en Haskell
I1M2010-T24: Programación dinámica en HaskellI1M2010-T24: Programación dinámica en Haskell
I1M2010-T24: Programación dinámica en Haskell
 
LI2011-T11: Resolución en lógica de primer orden
LI2011-T11: Resolución en lógica de primer ordenLI2011-T11: Resolución en lógica de primer orden
LI2011-T11: Resolución en lógica de primer orden
 
LI2011-T9: Formas normales de Skolem y cláusulas
LI2011-T9: Formas normales de Skolem y cláusulasLI2011-T9: Formas normales de Skolem y cláusulas
LI2011-T9: Formas normales de Skolem y cláusulas
 
LI2011-T7: Deducción natural en lógica de primer orden
LI2011-T7: Deducción natural en lógica de primer ordenLI2011-T7: Deducción natural en lógica de primer orden
LI2011-T7: Deducción natural en lógica de primer orden
 

Dernier

HISPANIDAD - La cultura común de la HISPANOAMERICA
HISPANIDAD - La cultura común de la HISPANOAMERICAHISPANIDAD - La cultura común de la HISPANOAMERICA
HISPANIDAD - La cultura común de la HISPANOAMERICAJesus Gonzalez Losada
 
Amor o egoísmo, esa es la cuestión por definir.pdf
Amor o egoísmo, esa es la cuestión por definir.pdfAmor o egoísmo, esa es la cuestión por definir.pdf
Amor o egoísmo, esa es la cuestión por definir.pdfAlejandrino Halire Ccahuana
 
CUADERNILLO DE EJERCICIOS PARA EL TERCER TRIMESTRE, SEXTO GRADO
CUADERNILLO DE EJERCICIOS PARA EL TERCER TRIMESTRE, SEXTO GRADOCUADERNILLO DE EJERCICIOS PARA EL TERCER TRIMESTRE, SEXTO GRADO
CUADERNILLO DE EJERCICIOS PARA EL TERCER TRIMESTRE, SEXTO GRADOEveliaHernandez8
 
SISTEMA INMUNE FISIOLOGIA MEDICA UNSL 2024
SISTEMA INMUNE FISIOLOGIA MEDICA UNSL 2024SISTEMA INMUNE FISIOLOGIA MEDICA UNSL 2024
SISTEMA INMUNE FISIOLOGIA MEDICA UNSL 2024gharce
 
IV SES LUN 15 TUTO CUIDO MI MENTE CUIDANDO MI CUERPO YESSENIA 933623393 NUEV...
IV SES LUN 15 TUTO CUIDO MI MENTE CUIDANDO MI CUERPO  YESSENIA 933623393 NUEV...IV SES LUN 15 TUTO CUIDO MI MENTE CUIDANDO MI CUERPO  YESSENIA 933623393 NUEV...
IV SES LUN 15 TUTO CUIDO MI MENTE CUIDANDO MI CUERPO YESSENIA 933623393 NUEV...YobanaZevallosSantil1
 
5° Proyecto 13 Cuadernillo para proyectos
5° Proyecto 13 Cuadernillo para proyectos5° Proyecto 13 Cuadernillo para proyectos
5° Proyecto 13 Cuadernillo para proyectosTrishGutirrez
 
Acuerdo 05_04_24 Lineamientos del CTE.pdf
Acuerdo 05_04_24 Lineamientos del CTE.pdfAcuerdo 05_04_24 Lineamientos del CTE.pdf
Acuerdo 05_04_24 Lineamientos del CTE.pdfmiriamguevara21
 
El PROGRAMA DE TUTORÍAS PARA EL APRENDIZAJE Y LA FORMACIÓN INTEGRAL PTA/F
El PROGRAMA DE TUTORÍAS PARA EL APRENDIZAJE Y LA FORMACIÓN INTEGRAL PTA/FEl PROGRAMA DE TUTORÍAS PARA EL APRENDIZAJE Y LA FORMACIÓN INTEGRAL PTA/F
El PROGRAMA DE TUTORÍAS PARA EL APRENDIZAJE Y LA FORMACIÓN INTEGRAL PTA/FJulio Lozano
 
Fichas de MatemáticA QUINTO DE SECUNDARIA).pdf
Fichas de MatemáticA QUINTO DE SECUNDARIA).pdfFichas de MatemáticA QUINTO DE SECUNDARIA).pdf
Fichas de MatemáticA QUINTO DE SECUNDARIA).pdfssuser50d1252
 
4° UNIDAD 2 SALUD,ALIMENTACIÓN Y DÍA DE LA MADRE 933623393 PROF YESSENIA CN.docx
4° UNIDAD 2 SALUD,ALIMENTACIÓN Y DÍA DE LA MADRE 933623393 PROF YESSENIA CN.docx4° UNIDAD 2 SALUD,ALIMENTACIÓN Y DÍA DE LA MADRE 933623393 PROF YESSENIA CN.docx
4° UNIDAD 2 SALUD,ALIMENTACIÓN Y DÍA DE LA MADRE 933623393 PROF YESSENIA CN.docxMagalyDacostaPea
 
Secuencia didáctica.DOÑA CLEMENTINA.2024.docx
Secuencia didáctica.DOÑA CLEMENTINA.2024.docxSecuencia didáctica.DOÑA CLEMENTINA.2024.docx
Secuencia didáctica.DOÑA CLEMENTINA.2024.docxNataliaGonzalez619348
 
DIDÁCTICA DE LA EDUCACIÓN SUPERIOR- DR LENIN CARI MOGROVEJO
DIDÁCTICA DE LA EDUCACIÓN SUPERIOR- DR LENIN CARI MOGROVEJODIDÁCTICA DE LA EDUCACIÓN SUPERIOR- DR LENIN CARI MOGROVEJO
DIDÁCTICA DE LA EDUCACIÓN SUPERIOR- DR LENIN CARI MOGROVEJOLeninCariMogrovejo
 
PÉNSUM ENFERMERIA 2024 - ECUGENIUS S.A. V2
PÉNSUM ENFERMERIA 2024 - ECUGENIUS S.A. V2PÉNSUM ENFERMERIA 2024 - ECUGENIUS S.A. V2
PÉNSUM ENFERMERIA 2024 - ECUGENIUS S.A. V2Eliseo Delgado
 
libro grafismo fonético guía de uso para el lenguaje
libro grafismo fonético guía de uso para el lenguajelibro grafismo fonético guía de uso para el lenguaje
libro grafismo fonético guía de uso para el lenguajeKattyMoran3
 
4° SES MATE DESCOMP. ADIT. DE NUMEROS SOBRE CASOS DE DENGUE 9-4-24 (1).docx
4° SES MATE DESCOMP. ADIT. DE NUMEROS SOBRE CASOS DE DENGUE     9-4-24 (1).docx4° SES MATE DESCOMP. ADIT. DE NUMEROS SOBRE CASOS DE DENGUE     9-4-24 (1).docx
4° SES MATE DESCOMP. ADIT. DE NUMEROS SOBRE CASOS DE DENGUE 9-4-24 (1).docxMagalyDacostaPea
 
LOS AMBIENTALISTAS todo por un mundo mejor
LOS AMBIENTALISTAS todo por un mundo mejorLOS AMBIENTALISTAS todo por un mundo mejor
LOS AMBIENTALISTAS todo por un mundo mejormrcrmnrojasgarcia
 
Si cuidamos el mundo, tendremos un mundo mejor.
Si cuidamos el mundo, tendremos un mundo mejor.Si cuidamos el mundo, tendremos un mundo mejor.
Si cuidamos el mundo, tendremos un mundo mejor.monthuerta17
 

Dernier (20)

HISPANIDAD - La cultura común de la HISPANOAMERICA
HISPANIDAD - La cultura común de la HISPANOAMERICAHISPANIDAD - La cultura común de la HISPANOAMERICA
HISPANIDAD - La cultura común de la HISPANOAMERICA
 
Amor o egoísmo, esa es la cuestión por definir.pdf
Amor o egoísmo, esa es la cuestión por definir.pdfAmor o egoísmo, esa es la cuestión por definir.pdf
Amor o egoísmo, esa es la cuestión por definir.pdf
 
CUADERNILLO DE EJERCICIOS PARA EL TERCER TRIMESTRE, SEXTO GRADO
CUADERNILLO DE EJERCICIOS PARA EL TERCER TRIMESTRE, SEXTO GRADOCUADERNILLO DE EJERCICIOS PARA EL TERCER TRIMESTRE, SEXTO GRADO
CUADERNILLO DE EJERCICIOS PARA EL TERCER TRIMESTRE, SEXTO GRADO
 
SISTEMA INMUNE FISIOLOGIA MEDICA UNSL 2024
SISTEMA INMUNE FISIOLOGIA MEDICA UNSL 2024SISTEMA INMUNE FISIOLOGIA MEDICA UNSL 2024
SISTEMA INMUNE FISIOLOGIA MEDICA UNSL 2024
 
IV SES LUN 15 TUTO CUIDO MI MENTE CUIDANDO MI CUERPO YESSENIA 933623393 NUEV...
IV SES LUN 15 TUTO CUIDO MI MENTE CUIDANDO MI CUERPO  YESSENIA 933623393 NUEV...IV SES LUN 15 TUTO CUIDO MI MENTE CUIDANDO MI CUERPO  YESSENIA 933623393 NUEV...
IV SES LUN 15 TUTO CUIDO MI MENTE CUIDANDO MI CUERPO YESSENIA 933623393 NUEV...
 
5° Proyecto 13 Cuadernillo para proyectos
5° Proyecto 13 Cuadernillo para proyectos5° Proyecto 13 Cuadernillo para proyectos
5° Proyecto 13 Cuadernillo para proyectos
 
Acuerdo 05_04_24 Lineamientos del CTE.pdf
Acuerdo 05_04_24 Lineamientos del CTE.pdfAcuerdo 05_04_24 Lineamientos del CTE.pdf
Acuerdo 05_04_24 Lineamientos del CTE.pdf
 
El PROGRAMA DE TUTORÍAS PARA EL APRENDIZAJE Y LA FORMACIÓN INTEGRAL PTA/F
El PROGRAMA DE TUTORÍAS PARA EL APRENDIZAJE Y LA FORMACIÓN INTEGRAL PTA/FEl PROGRAMA DE TUTORÍAS PARA EL APRENDIZAJE Y LA FORMACIÓN INTEGRAL PTA/F
El PROGRAMA DE TUTORÍAS PARA EL APRENDIZAJE Y LA FORMACIÓN INTEGRAL PTA/F
 
Fichas de MatemáticA QUINTO DE SECUNDARIA).pdf
Fichas de MatemáticA QUINTO DE SECUNDARIA).pdfFichas de MatemáticA QUINTO DE SECUNDARIA).pdf
Fichas de MatemáticA QUINTO DE SECUNDARIA).pdf
 
¿Amor o egoísmo? Esa es la cuestión.pptx
¿Amor o egoísmo? Esa es la cuestión.pptx¿Amor o egoísmo? Esa es la cuestión.pptx
¿Amor o egoísmo? Esa es la cuestión.pptx
 
4° UNIDAD 2 SALUD,ALIMENTACIÓN Y DÍA DE LA MADRE 933623393 PROF YESSENIA CN.docx
4° UNIDAD 2 SALUD,ALIMENTACIÓN Y DÍA DE LA MADRE 933623393 PROF YESSENIA CN.docx4° UNIDAD 2 SALUD,ALIMENTACIÓN Y DÍA DE LA MADRE 933623393 PROF YESSENIA CN.docx
4° UNIDAD 2 SALUD,ALIMENTACIÓN Y DÍA DE LA MADRE 933623393 PROF YESSENIA CN.docx
 
Secuencia didáctica.DOÑA CLEMENTINA.2024.docx
Secuencia didáctica.DOÑA CLEMENTINA.2024.docxSecuencia didáctica.DOÑA CLEMENTINA.2024.docx
Secuencia didáctica.DOÑA CLEMENTINA.2024.docx
 
DIDÁCTICA DE LA EDUCACIÓN SUPERIOR- DR LENIN CARI MOGROVEJO
DIDÁCTICA DE LA EDUCACIÓN SUPERIOR- DR LENIN CARI MOGROVEJODIDÁCTICA DE LA EDUCACIÓN SUPERIOR- DR LENIN CARI MOGROVEJO
DIDÁCTICA DE LA EDUCACIÓN SUPERIOR- DR LENIN CARI MOGROVEJO
 
PÉNSUM ENFERMERIA 2024 - ECUGENIUS S.A. V2
PÉNSUM ENFERMERIA 2024 - ECUGENIUS S.A. V2PÉNSUM ENFERMERIA 2024 - ECUGENIUS S.A. V2
PÉNSUM ENFERMERIA 2024 - ECUGENIUS S.A. V2
 
Aedes aegypti + Intro to Coquies EE.pptx
Aedes aegypti + Intro to Coquies EE.pptxAedes aegypti + Intro to Coquies EE.pptx
Aedes aegypti + Intro to Coquies EE.pptx
 
libro grafismo fonético guía de uso para el lenguaje
libro grafismo fonético guía de uso para el lenguajelibro grafismo fonético guía de uso para el lenguaje
libro grafismo fonético guía de uso para el lenguaje
 
Sesión ¿Amor o egoísmo? Esa es la cuestión
Sesión  ¿Amor o egoísmo? Esa es la cuestiónSesión  ¿Amor o egoísmo? Esa es la cuestión
Sesión ¿Amor o egoísmo? Esa es la cuestión
 
4° SES MATE DESCOMP. ADIT. DE NUMEROS SOBRE CASOS DE DENGUE 9-4-24 (1).docx
4° SES MATE DESCOMP. ADIT. DE NUMEROS SOBRE CASOS DE DENGUE     9-4-24 (1).docx4° SES MATE DESCOMP. ADIT. DE NUMEROS SOBRE CASOS DE DENGUE     9-4-24 (1).docx
4° SES MATE DESCOMP. ADIT. DE NUMEROS SOBRE CASOS DE DENGUE 9-4-24 (1).docx
 
LOS AMBIENTALISTAS todo por un mundo mejor
LOS AMBIENTALISTAS todo por un mundo mejorLOS AMBIENTALISTAS todo por un mundo mejor
LOS AMBIENTALISTAS todo por un mundo mejor
 
Si cuidamos el mundo, tendremos un mundo mejor.
Si cuidamos el mundo, tendremos un mundo mejor.Si cuidamos el mundo, tendremos un mundo mejor.
Si cuidamos el mundo, tendremos un mundo mejor.
 

Algoritmos descendentes técnicas divide vencerás

  • 1. Tema 23: Técnicas de diseño descendente de algoritmos Informática (2014–15) José A. Alonso Jiménez Grupo de Lógica Computacional Departamento de Ciencias de la Computación e I.A. Universidad de Sevilla
  • 2. IM Tema 23: Técnicas de diseño descendente de algoritmos Tema 23: Técnicas de diseño descendente de algoritmos 1. La técnica de divide y vencerás La técnica de divide y vencerás La ordenación por mezcla como ejemplo de DyV La ordenación rápida como ejemplo de DyV 2. Búsqueda en espacios de estados El patrón de búsqueda en espacios de estados El problema de las n reinas El problema de la mochila 3. Búsqueda por primero el mejor El patrón de búsqueda por primero el mejor El problema del 8 puzzle 4. Búsqueda en escalada El patrón de búsqueda en escalada El problema del cambio de monedas por escalada El algoritmo de Prim del árbol de expansión mínimo por escalada 2 / 52
  • 3. IM Tema 23: Técnicas de diseño descendente de algoritmos La técnica de divide y vencerás La técnica de divide y vencerás Tema 23: Técnicas de diseño descendente de algoritmos 1. La técnica de divide y vencerás La técnica de divide y vencerás La ordenación por mezcla como ejemplo de DyV La ordenación rápida como ejemplo de DyV 2. Búsqueda en espacios de estados 3. Búsqueda por primero el mejor 4. Búsqueda en escalada 3 / 52
  • 4. IM Tema 23: Técnicas de diseño descendente de algoritmos La técnica de divide y vencerás La técnica de divide y vencerás La técnica de divide y vencerás La técnica divide y vencerás consta de los siguientes pasos: 1. Dividir el problema en subproblemas menores. 2. Resolver por separado cada uno de los subproblemas: si los subproblemas son complejos, usar la misma técnica recursivamente; si son simples, resolverlos directamente. 3. Combinar todas las soluciones de los subproblemas en una solución simple. 4 / 52
  • 5. IM Tema 23: Técnicas de diseño descendente de algoritmos La técnica de divide y vencerás La técnica de divide y vencerás La técnica de divide y vencerás (divideVenceras ind resuelve divide combina pbInicial) resuelve el problema pbInicial mediante la técnica de divide y vencerás, donde (ind pb) se verifica si el problema pb es indivisible, (resuelve pb) es la solución del problema indivisible pb, (divide pb) es la lista de subproblemas de pb, (combina pb ss) es la combinación de las soluciones ss de los subproblemas del problema pb y pbInicial es el problema inicial. module DivideVenceras (divideVenceras) where divideVenceras :: (p -> Bool) -> (p -> s) -> (p -> [p]) -> (p -> [s] -> s) -> p -> s divideVenceras ind resuelve divide combina pbInicial = dv' pbInicial where dv' pb | ind pb = resuelve pb | otherwise = combina pb [dv' sp | sp <- divide pb] 5 / 52
  • 6. IM Tema 23: Técnicas de diseño descendente de algoritmos La técnica de divide y vencerás La ordenación por mezcla como ejemplo de DyV Tema 23: Técnicas de diseño descendente de algoritmos 1. La técnica de divide y vencerás La técnica de divide y vencerás La ordenación por mezcla como ejemplo de DyV La ordenación rápida como ejemplo de DyV 2. Búsqueda en espacios de estados 3. Búsqueda por primero el mejor 4. Búsqueda en escalada 6 / 52
  • 7. IM Tema 23: Técnicas de diseño descendente de algoritmos La técnica de divide y vencerás La ordenación por mezcla como ejemplo de DyV La ordenación por mezcla como ejemplo de DyV (ordenaPorMezcla xs) es la lista obtenida ordenando xs por el procedimiento de ordenación por mezcla. Por ejemplo, ghci> ordenaPorMezcla [3,1,4,1,5,9,2,8] [1,1,2,3,4,5,8,9] import I1M.DivideVenceras ordenaPorMezcla :: Ord a => [a] -> [a] ordenaPorMezcla xs = divideVenceras ind id divide combina xs where ind xs = length xs <= 1 divide xs = [take n xs, drop n xs] where n = length xs `div` 2 combina _ [l1,l2] = mezcla l1 l2 7 / 52
  • 8. IM Tema 23: Técnicas de diseño descendente de algoritmos La técnica de divide y vencerás La ordenación por mezcla como ejemplo de DyV La ordenación por mezcla como ejemplo de DyV (mezcla xs ys) es la lista obtenida mezclando xs e ys. Por ejemplo, mezcla [1,3] [2,4,6] [1,2,3,4,6] mezcla :: Ord a => [a] -> [a] -> [a] mezcla [] b = b mezcla a [] = a mezcla a@(x:xs) b@(y:ys) | x <= y = x : (mezcla xs b) | otherwise = y : (mezcla a ys) 8 / 52
  • 9. IM Tema 23: Técnicas de diseño descendente de algoritmos La técnica de divide y vencerás La ordenación rápida como ejemplo de DyV Tema 23: Técnicas de diseño descendente de algoritmos 1. La técnica de divide y vencerás La técnica de divide y vencerás La ordenación por mezcla como ejemplo de DyV La ordenación rápida como ejemplo de DyV 2. Búsqueda en espacios de estados 3. Búsqueda por primero el mejor 4. Búsqueda en escalada 9 / 52
  • 10. IM Tema 23: Técnicas de diseño descendente de algoritmos La técnica de divide y vencerás La ordenación rápida como ejemplo de DyV La ordenación rápida como ejemplo de DyV (ordenaRapida xs) es la lista obtenida ordenando xs por el procedimiento de ordenación rápida. Por ejemplo, ghci> ordenaRapida [3,1,4,1,5,9,2,8] [1,1,2,3,4,5,8,9] import I1M.DivideVenceras ordenaRapida :: Ord a => [a] -> [a] ordenaRapida xs = divideVenceras ind id divide combina xs where ind xs = length xs <= 1 divide (x:xs) = [[ y | y <- xs, y <= x], [ y | y <- xs, y > x]] combina (x:_) [l1,l2] = l1 ++ [x] ++ l2 10 / 52
  • 11. IM Tema 23: Técnicas de diseño descendente de algoritmos Búsqueda en espacios de estados El patrón de búsqueda en espacios de estados Tema 23: Técnicas de diseño descendente de algoritmos 1. La técnica de divide y vencerás 2. Búsqueda en espacios de estados El patrón de búsqueda en espacios de estados El problema de las n reinas El problema de la mochila 3. Búsqueda por primero el mejor 4. Búsqueda en escalada 11 / 52
  • 12. IM Tema 23: Técnicas de diseño descendente de algoritmos Búsqueda en espacios de estados El patrón de búsqueda en espacios de estados Descripción de los problemas de espacios de estados Las características de los problemas de espacios de estados son: un conjunto de las posibles situaciones o nodos que constituye el espacio de estados (estos son las potenciales soluciones que se necesitan explorar), un conjunto de movimientos de un nodo a otros nodos, llamados los sucesores del nodo, un nodo inicial y un nodo objetivo que es la solución. Se supone que el grafo implícito de espacios de estados es acíclico. 12 / 52
  • 13. IM Tema 23: Técnicas de diseño descendente de algoritmos Búsqueda en espacios de estados El patrón de búsqueda en espacios de estados El patrón de búsqueda en espacios de estados (buscaEE s o e) es la lista de soluciones del problema de espacio de estado definido por la función sucesores (s), el objetivo (o) y estado inicial (e). module BusquedaEnEspaciosDeEstados (buscaEE) where import I1M.Pila buscaEE:: (Eq nodo) => (nodo -> [nodo]) -> (nodo -> Bool) -> nodo -> [nodo] buscaEE sucesores esFinal x = busca' (apila x vacia) where busca' p | esVacia p = [] | esFinal (cima p) = cima p : busca' (desapila p) | otherwise = busca' (foldr apila (desapila p) (sucesores x)) where x = cima p 13 / 52
  • 14. IM Tema 23: Técnicas de diseño descendente de algoritmos Búsqueda en espacios de estados El problema de las n reinas Tema 23: Técnicas de diseño descendente de algoritmos 1. La técnica de divide y vencerás 2. Búsqueda en espacios de estados El patrón de búsqueda en espacios de estados El problema de las n reinas El problema de la mochila 3. Búsqueda por primero el mejor 4. Búsqueda en escalada 14 / 52
  • 15. IM Tema 23: Técnicas de diseño descendente de algoritmos Búsqueda en espacios de estados El problema de las n reinas El problema de las n reinas El problema de las n reinas consiste en colocar n reinas en un tablero cuadrado de dimensiones n por n de forma que no se encuentren más de una en la misma línea: horizontal, vertical o diagonal. Se resolverá mediante búsqueda en espacio de estados import I1M.BusquedaEnEspaciosDeEstados Las posiciones de las reinas en el tablero se representan por su columna y su fila. type Columna = Int type Fila = Int 15 / 52
  • 16. IM Tema 23: Técnicas de diseño descendente de algoritmos Búsqueda en espacios de estados El problema de las n reinas El problema de las n reinas Una solución de las n reinas es una lista de posiciones. type SolNR = [(Columna,Fila)] (valida sp p) se verifica si la posición p es válida respecto de la solución parcial sp; es decir, la reina en la posición p no amenaza a ninguna de las reinas de la sp (se supone que están en distintas columnas). Por ejemplo, valida [(1,1)] (2,2) False valida [(1,1)] (2,3) True valida :: SolNR -> (Columna,Fila) -> Bool valida solp (c,r) = and [test s | s <- solp] where test (c',r') = and [c'+r'/=c+r, c'-r'/=c-r, r'/=r] 16 / 52
  • 17. IM Tema 23: Técnicas de diseño descendente de algoritmos Búsqueda en espacios de estados El problema de las n reinas El problema de las n reinas Los nodos del problema de las n reinas son ternas formadas por la columna de la siguiente reina, el número de columnas del tablero y la solución parcial de las reinas colocadas anteriormente. type NodoNR = (Columna,Columna,SolNR) (sucesoresNR e) es la lista de los sucesores del estado e en el problema de las n reinas. Por ejemplo, ghci> sucesoresNR (1,4,[]) [(2,4,[(1,1)]),(2,4,[(1,2)]),(2,4,[(1,3)]),(2,4,[(1,4)])] sucesoresNR :: NodoNR -> [NodoNR] sucesoresNR (c,n,solp) = [(c+1,n,solp++[(c,r)]) | r <- [1..n], valida solp (c,r)] 17 / 52
  • 18. IM Tema 23: Técnicas de diseño descendente de algoritmos Búsqueda en espacios de estados El problema de las n reinas El problema de las n reinas (esFinalNR e) se verifica si e es un estado final del problema de las n reinas. esFinalNR :: NodoNR -> Bool esFinalNR (c,n,solp) = c > n 18 / 52
  • 19. IM Tema 23: Técnicas de diseño descendente de algoritmos Búsqueda en espacios de estados El problema de las n reinas Solución del problema de las n reinas por EE (buscaEE_NR n) es la primera solución del problema de las n reinas, por búsqueda en espacio de estados. Por ejemplo, ghci> buscaEE_NR 8 [(1,1),(2,5),(3,8),(4,6),(5,3),(6,7),(7,2),(8,4)] buscaEE_NR :: Columna -> SolNR buscaEE_NR n = s where ((_,_,s):_) = buscaEE sucesoresNR esFinalNR (1,n,[]) 19 / 52
  • 20. IM Tema 23: Técnicas de diseño descendente de algoritmos Búsqueda en espacios de estados El problema de las n reinas Solución del problema de las n reinas por EE (nSolucionesNR n) es el número de soluciones del problema de las n reinas, por búsqueda en espacio de estados. Por ejemplo, nSolucionesNR 8 92 nSolucionesNR :: Columna -> Int nSolucionesNR n = length (buscaEE sucesoresNR esFinalNR (1,n,[])) 20 / 52
  • 21. IM Tema 23: Técnicas de diseño descendente de algoritmos Búsqueda en espacios de estados El problema de la mochila Tema 23: Técnicas de diseño descendente de algoritmos 1. La técnica de divide y vencerás 2. Búsqueda en espacios de estados El patrón de búsqueda en espacios de estados El problema de las n reinas El problema de la mochila 3. Búsqueda por primero el mejor 4. Búsqueda en escalada 21 / 52
  • 22. IM Tema 23: Técnicas de diseño descendente de algoritmos Búsqueda en espacios de estados El problema de la mochila El problema de la mochila Se tiene una mochila de capacidad de peso p y una lista de n objetos para colocar en la mochila. Cada objeto i tiene un peso wi y un valor vi . Considerando la posibilidad de colocar el mismo objeto varias veces en la mochila, el problema consiste en determinar la forma de colocar los objetos en la mochila sin sobrepasar la capacidad de la mochila colocando el máximo valor posible. Se resolverá mediante búsqueda en espacio de estados import I1M.BusquedaEnEspaciosDeEstados import Data.List (sort) 22 / 52
  • 23. IM Tema 23: Técnicas de diseño descendente de algoritmos Búsqueda en espacios de estados El problema de la mochila El problema de la mochila Los pesos son número enteros. type Peso = Int Los valores son números reales. type Valor = Float Los objetos son pares formado por un peso y un valor. type Objeto = (Peso,Valor) Una solución del problema de la mochila es una lista de objetos. type SolMoch = [Objeto] 23 / 52
  • 24. IM Tema 23: Técnicas de diseño descendente de algoritmos Búsqueda en espacios de estados El problema de la mochila El problema de la mochila Los estados del problema de la mochila son 5–tuplas de la forma (v,p,l,o,s) donde v es el valor de los objetos colocados, p es el peso de los objetos colocados, l es el límite de la capacidad de la mochila, o es la lista de los objetos colocados (ordenados de forma creciente según sus pesos) y s es la solución parcial. type NodoMoch = (Valor,Peso,Peso,[Objeto],SolMoch) 24 / 52
  • 25. IM Tema 23: Técnicas de diseño descendente de algoritmos Búsqueda en espacios de estados El problema de la mochila El problema de la mochila (sucesoresMoch e) es la lista de los sucesores del estado e en el problema de la mochila. sucesoresMoch :: NodoMoch -> [NodoMoch] sucesoresMoch (v,p,limite,objetos,solp) = [( v+v', p+p', limite, [o | o@(p'',_) <- objetos,(p''>=p')], (p',v'):solp ) | (p',v') <- objetos, p+p' <= limite] 25 / 52
  • 26. IM Tema 23: Técnicas de diseño descendente de algoritmos Búsqueda en espacios de estados El problema de la mochila El problema de la mochila (esObjetivoMoch e) se verifica si e es un estado final el problema de la mochila. esObjetivoMoch :: NodoMoch -> Bool esObjetivoMoch (_,p,limite,((p',_):_),_) = p+p'>limite 26 / 52
  • 27. IM Tema 23: Técnicas de diseño descendente de algoritmos Búsqueda en espacios de estados El problema de la mochila Solución del problema de la mochila por EE (buscaEE_Mochila os l) es la solución del problema de la mochila para la lista de objetos os y el límite de capacidad l. Por ejemplo, > buscaEE_Mochila [(2,3),(3,5),(4,6),(5,10)] 8 ([(5,10.0),(3,5.0)],15.0) > buscaEE_Mochila [(2,3),(3,5),(5,6)] 10 ([(3,5.0),(3,5.0),(2,3.0),(2,3.0)],16.0) > buscaEE_Mochila [(2,2.8),(3,4.4),(5,6.1)] 10 ([(3,4.4),(3,4.4),(2,2.8),(2,2.8)],14.4) buscaEE_Mochila :: [Objeto] -> Peso -> (SolMoch,Valor) buscaEE_Mochila objetos limite = (sol,v) where (v,_,_,_,sol) = maximum (buscaEE sucesoresMoch esObjetivoMoch (0,0,limite,sort objetos,[])) 27 / 52
  • 28. IM Tema 23: Técnicas de diseño descendente de algoritmos Búsqueda por primero el mejor El patrón de búsqueda por primero el mejor Tema 23: Técnicas de diseño descendente de algoritmos 1. La técnica de divide y vencerás 2. Búsqueda en espacios de estados 3. Búsqueda por primero el mejor El patrón de búsqueda por primero el mejor El problema del 8 puzzle 4. Búsqueda en escalada 28 / 52
  • 29. IM Tema 23: Técnicas de diseño descendente de algoritmos Búsqueda por primero el mejor El patrón de búsqueda por primero el mejor El patrón de búsqueda por primero el mejor (buscaPM s o e) es la lista de soluciones del problema de espacio de estado definido por la función sucesores (s), el objetivo (o) y estado inicial (e), obtenidas buscando por primero el mejor. module BusquedaPrimeroElMejor (buscaPM) where import I1M.ColaDePrioridad buscaPM :: (Ord nodo) => (nodo -> [nodo]) -- sucesores -> (nodo -> Bool) -- esFinal -> nodo -- nodo actual -> [nodo] -- solución buscaPM sucesores esFinal x = busca' (inserta x vacia) where busca' c | esVacia c = [] | esFinal (primero c) = (primero c):(busca' (resto c)) | otherwise = busca' (foldr inserta (resto c) (sucesores x)) where x = primero c 29 / 52
  • 30. IM Tema 23: Técnicas de diseño descendente de algoritmos Búsqueda por primero el mejor El problema del 8 puzzle Tema 23: Técnicas de diseño descendente de algoritmos 1. La técnica de divide y vencerás 2. Búsqueda en espacios de estados 3. Búsqueda por primero el mejor El patrón de búsqueda por primero el mejor El problema del 8 puzzle 4. Búsqueda en escalada 30 / 52
  • 31. IM Tema 23: Técnicas de diseño descendente de algoritmos Búsqueda por primero el mejor El problema del 8 puzzle El problema del 8 puzzle Para el 8–puzzle se usa un cajón cuadrado en el que hay situados 8 bloques cuadrados. El cuadrado restante está sin rellenar. Cada bloque tiene un número. Un bloque adyacente al hueco puede deslizarse hacia él. El juego consiste en transformar la posición inicial en la posición final mediante el deslizamiento de los bloques. En particular, consideramos el estado inicial y final siguientes: +---+---+---+ +---+---+---+ | 2 | 6 | 3 | | 1 | 2 | 3 | +---+---+---+ +---+---+---+ | 5 | | 4 | | 8 | | 4 | +---+---+---+ +---+---+---+ | 1 | 7 | 8 | | 7 | 6 | 5 | +---+---+---+ +---+---+---+ Estado inicial Estado final 31 / 52
  • 32. IM Tema 23: Técnicas de diseño descendente de algoritmos Búsqueda por primero el mejor El problema del 8 puzzle El problema del 8 puzzle Se resolverá mediante primero el mejor. import I1M.BusquedaPrimeroElMejor import Data.Array Una posición es un par de enteros. type Posicion = (Int,Int) Un tablero es un vector de posiciones, en el que el índice indica el elemento que ocupa la posición. type Tablero = Array Int Posicion 32 / 52
  • 33. IM Tema 23: Técnicas de diseño descendente de algoritmos Búsqueda por primero el mejor El problema del 8 puzzle El problema del 8 puzzle inicial8P es el estado inicial del 8 puzzle. En el ejemplo es +---+---+---+ | 2 | 6 | 3 | +---+---+---+ | 5 | | 4 | +---+---+---+ | 1 | 7 | 8 | +---+---+---+ inicial8P :: Tablero inicial8P = array (0,8) [(2,(1,3)),(6,(2,3)),(3,(3,3)), (5,(1,2)),(0,(2,2)),(4,(3,2)), (1,(1,1)),(7,(2,1)),(8,(3,1))] 33 / 52
  • 34. IM Tema 23: Técnicas de diseño descendente de algoritmos Búsqueda por primero el mejor El problema del 8 puzzle El problema del 8 puzzle final8P es el estado final del 8 puzzle. En el ejemplo es +---+---+---+ | 1 | 2 | 3 | +---+---+---+ | 8 | | 4 | +---+---+---+ | 7 | 6 | 5 | +---+---+---+ final8P :: Tablero final8P = array (0,8) [(1,(1,3)),(2,(2,3)),(3,(3,3)), (8,(1,2)),(0,(2,2)),(4,(3,2)), (7,(1,1)),(6,(2,1)),(5,(3,1))] 34 / 52
  • 35. IM Tema 23: Técnicas de diseño descendente de algoritmos Búsqueda por primero el mejor El problema del 8 puzzle El problema del 8 puzzle (distancia p1 p2) es la distancia Manhatan entre las posiciones p1 y p2. Por ejemplo, distancia (2,7) (4,1) 8 distancia :: Posicion -> Posicion -> Int distancia (x1,y1) (x2,y2) = abs (x1-x2) + abs (y1-y2) (adyacente p1 p2) se verifica si las posiciones p1 y p2 son adyacentes. Por ejemplo, adyacente (3,2) (3,1) True adyacente (3,2) (1,2) False adyacente :: Posicion -> Posicion -> Bool adyacente p1 p2 = distancia p1 p2 == 1 35 / 52
  • 36. IM Tema 23: Técnicas de diseño descendente de algoritmos Búsqueda por primero el mejor El problema del 8 puzzle El problema del 8 puzzle (todosMovimientos t) es la lista de los tableros obtenidos aplicándole al tablero t todos los posibles movimientos; es decir, intercambiando la posición del hueco con sus adyacentes. todosMovimientos :: Tablero -> [Tablero] todosMovimientos t = [t//[(0,t!i),(i,t!0)] | i<-[1..8], adyacente (t!0) (t!i)] Los nodos del espacio de estados son listas de tableros [tn, . . . , t1] tal que ti es un sucesor de ti−1. data Tableros = Est [Tablero] deriving Show 36 / 52
  • 37. IM Tema 23: Técnicas de diseño descendente de algoritmos Búsqueda por primero el mejor El problema del 8 puzzle El problema del 8 puzzle (sucesores8P e) es la lista de sucesores del estado e. sucesores8P :: Tableros -> [Tableros] sucesores8P (Est(n@(t:ts))) = [Est (t':n) | t' <- todosMovimientos t, t' `notElem` ts] (esFinal8P n) se verifica si e es un nodo final del 8 puzzle. esFinal8P :: Tableros -> Bool esFinal8P (Est (t:_)) = t == final8P 37 / 52
  • 38. IM Tema 23: Técnicas de diseño descendente de algoritmos Búsqueda por primero el mejor El problema del 8 puzzle El problema del 8 puzzle (heur1 t) es la suma de la distancia Manhatan desde la posición de cada objeto del tablero t a su posición en el estado final. Por ejemplo, heur1 inicial8P 12 heur1 :: Tablero -> Int heur1 t = sum [distancia (t!i) (final8P!i) | i <- [0..8]] Dos estados se consideran iguales si tienen la misma heurística. instance Eq Tableros where Est(t1:_) == Est(t2:_) = heur1 t1 == heur1 t2 38 / 52
  • 39. IM Tema 23: Técnicas de diseño descendente de algoritmos Búsqueda por primero el mejor El problema del 8 puzzle El problema del 8 puzzle Un estado es menor o igual que otro si tiene una heurística menor o igual. instance Ord Tableros where Est (t1:_) <= Est (t2:_) = heur1 t1 <= heur1 t2 (buscaPM_8P) es la lista de las soluciones del 8 puzzle por búsqueda primero el mejor. buscaPM_8P = buscaPM sucesores8P esFinal8P (Est [inicial8P]) 39 / 52
  • 40. IM Tema 23: Técnicas de diseño descendente de algoritmos Búsqueda en escalada El patrón de búsqueda en escalada Tema 23: Técnicas de diseño descendente de algoritmos 1. La técnica de divide y vencerás 2. Búsqueda en espacios de estados 3. Búsqueda por primero el mejor 4. Búsqueda en escalada El patrón de búsqueda en escalada El problema del cambio de monedas por escalada El algoritmo de Prim del árbol de expansión mínimo por escalada 40 / 52
  • 41. IM Tema 23: Técnicas de diseño descendente de algoritmos Búsqueda en escalada El patrón de búsqueda en escalada El patrón de búsqueda en escalada (buscaEscalada s o e) es la lista de soluciones del problema de espacio de estado definido por la función sucesores (s), el objetivo (o) y estado inicial (e), obtenidas buscando por escalada. module BusquedaEnEscalada (buscaEscalada) where buscaEscalada :: Ord nodo => (nodo -> [nodo]) -> (nodo -> Bool) -> nodo -> [nodo] buscaEscalada sucesores esFinal x = busca' (inserta x vacia) where busca' c | esVacia c = [] | esFinal (primero c) = [primero c] | otherwise = busca' (foldr inserta vacia (sucesores x)) where x = primero c 41 / 52
  • 42. IM Tema 23: Técnicas de diseño descendente de algoritmos Búsqueda en escalada El problema del cambio de monedas por escalada Tema 23: Técnicas de diseño descendente de algoritmos 1. La técnica de divide y vencerás 2. Búsqueda en espacios de estados 3. Búsqueda por primero el mejor 4. Búsqueda en escalada El patrón de búsqueda en escalada El problema del cambio de monedas por escalada El algoritmo de Prim del árbol de expansión mínimo por escalada 42 / 52
  • 43. IM Tema 23: Técnicas de diseño descendente de algoritmos Búsqueda en escalada El problema del cambio de monedas por escalada El problema del cambio de monedas por escalada El problema del cambio de monedas consiste en determinar cómo conseguir una cantidad usando el menor número de monedas disponibles. Se resolverá por búsqueda en escalada. import I1M.BusquedaEnEscalada Las monedas son números enteros. type Moneda = Int monedas es la lista del tipo de monedas disponibles. Se supone que hay un número infinito de monedas de cada tipo. monedas :: [Moneda] monedas = [1,2,5,10,20,50,100] 43 / 52
  • 44. IM Tema 23: Técnicas de diseño descendente de algoritmos Búsqueda en escalada El problema del cambio de monedas por escalada El problema del cambio de monedas por escalada Las soluciones son listas de monedas. type Soluciones = [Moneda] Los estados son pares formados por la cantidad que falta y la lista de monedas usadas. type NodoMonedas = (Int, [Moneda]) 44 / 52
  • 45. IM Tema 23: Técnicas de diseño descendente de algoritmos Búsqueda en escalada El problema del cambio de monedas por escalada El problema del cambio de monedas por escalada (sucesoresMonedas e) es la lista de los sucesores del estado e en el problema de las monedas. Por ejemplo, ghci> sucesoresMonedas (199,[]) [(198,[1]),(197,[2]),(194,[5]),(189,[10]), (179,[20]),(149,[50]),(99,[100])] sucesoresMonedas :: NodoMonedas -> [NodoMonedas] sucesoresMonedas (r,p) = [(r-c,c:p) | c <- monedas, r-c >= 0] (esFinalMonedas e) se verifica si e es un estado final del problema de las monedas. esFinalMonedas :: NodoMonedas -> Bool esFinalMonedas (v,_) = v==0 45 / 52
  • 46. IM Tema 23: Técnicas de diseño descendente de algoritmos Búsqueda en escalada El problema del cambio de monedas por escalada El problema del cambio de monedas por escalada (cambio n) es la solución del problema de las monedas por búsqueda en escalada. Por ejemplo, cambio 199 [2,2,5,20,20,50,100] cambio :: Int -> Soluciones cambio n = snd (head (buscaEscalada sucesoresMonedas esFinalMonedas (n,[]))) 46 / 52
  • 47. IM Tema 23: Técnicas de diseño descendente de algoritmos Búsqueda en escalada El algoritmo de Prim del árbol de expansión mínimo por escalada Tema 23: Técnicas de diseño descendente de algoritmos 1. La técnica de divide y vencerás 2. Búsqueda en espacios de estados 3. Búsqueda por primero el mejor 4. Búsqueda en escalada El patrón de búsqueda en escalada El problema del cambio de monedas por escalada El algoritmo de Prim del árbol de expansión mínimo por escalada 47 / 52
  • 48. IM Tema 23: Técnicas de diseño descendente de algoritmos Búsqueda en escalada El algoritmo de Prim del árbol de expansión mínimo por escalada El algoritmo de Prim del árbol de expansión mínimo por escalada Se resolverá mediante búsqueda en escalada. import I1M.BusquedaEnEscalada import I1M.Grafo import Data.Array import Data.List Ejemplo de grafo. g1 :: Grafo Int Int g1 = creaGrafo D (1,5) [(1,2,12),(1,3,34),(1,5,78), (2,4,55),(2,5,32), (3,4,61),(3,5,44), (4,5,93)] 48 / 52
  • 49. IM Tema 23: Técnicas de diseño descendente de algoritmos Búsqueda en escalada El algoritmo de Prim del árbol de expansión mínimo por escalada El algoritmo de Prim del árbol de expansión mínimo por escalada Una arista esta formada dos nodos junto con su peso. type Arista a b = (a,a,b) Un nodo (NodoAEM (p,t,r,aem)) está formado por el peso p de la última arista añadida el árbol de expansión mínimo (aem), la lista t de nodos del grafo que están en el aem, la lista r de nodos del grafo que no están en el aem y el aem. type NodoAEM a b = (b,[a],[a],[Arista a b]) 49 / 52
  • 50. IM Tema 23: Técnicas de diseño descendente de algoritmos Búsqueda en escalada El algoritmo de Prim del árbol de expansión mínimo por escalada El algoritmo de Prim del árbol de expansión mínimo por escalada (sucesoresAEM g n) es la lista de los sucesores del nodo n en el grafo g. Por ejemplo, ghci> sucesoresAEM g1 (0,[1],[2..5],[]) [(12,[2,1],[3,4,5],[(1,2,12)]), (34,[3,1],[2,4,5],[(1,3,34)]), (78,[5,1],[2,3,4],[(1,5,78)])] sucesoresAEM :: (Ix a,Num b) => (Grafo a b) -> (NodoAEM a b) -> [(NodoAEM a b)] sucesoresAEM g (_,t,r,aem) = [(peso x y g, (y:t), delete y r, (x,y,peso x y g):aem) | x <- t , y <- r, aristaEn g (x,y)] 50 / 52
  • 51. IM Tema 23: Técnicas de diseño descendente de algoritmos Búsqueda en escalada El algoritmo de Prim del árbol de expansión mínimo por escalada El algoritmo de Prim del árbol de expansión mínimo por escalada (esFinalAEM n) se verifica si n es un estado final; es decir, si no queda ningún elemento en la lista de nodos sin colocar en el árbol de expansión mínimo. esFinalAEM (_,_,[],_) = True esFinalAEM _ = False 51 / 52
  • 52. IM Tema 23: Técnicas de diseño descendente de algoritmos Búsqueda en escalada El algoritmo de Prim del árbol de expansión mínimo por escalada El algoritmo de Prim del árbol de expansión mínimo por escalada (prim g) es el árbol de expansión mínimo del grafo g, por el algoritmo de Prim como búsqueda en escalada. Por ejemplo, prim g1 [(2,4,55),(1,3,34),(2,5,32),(1,2,12)] prim g = sol where [(_,_,_,sol)] = buscaEscalada (sucesoresAEM g) esFinalAEM (0,[n],ns,[]) (n:ns) = nodos g 52 / 52