22
Universidad Nacional de San Antonio Abad del Cusco Departamento Académico de Informática Algoritmica III Capítulo III TECNICAS DE DISEÑO DE ALGORITMOS Iván Medrano Valencia 2013

Tecnicas de Diseño

Embed Size (px)

DESCRIPTION

Algoritmos voraces

Citation preview

Page 1: Tecnicas de Diseño

Universidad Nacional de San Antonio Abad del Cusco

Departamento Académico de Informática

Algoritmica III

Capítulo III

TECNICAS DE DISEÑO DE ALGORITMOS

Iván Medrano Valencia

2013

Page 2: Tecnicas de Diseño

TECNICAS DE DISEÑO DE ALGORITMOS

A través de los años, los científicos de la computación han identificado diversas técnicas generales que a menudo producen algoritmos eficientes para la resolución de muchas clases de problemas. Este capitulo presenta algunas de las técnicas más importantes como dividir para vencer, programación dinámica, técnicas ávidas, el método de retroceso y otros.

Sin embargo, debe subrayarse que hay algunos

problemas, como los NP completos, para los cuales ni éstas ni otras técnicas conocidas producirán soluciones eficientes.

Page 3: Tecnicas de Diseño

ALGORITMOS GOLOSOS El término “algoritmo goloso” es una traducción

libre del inglés “greedy algorithms”, en algunos textos se refiere a este tipo de algoritmos como “ávidos”, “codiciosos”, “glotones”, etc.

Se utilizan para resolver problemas de optimización y son extremadamente sencillos, se basan en un principio fundamental.

Page 4: Tecnicas de Diseño

ALGORITMOS GOLOSOS

Principio.

“Un algoritmo goloso, siempre toma la decisión que parece mejor de acuerdo al estado actual del problema”

Funciona construyendo una solución en base a una secuencia de decisiones golosas, se dice que la decisión que toman estos algoritmos es golosa, porque si bien son óptimas en el estado actual del problema no implica que lleven necesariamente a un solución óptima del problema

Page 5: Tecnicas de Diseño

ALGORITMOS GOLOSOS

Importante.

Una solución localmente óptima no necesariamente lleva a una solución globalmente óptima.

FUNDAMENTOS.

El problema debe poder ser descompuesto en varios sub-problemas, de forma tal que si la solución del problema es óptima la solución de los sub-problemas también lo es.

Debe ser posible demostrar que una elección localmente óptima lleva a una solución globalmente óptima.

Page 6: Tecnicas de Diseño

ALGORITMOS GOLOSOS

EJEMPLO 1.

Dado un conjunto de n números se solicita escoger k números, de entre todas las formas que hay para elegir los k números del conjunto dado, de modo que la suma se éstos k números sea máxima

Page 7: Tecnicas de Diseño

ALGORITMOS GOLOSOS

SOLUCIÓN

Para resolver este problema podrían probarse todas las formas posibles que hay para escoger k números de un conjunto de n números. Por supuesto ésta es una forma absurda de resolver el problema.

Simplemente podrían escogerse los k números más grandes, los mismos que constituirían la solución.

15 2 17 11 6

Page 8: Tecnicas de Diseño

ALGORITMOS GOLOSOS

El algoritmo sería:

para (i=1; i<= k; i++)

Inicio

{Escoger el número más grande y

eliminarlo dela lista}

Fin

El algoritmo anterior es ún método codicioso típico. En cada etapa se selcciona el número más grande

Page 9: Tecnicas de Diseño

ALGORITMOS GOLOSOS

El algoritmo sería:

para (i=1; i<= k; i++)

Inicio

{Escoger el número más grande y

eliminarlo dela lista}

Fin

El algoritmo anterior es ún método codicioso típico. En cada etapa se selcciona el número más grande

Page 10: Tecnicas de Diseño

ALGORITMOS GOLOSOS

EJEMPLO 2.

En la fig. se solicita encontrar la ruta más corta de v

0 a v

3

Mediante el método ávido se puede resolver el problema. El camino más corto será: 1 + 2 + 4 = 7

Page 11: Tecnicas de Diseño

ALGORITMOS GOLOSOS

EJEMPLO 3.

Encontrar el camino más corto en el siguiente grafo.

Greedy method: v0v1,2v2,1v3 = 23 Optimal: v0v1,1v2,2v3 = 7 El método goloso no funciona

Page 12: Tecnicas de Diseño

ALGORITMOS GOLOSOS

EJEMPLO 4.

Se trata de devolver una cantidad de pesetas 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 13: Tecnicas de Diseño

EL PROBLEMA DE LA MOCHILA

• El problema de la mochila

– Tenemos 1 mochila y n objetos i=1,2,...,n

• El objeto i tiene un peso positivo wi y un valor vi

– Objetivo: llenar la mochila maximizando el valor de los objetos transportados en ella

• La mochila soporta un peso máximo W

– Se pueden descomponer los objetos en trozos más pequeños

• Fracción xi del objeto i, 0 <= xi <= 1 para 1 <= i <= n

– Problema: maximizar Σxivi de modo que Σxiwi <= W

• De modo que vi>0 wi>0 y 0 <=xi <=1 para 1 <= i <= n

Page 14: Tecnicas de Diseño

EL PROBLEMA DE LA MOCHILA

Funciones de selección posibles

