Algoritmos Greedy

por fin ?

"If all you have is a hammer, everything looks like a nail" — Abraham Maslow, 1962

Paradigmas de resolución de problemas

Son aproximaciones generales para construir soluciones eficientes a diferentes tipos de problemas.

  • Proporcionan "plantillas" adecuadas para la resolución de una amplia gama de diversos problemas.
  • Estas plantillas pueden utilizarse con diferentes estructuras de control y datos en cualquier lenguaje.
  • Los costos espaciales y temporales de los algoritmos son conocidos con precisión.

Paradigmas comunes

  • Busqueda completa
  • Divide y Vencerás
  • Enfoque Greedy
  • Programación Dinámica

Algoritmos Greedy (Ávidos, golosos, glotones o devoradores)

Consiste en elegir la opción óptima en cada paso local con la esperanza de llegar a una solución general óptima.

Ejemplo

Se deben entregar 36 pesos y se requiere gastar el menor número de monedas (hay monedas de 1, 2, 5, 10 y 20 pesos)

Ejemplo

Iremos seleccionando las monedas una a una. Cada elección será un paso local, con las esperanza de que al final, la solución general sea óptima.

El criterio será elegir siempre la moneda mas alta posible

Ejemplo

  1. Teniendo 36 pesos, se puede usar una moneda de 20. Faltan 16 pesos.

Ejemplo

  1. Teniendo 36 pesos, se puede usar una moneda de 20. Faltan 16 pesos.
  2. Teniendo 16 pesos, se puede usar una moneda de 10. Faltan 6 pesos.

Ejemplo

  1. Teniendo 36 pesos, se puede usar una moneda de 20. Faltan 16 pesos.
  2. Teniendo 16 pesos, se puede usar una moneda de 10. Faltan 6 pesos.
  3. Teniendo 6 pesos, se puede usar una moneda de 5. Falta 1 peso.

Ejemplo

  1. Teniendo 36 pesos, se puede usar una moneda de 20. Faltan 16 pesos.
  2. Teniendo 16 pesos, se puede usar una moneda de 10. Faltan 6 pesos.
  3. Teniendo 6 pesos, se puede usar una moneda de 5. Falta 1 peso.
  4. Teniendo 1 pesos, se puede usar una moneda de 1. No falta nada.

Ejemplo

Necesité 4 monedas: 20, 10, 5 y 1. No hay forma de formar 36 pesos con menos de 4 monedas, por lo tanto la suma de las soluciones locales, fue una solución óptima.

Consideraciones

Posiblemente, el enfoque greedy sea el mas fácil de programar. Sin embargo, su problema no radica en la programación sino en el concepto: No siempre la suma de las soluciones locales óptimas es la solución optima general.

Ejemplo:

El mismo ejemplo anterior (36 pesos) pero ahora tenemos monedas de 1, 5, 10, 18, 20

Ejemplo

El mismo ejemplo anterior (36 pesos) pero ahora tenemos monedas de 1, 5, 10, 18, 20

  1. Teniendo 36 pesos, se puede usar una moneda de 20. Faltan 10 pesos.

Ejemplo

El mismo ejemplo anterior (36 pesos) pero ahora tenemos monedas de 1, 5, 10, 18, 20

  1. Teniendo 36 pesos, se puede usar una moneda de 20. Faltan 16 pesos.
  2. Teniendo 16 pesos, se puede usar una moneda de 10. Faltan 6 pesos.

Ejemplo

El mismo ejemplo anterior (36 pesos) pero ahora tenemos monedas de 1, 5, 10, 18, 20

  1. Teniendo 36 pesos, se puede usar una moneda de 20. Faltan 16 pesos.
  2. Teniendo 16 pesos, se puede usar una moneda de 10. Faltan 6 pesos.
  3. Teniendo 6 pesos, se puede usar una moneda de 5. Falta 1.

Ejemplo

El mismo ejemplo anterior (36 pesos) pero ahora tenemos monedas de 1, 5, 10, 18, 20

  1. Teniendo 36 pesos, se puede usar una moneda de 20. Faltan 16 pesos.
  2. Teniendo 16 pesos, se puede usar una moneda de 10. Faltan 6 pesos.
  3. Teniendo 6 pesos, se puede usar una moneda de 5. Falta 1.
  4. Teniendo 1 peso, se puede usar una moneda de 1. No falta nada

Ejemplo

De nuevo, tenemos como solución 4 monedas: 20, 10, 5 y 1. Sin embargo se habria podido resolver con 2 monedas de 18. La suma de las soluciones locales óptimas no fue igual a una solución óptima general.

En el primer ejemplo, funciona porque cada moneda es como máximo la mitad de la moneda siguiente. En el segundo caso no aplica este criterio.

¿Cuando aplicar greedy?

Un problema puede ser resuelto de manera greedy si cumple las siguientes dos condiciones:

¿Cuando aplicar greedy?

  • Tiene sub-estructuras óptimas

¿Cuando aplicar greedy?

  • Tiene sub-estructuras óptimas
  • Cumple la propiedad greedy: Eligiendo la solución óptima para cada subproblema resultante, llegamos a la solución óptima general. NUNCA es necesario reconsiderar las soluciones anteriores.

Ejemplo 2

Debo formar un string, con una lista de caracteres que me indica el problema. Cada caracter leido puedo agregarlo al inicio del String, o al final. El objetivo es formar la palabra lexicográficamente mayor posible.

Ejemplo 2

Criterio: Cada paso local consiste en tomar un caracter y agregarlo al inicio o al final. Si el caracter actual es lexicográficamente mayor al primer caracter, lo agrego al inicio. De lo contrario, lo agrego al final.

Ejemplo 3

ABAAB A

Ejemplo 3

ABAAB A
ABAAB BA

Ejemplo 3

ABAAB A
ABAAB BA
ABAAB BAA

Ejemplo 3

ABAAB A
ABAAB BA
ABAAB BAA
ABAAB BAAA

Ejemplo 3

ABAAB A
ABAAB BA
ABAAB BAA
ABAAB BAAA
ABAAB BBAAA

Ejercicios propuestos

UFPS - Week 8