Árboles y esquemas algorítmicos · acceder a un menor número de escaques no visitados. – la...

27
Algoritmos voraces Lección 22

Upload: others

Post on 13-Mar-2020

3 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Árboles y esquemas algorítmicos · 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

Algoritmos voraces

Lección 22

Page 2: Árboles y esquemas algorítmicos · 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

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,…

Page 3: Árboles y esquemas algorítmicos · 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

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;

Page 4: Árboles y esquemas algorítmicos · 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

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

Page 5: Árboles y esquemas algorítmicos · 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

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

Page 6: Árboles y esquemas algorítmicos · 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

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.

Page 7: Árboles y esquemas algorítmicos · 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

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).

Page 8: Árboles y esquemas algorítmicos · 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

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

Page 9: Árboles y esquemas algorítmicos · 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

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

Page 10: Árboles y esquemas algorítmicos · 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

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

Page 11: Árboles y esquemas algorítmicos · 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

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 …

Page 12: Árboles y esquemas algorítmicos · 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

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

Page 13: Árboles y esquemas algorítmicos · 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

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); ...

Page 14: Árboles y esquemas algorítmicos · 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

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

Page 15: Árboles y esquemas algorítmicos · 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

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

Page 16: Árboles y esquemas algorítmicos · 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

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.

Page 17: Árboles y esquemas algorítmicos · 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

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

Page 18: Árboles y esquemas algorítmicos · 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

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; ...

Page 19: Árboles y esquemas algorítmicos · 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

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; ...

Page 20: Árboles y esquemas algorítmicos · 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

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

Page 21: Árboles y esquemas algorítmicos · 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

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

Page 22: Árboles y esquemas algorítmicos · 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

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

Page 23: Árboles y esquemas algorítmicos · 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

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

Page 24: Árboles y esquemas algorítmicos · 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

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

Page 25: Árboles y esquemas algorítmicos · 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

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; ...

Page 26: Árboles y esquemas algorítmicos · 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

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

Page 27: Árboles y esquemas algorítmicos · 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

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