Árboles y esquemas algorítmicos · acceder a un menor número de escaques no visitados. – la...
TRANSCRIPT
Algoritmos voraces
Lección 22
Lección 22: Algoritmos voraces 2
Esquema voraz • Es uno de los esquemas más simples y al mismo
tiempo de los más utilizados. • Típicamente se emplea para resolver problemas de
optimización: – existe una entrada de tamaño n que son los candidatos a
formar parte de la solución; – existe un subconjunto de esos n candidatos que satisface
ciertas restricciones: se llama solución factible; – hay que obtener la solución factible que maximice o
minimice una cierta función objetivo: se llama solución óptima.
• Ejemplos: – encontrar la secuencia óptima para procesar un conjunto de
tareas por un computador, – hallar un camino mínimo en un grafo, – problema de la mochila,…
Lección 22: Algoritmos voraces 3
Esquema voraz • El esquema voraz procede por pasos:
– inicialmente el conjunto de candidatos escogidos es vacío; – en cada paso, se intenta añadir al conjunto de los escogidos
“el mejor” de los no escogidos (sin pensar en el futuro), utilizando una función de selección basada en algún criterio de optimización (puede ser o no ser la función objetivo);
– tras cada paso, hay que ver si el conjunto seleccionado es completable (i.e., si añadiendo más candidatos se puede llegar a una solución); • si el conjunto no es completable, se rechaza el último candidato
elegido y no se vuelve a considerar en el futuro; • si es completable, se incorpora al conjunto de escogidos y
permanece siempre en él; – tras cada incorporación se comprueba si el conjunto
resultante es una solución; – el algoritmo termina cuando se obtiene una solución; – el algoritmo es correcto si la solución encontrada es siempre
óptima;
Lección 22: Algoritmos voraces 4
Esquema voraz función voraz(C:conjunto) devuelve conjunto {C es el conjunto de todos los candidatos}
principio S:=Ø; {S es el conjunto en el que se construye la
solución}
mientrasque not solución(S) and C≠Ø hacer x:=elemento de C que maximiza seleccionar(x);
C:=C-{x};
si completable(S∪{x}) entonces S:=S∪{x} fsi fmq; si solución(S) entonces devuelve S sino devuelve no hay solución fsi fin
Lección 22: Algoritmos voraces 5
Esquema voraz
• Un algoritmo o estrategia voraz: – No siempre lleva a la solución globalmente óptima
• En ese caso se habla de algoritmo o heurística voraz aproximada
– No siempre lleva a obtener solución (aunque el problema tenga solución)
– Generalmente son rápidos y eficientes
Lección 22: Algoritmos voraces 6
Ejemplo: el cambio en monedas
– Se trata de devolver una cantidad de euros con el menor número posible de monedas.
– Se parte de: • un conjunto de tipos de monedas válidas, de las que se
supone que hay cantidad suficiente para realizar el desglose, y de
• un importe a devolver.
Lección 22: Algoritmos voraces 7
Ejemplo: el cambio en monedas
• Elementos fundamentales del esquema: – Conjunto de candidatos: cada una de las monedas de los
diferentes tipos que se pueden usar para realizar el desglose del importe dado.
– Solución: un conjunto de monedas devuelto tras el desglose y cuyo valor total es igual al importe a desglosar.
– Completable: la suma de los valores de las monedas escogidas en un momento dado no supera el importe a desglosar.
– Función de selección: elegir si es posible la moneda de mayor valor de entre las candidatas.
– Función objetivo: número total de monedas utilizadas en la solución (debe minimizarse).
Lección 22: Algoritmos voraces 8
Ejemplo: el cambio en monedas
tipo moneda=(e1,c50,c20,c10) {por ejemplo} función cambia(importe:entero; valor:vector[moneda] de entero) devuelve vector[moneda] de entero variable mon:moneda; cambio:vector[moneda] de entero principio para mon:=e1 hasta c10 hacer cambio[mon]:=0 fpara; para mon:=e1 hasta c10 hacer mq valor[mon]≤importe hacer cambio[mon]:=cambio[mon]+1; importe:=importe-valor[mon] fmq fpara; devuelve cambio fin
Lección 22: Algoritmos voraces 9
El recorrido del caballo de ajedrez
• Problema: – Se trata de encontrar una sucesión de
movimientos “legales” de un caballo de ajedrez de forma que éste pueda visitar todos y cada uno de los escaques (cuadros) de un tablero sin repetir ninguno.
1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8
Lección 22: Algoritmos voraces 10
El recorrido del caballo de ajedrez – Movimientos “legales”: – Estructura de datos: matriz de naturales
• inicialmente: todos cero • al terminar: cada componente guarda el número de orden en
que se visitó el escaque correspondiente
1 2 3
4
5 6 7
8 variables dx,dy:vector[1..8] de entero ... dx:=[2,1,-1,-2,-2,-1,1,2] dy:=[1,2,2,1,-1,-2,-2,-1]
variable tab:vector[1..n,1..n] de entero
Lección 22: Algoritmos voraces 11
Caballo de ajedrez: solución de backtracking procedimiento ensaya(ent i,x,y:entero; sal éxito:booleano) {Ensaya el movimiento al i-ésimo escaque desde el x,y. Si el movimiento es posible y tras él se puede seguir moviendo hasta encontrar la solución entonces éxito devuelve verdad, si no falso} variables k,u,v:entero principio k:=0; repetir {se ensaya con los 8 movimientos posibles} k:=k+1; éxito:=falso; u:=x+dx[k]; v:=y+dy[k]; si (1≤u) and (u≤n) and (1≤v) and (v≤n) entonces …
Lección 22: Algoritmos voraces 12
Caballo de ajedrez: solución de backtracking
… si (1≤u) and (u≤n) and (1≤v) and (v≤n) entonces si tab[u,v]=0 entonces tab[u,v]:=i; si i<n*n entonces ensaya(i+1,u,v,éxito); si not éxito entonces tab[u,v]:=0 fsi sino éxito:=verdad fsi fsi fsi hastaQue éxito or (k=8) fin
Lección 22: Algoritmos voraces 13
Caballo de ajedrez: solución de backtracking procedimiento caballo constante n=8 variables dx,dy:vector[1..8] de entero; tab:vector[1..n,1..n] de entero; i,j:entero; éxito:booleano principio dx[1]:=2; dx[2]:=1; dx[3]:=-1; dx[4]:=-2; dx[5]:=-2; dx[6]:=-1; dx[7]:=1; dx[8]:=2; dy[1]:=1; dy[2]:=2; dy[3]:=2; dy[4]:=1; dy[5]:=-1; dy[6]:=-2; dy[7]:=-2; dy[8]:=-1; para i:=1 hasta n hacer para j:=1 hasta n hacer tab[i,j]:=0 fpara fpara; escribir(‘Introduce i inicial:’); leer(i); escribir(‘Introduce j inicial:’); leer(j); ...
Lección 22: Algoritmos voraces 14
Caballo de ajedrez: solución de backtracking
... tab[i,j]:=1; ensaya(2,i,j,éxito); si éxito entonces para i:=1 hasta n hacer para j:=1 hasta n hacer escribir(tab[i,j]) fpara; escribirLínea fpara sino escribir(‘No hay solución’) fsi fin
Lección 22: Algoritmos voraces 15
Caballo de ajedrez: solución de backtracking
• Resultado de la ejecución: • Inconveniente de esta solución: su ineficiencia
Introduce i inicial: 1 Introduce j inicial: 1 1 60 39 34 31 18 9 64 38 35 32 61 10 63 30 17 59 2 37 40 33 28 19 8 36 49 42 27 62 11 16 29 43 58 3 50 41 24 7 20 48 51 46 55 26 21 12 15 57 44 53 4 23 14 25 6 52 47 56 45 54 5 22 13
Lección 22: Algoritmos voraces 16
Caballo de ajedrez: heurística voraz
• Una heurística voraz: – En cada escaque, seleccionar el siguiente a visitar con la
regla: Se elige aquel escaque no visitado desde el cual se puede
acceder a un menor número de escaques no visitados. – La heurística se basa en la idea: si ahora tenemos
oportunidad de desplazarnos a un escaque “muy aislado” debemos hacerlo, pues más adelante será más difícil llegar a él de nuevo.
– El algoritmo resultante no es de búsqueda con retroceso.
Lección 22: Algoritmos voraces 17
Caballo de ajedrez: heurística voraz
función accesibles(x,y:entero) devuelve entero {Devuelve el número de escaques no visitados accesibles desde x,y} variables k,u,v,num:entero principio num:=0; para k:=1 hasta 8 hacer u:=x+dx[k]; v:=y+dy[k]; si (1≤u) and (u≤n) and (1≤v) and (v≤n) entonces si tab[u,v]=0 entonces num:=num+1 fsi fsi fpara devuelve num fin
Lección 22: Algoritmos voraces 18
Caballo de ajedrez: heurística voraz procedimiento caballo constante n=8 variables dx,dy:vector[1..8] de entero; tab:vector[1..n,1..n] de entero; x,y,i,j,k,kk,u,v,num,menor:entero; parar:booleano principio dx[1]:=2; dx[2]:=1; dx[3]:=-1; dx[4]:=-2; dx[5]:=-2; dx[6]:=-1; dx[7]:=1; dx[8]:=2; dy[1]:=1; dy[2]:=2; dy[3]:=2; dy[4]:=1; dy[5]:=-1; dy[6]:=-2; dy[7]:=-2; dy[8]:=-1; para i:=1 hasta n hacer para j:=1 hasta n hacer tab[i,j]:=0 fpara fpara; escribir(‘Introduce x inicial:’); leer(x); escribir(‘Introduce y inicial:’); leer(y); tab[x,y]:=1; i:=1; parar:=falso; ...
Lección 22: Algoritmos voraces 19
Caballo de ajedrez: heurística voraz ... mq (i<n*n) and not parar hacer i:=i+1; menor:=9; para k:=1 hasta 8 hacer u:=x+dx[k]; v:=y+dy[k]; si (1≤u) and (u≤n) and (1≤v) and (v≤n) entonces si tab[u,v]=0 entonces num:=accesibles(u,v); si num<menor entonces menor:=num; kk:=k fsi fsi fsi fpara; si menor=9 entonces parar:=verdad sino x:=x+dx[kk]; y:=y+dy[kk]; tab[x,y]:=i fsi fmq; ...
Lección 22: Algoritmos voraces 20
Caballo de ajedrez: heurística voraz
... si not parar entonces para i:=1 hasta n hacer para j:=1 hasta n hacer escribir(tab[i,j]) fpara; escribirLínea fpara sino escribir(‘No encuentro solución’) fsi fin
Lección 22: Algoritmos voraces 21
Caballo de ajedrez: heurística voraz
• Resultado de la ejecución: • Mucho más eficiente que la solución de
backtracking: Θ(n2)
Introduce x inicial: 1 Introduce y inicial: 1 1 34 3 18 49 32 13 16 4 19 56 33 14 17 50 31 57 2 35 48 55 52 15 12 20 5 60 53 36 47 30 51 41 58 37 46 61 54 11 26 6 21 42 59 38 27 64 29 43 40 23 8 45 62 25 10 22 7 44 39 24 9 28 63
Lección 22: Algoritmos voraces 22
Caballo de ajedrez: heurística voraz
• Pero la heurística voraz no funciona en todos los casos: Si n=5: Sin embargo, si se ejecuta el algoritmo de backtracking
para n=5:
Introduce x inicial: 1 Introduce y inicial: 3 No encuentro solución
Introduce i inicial: 1 Introduce j inicial: 3 25 14 1 8 19 4 9 18 13 2 15 24 3 20 7 10 5 22 17 12 23 16 11 6 21
Lección 22: Algoritmos voraces 23
Caballo de ajedrez: heurística voraz
• Solución: – Mejorar el algoritmo de backtracking cambiando el orden de
ensayo de las casillas accesibles desde una dada – En lugar de ensayar de forma consecutiva en el sentido de las
agujas del reloj, • se ensayará en primer lugar la casilla desde la que se pueda
acceder al menor número de casillas no visitadas; • si desde esa casilla no se llega a una solución, se intentará con la
casilla con siguiente menor número de casillas accesibles no visitadas; etc.
– Para poder implementar el retroceso:
• cada vez que se llegue a una casilla, se almacenan los movimientos posibles en una cola de movimientos con prioridades, donde la prioridad de un movimiento es el número de casillas accesibles no visitadas tras realizar ese movimiento
Lección 22: Algoritmos voraces 24
Caballo de ajedrez: heurística voraz • Colas de movimientos con prioridades: módulo colasMovPri exporta tipo mov = registro valor:1..8; {es el nº de movimiento según sentido de las agujas del reloj} peso:0..8 {es el nº de casillas no visitadas accesibles si se realiza el movim.} freg función “<”(m1,m2:mov) devuelve booleano principio devuelve m1.peso<m2.peso fin tipo cmp {TAD “cola de movimientos con prioridades”; un movimiento m1 tiene prioridad sobre otro m2 si : m1<m2 = verdad} procedimiento crearVacía(sal c:cmp) procedimiento añadir(e/s c:cmp; ent m:mov) función min(c:cmp) devuelve mov procedimiento eliminarMin(e/s c:cmp) función esVacía?(c:cmp) devuelve booleano implementación ... fin
Lección 22: Algoritmos voraces 25
Caballo de ajedrez: heurística voraz
procedimiento ensaya(ent i,x,y:entero; sal éxito:booleano) variables k,u,v:entero; m:mov; cola:cmp principio {se almacenan los movimientos posibles} creaVacía(cola); para k:=1 hasta 8 hacer u:=x+dx[k]; v:=y+dy[k]; si (1≤u) and (u≤n) and (1≤v) and (v≤n) entonces si tab[u,v]=0 entonces m.valor:=k; m.peso:=accesibles(u,v); añadir(cola,m) fsi fsi fpara; ...
Lección 22: Algoritmos voraces 26
Caballo de ajedrez: heurística voraz
... {se ensaya por orden de menor a mayor nº de casillas accesibles no
visitadas} éxito:=falso; mientrasQue not esVacía?(cola) and not éxito hacer m:=min(cola); eliminarMin(cola); k:=m.valor; u:=x+dx[k]; v:=y+dy[k]; tab[u,v]:=i; si i<n*n entonces ensaya(i+1,u,v,éxito); si not éxito entonces tab[u,v]:=0 fsi sino éxito:=verdad fsi fmq fin
Lección 22: Algoritmos voraces 27
Caballo de ajedrez: heurística voraz
• El algoritmo resultante es mucho más eficiente que el original (de backtracking).
– Y ahora sí encuentra la solución para el caso n=5: Introduce i inicial: 1
Introduce j inicial: 3 23 6 1 16 21 12 17 22 7 2 5 24 11 20 15 10 13 18 3 8 25 4 9 14 19