n Objeto más valioso: Incrementa el valor de la carga rápidamente. n Objeto de menor peso: La capacidad se agota lentamente. n Objeto cuyo valor por unidad de peso sea el mayor posible. n Ejemplo: Como llenar una mochila de capacidad 100 con 5 objetos de valores (20, 30, 66, 40, 60) y pesos (10, 20, 30, 40, 50) con cada una de las tres tácticas.

Page 15: Tecnicas de Diseño

EL PROBLEMA DE LA MOCHILA

O b j

. 1

O b j

. 2

O b j

. 3

O b j

. 4

O b j

. 5

V a l o r

V i 2 0 3 0 6 6 4 0 6 0

P e s o

W i 1 0 2 0 3 0 4 0 5 0

R e l a c

ió n

V i / W i

2 . 0 1 . 5 2 . 2 1 . 0 1 . 2

Page 16: Tecnicas de Diseño

S e l . 1 2 3 4 5 V a l o r F i n a l

M o c h i l a

M á x

V i

1

º

3

º

½

2

º

6 6 + 6 0 + ( 1 / 2 )

4 0 = 1 4 6

[ 0 , 0 , 1 , ½ , 1 ]

M i n

W i

1

º

2

º

3

º

4

º

2 0 + 3 0 + 6 6 + 4

0 = 1 5 6

[ 1 , 1 , 1 , 1 , 0 ]

M á x

V i / W i

2

º

3

º

1

º

4

º

4

/

5

6 6 + 2 0 +

3 0 + ( 4 / 5 ) 6 0 =

1 6 4

[ 1 , 1 , 1 , 0 ,

4 / 5 ] Ó P T I M O

Page 17: Tecnicas de Diseño

EL PROBLEMA DE LA MOCHILA

Funcion mochila(w[1..n],v[1..n]):x[1..n]

Inicio

Para (i=1; i<=n, i++)

x[i]=0

Mientras (peso<W) hacer

Inicio

i=el mejor objeto no seleccionado

si peso+w[i]<=W

Entonces

inicio

x[i]=1

peso=peso+w[i]

fin

Caso contrario

Inicio

x[i]=(W-peso)/w[i]

peso=W

fin

retorna x

Fin

Page 18: Tecnicas de Diseño

EL PROBLEMA DE LA MOCHILA

n Teorema:

Si seleccionamos los objetos por orden decreciente de vi/wi, y se permite dividirlos, el algoritmo de la mochila encuentra una solución óptima.

n Complejidad:

Si están ordenados (creciente de vi/wi): O(n)

Incluyendo ordenación: O(n lg n)

n El problema de la mochila no se resuelve de manera óptima con Avidos, al no dejar que los los objetos se dividan. En este caso, sí se obtiene una solución óptima con Programación Dinámica.

Page 19: Tecnicas de Diseño

EL CAMIONERO CON PRISA

Un camionero conduce desde Arequipa a Cusco siguiendo una ruta dada y llevando un camión que le permite, con el tanque de gasolina lleno, recorrer n kilómetros sin parar. El camionero dispone de un mapa de carreteras que le indica las distancias entre las gasolineras que hay en su ruta. Como va con prisa, el camionero desea pararse a repostar el menor número de veces posible. Deseamos diseñar un algoritmo ávido para determinar en qué gasolineras tiene que parar y demostrar que el algoritmo encuentra siempre la solución óptima.

Page 20: Tecnicas de Diseño

TYPE SOLUCION = ARRAY [1..G-1] OF BOOLEAN;

TYPE DISTANCIA = ARRAY [1..G-1] OF CARDINAL;

PROCEDURE Deprisa(n:entero; VAR d:DISTANCIA;

VAR sol:SOLUCION);

VAR i,numkilometros:CARDINAL;

Inicio

para (i:=1; i<= G-1;i++)

sol[i]:=FALSE

i:=0;

numkilometros:=0;

REPEAT

REPEAT

i++;

numkilometros:=numkilometros+d[i];

UNTIL (numkilometros>n) OR (i=G-1);

SI numkilometros>n

ENTONCES (*si nos hemospasado... *)

Inicio

i--; (* volvemos atras una gasolinera *)

sol[i]:=TRUE; (* y repostamos en ella. *)

numkilometros:=0; (* reset contador *)

Fin

UNTIL (i=G-1);

END Deprisa;

Page 21: Tecnicas de Diseño

EL FONTANERO DILIGENTE

Un fontanero necesita hacer n reparaciones urgentes, y sabe de antemano el tiempo que le va a llevar cada una de ellas: en la tarea i-ésima tardará ti minutos. Como en su empresa le pagan dependiendo de la satisfacción del cliente, necesita decidir el orden en el que atenderá los avisos para minimizar el tiempo medio de espera de los clientes. En otras palabras, si llamamos Ei a lo que espera el cliente i-ésimo hasta ver reparada su avería por completo, necesita minimizar la expresión:

Deseamos diseñar un algoritmo ávido que resuelva el problema y probar su validez.

Page 22: Tecnicas de Diseño

EL FONTANERO DILIGENTE

En primer lugar hemos de observar que el fontanero siempre tardará el mismo tiempo global T = t1 + t2 + ... + tn en realizar todas las reparaciones, independientemente de la forma en que las ordene. Sin embargo, los tiempos de espera de los clientes sí dependen de esta ordenación.

En efecto, si mantiene la ordenación original de las tareas (1, 2, ..., n), la expresión de los tiempos de espera de los clientes viene dada por:

E1 = t1 E2 = t1 + t2 ..... En = t1 + t2 + ... + tn . Lo que queremos encontrar es una permutación de las tareas en

donde se minimice la expresión de E(n)