Este documento describe el algoritmo voraz y el problema de la mochila. Introduce el problema de la mochila, donde el objetivo es maximizar el beneficio total al llenar una mochila sin sobrepasar su capacidad. Explica que la función de selección óptima para este problema es tomar siempre el objeto que proporcione mayor beneficio por unidad de peso. Presenta un algoritmo voraz para resolver este problema en tiempo lineal.
Este documento presenta varios problemas de decisión y optimización formulados como problemas de asignación de valores a variables sujetas a restricciones. Se describen tres problemas clásicos como ejemplos: el problema n-reinas de colocar reinas en un tablero de ajedrez, el problema de k-coloreado de grafos, y el problema del circuito hamiltoniano. También se introducen los conceptos de problemas de decisión, soluciones, y problemas de optimización con funciones objetivo para maximizar o minimizar.
¿Qué es programación dinámica?
Comparación entre recursión y programación dinámica
Historia
Ejemplos de aplicaciones
Knapsack Problem
Needleman–Wunsch algorithm
Algebraic Dynamic Programming
El documento habla sobre la programación dinámica y cómo puede usarse para resolver problemas de manera más eficiente que los algoritmos recursivos. La programación dinámica resuelve subproblemas solo una vez y almacena las soluciones en una tabla para su uso futuro, evitando repetir cálculos. Se usa comúnmente para problemas de optimización donde se busca encontrar la solución óptima. El problema de la mochila y el algoritmo de Needleman-Wunsch se dan como ejemplos de problemas que pueden resolverse usando programación dinámica.
Este documento describe el algoritmo voraz y su funcionamiento. Define los elementos clave de este tipo de algoritmos como el conjunto de candidatos, las decisiones ya tomadas, la función solución, la función de selección y la función objetivo. Explica cómo aplicar este enfoque a problemas como la mochila y los árboles de recubrimiento de manera genérica.
El documento presenta un problema de optimización de red que involucra conectar 8 nodos (residencias y centros comerciales) con líneas de transito a costo mínimo. Se proporcionan los costos de las posibles líneas entre nodos. El algoritmo de Kruskal puede usarse para encontrar el árbol de expansión mínimo y así la solución óptima al problema de la red de transito.
Este documento describe los algoritmos voraces (greedy algorithms), incluyendo su funcionamiento general y elementos clave como la función de selección y función objetivo. Explica que los algoritmos voraces construyen soluciones de forma incremental mediante decisiones locales óptimas, pero no siempre llegan a la solución global óptima. También presenta ejemplos como el problema del cambio de monedas y el recorrido del caballo de ajedrez.
Este documento presenta un problema de optimización para determinar el tamaño y número de paracaídas que minimicen el costo total al transportar suministros a refugiados, sujeto a que la velocidad de impacto sea menor a 20 m/s. Se formula el problema determinando la función de costo a minimizar, las restricciones de velocidad y número entero de paracaídas, y las ecuaciones para calcular la velocidad de impacto en función del tiempo de caída.
Este documento presenta varios problemas de decisión y optimización formulados como problemas de asignación de valores a variables sujetas a restricciones. Se describen tres problemas clásicos como ejemplos: el problema n-reinas de colocar reinas en un tablero de ajedrez, el problema de k-coloreado de grafos, y el problema del circuito hamiltoniano. También se introducen los conceptos de problemas de decisión, soluciones, y problemas de optimización con funciones objetivo para maximizar o minimizar.
¿Qué es programación dinámica?
Comparación entre recursión y programación dinámica
Historia
Ejemplos de aplicaciones
Knapsack Problem
Needleman–Wunsch algorithm
Algebraic Dynamic Programming
El documento habla sobre la programación dinámica y cómo puede usarse para resolver problemas de manera más eficiente que los algoritmos recursivos. La programación dinámica resuelve subproblemas solo una vez y almacena las soluciones en una tabla para su uso futuro, evitando repetir cálculos. Se usa comúnmente para problemas de optimización donde se busca encontrar la solución óptima. El problema de la mochila y el algoritmo de Needleman-Wunsch se dan como ejemplos de problemas que pueden resolverse usando programación dinámica.
Este documento describe el algoritmo voraz y su funcionamiento. Define los elementos clave de este tipo de algoritmos como el conjunto de candidatos, las decisiones ya tomadas, la función solución, la función de selección y la función objetivo. Explica cómo aplicar este enfoque a problemas como la mochila y los árboles de recubrimiento de manera genérica.
El documento presenta un problema de optimización de red que involucra conectar 8 nodos (residencias y centros comerciales) con líneas de transito a costo mínimo. Se proporcionan los costos de las posibles líneas entre nodos. El algoritmo de Kruskal puede usarse para encontrar el árbol de expansión mínimo y así la solución óptima al problema de la red de transito.
Este documento describe los algoritmos voraces (greedy algorithms), incluyendo su funcionamiento general y elementos clave como la función de selección y función objetivo. Explica que los algoritmos voraces construyen soluciones de forma incremental mediante decisiones locales óptimas, pero no siempre llegan a la solución global óptima. También presenta ejemplos como el problema del cambio de monedas y el recorrido del caballo de ajedrez.
Este documento presenta un problema de optimización para determinar el tamaño y número de paracaídas que minimicen el costo total al transportar suministros a refugiados, sujeto a que la velocidad de impacto sea menor a 20 m/s. Se formula el problema determinando la función de costo a minimizar, las restricciones de velocidad y número entero de paracaídas, y las ecuaciones para calcular la velocidad de impacto en función del tiempo de caída.
El documento describe el método general de programación dinámica y dos ejemplos de su aplicación: el problema del cambio de monedas y el problema de la mochila 0/1. La programación dinámica resuelve problemas de optimización dividiéndolos en subproblemas más pequeños, almacenando las soluciones en tablas para evitar repeticiones y combinando dichas soluciones de forma ascendente.
Este documento presenta diferentes estructuras de control utilizadas en programación, incluyendo selección simple, selección múltiple, iteración precondicional, iteración postcondicional y repetición. Define cada una de estas estructuras y provee ejemplos de su implementación en el lenguaje Pascal. Además, propone ejercicios prácticos para practicar el uso de estas estructuras de control en la resolución de problemas.
Este documento presenta una introducción a varios problemas de programación matemática, incluidos el problema del transporte, la planificación de producción, la dieta y el flujo en una red. Describe los componentes básicos de estos problemas (datos, variables, restricciones, función objetivo) y provee ejemplos ilustrativos de cómo modelar y resolver cada uno matemáticamente.
Este documento presenta el tema 6 de Programación II sobre algoritmos voraces, heurísticos y aproximados. Se divide en 13 secciones que cubren la introducción a estos tipos de algoritmos, sus características generales, eficiencia, cuándo usarlos, el problema de la mochila y ejemplos como el árbol de recubrimiento mínimo y caminos mínimos.
Este documento presenta los conceptos matemáticos básicos de la optimización, incluida la maximización de funciones de una y múltiples variables, derivadas parciales, condiciones de primer y segundo orden, y el teorema de la envolvente. Proporciona ejemplos para ilustrar cómo se aplican estos conceptos para resolver problemas de maximización en economía.
Calibración del Modelo Heston usando Evolución DiferencialDavid Solis
La valuación de opciones usando un modelo determina el precio de instrumentos derivados dado determinados parámetros, el problema inverso trata de ajustar el modelo a los datos del mercado, siendo un problema más complicado y frecuentemente para modelos sofisticados del tipo mal planteado (ill-posed). Dicho proceso de ajuste, conocido como calibración del modelo, se puede implementar mediante el uso de técnicas de optimización dirigidas a identificar el conjunto de parámetros del modelo para el que sus precios son consistentes con los precios de mercado.
Este trabajo muestra los fundamentos teóricos y la descripción de la implementación de la calibración del modelo Heston de volatilidad estocástica utilizando un método de metaheurísticas conocido como evolución diferencial.
La matriz Jacobiana está formada por las derivadas parciales de primer orden de una función. Representa la derivada de una función multivariable y permite aproximar linealmente la función en un punto. El determinante jacobiano da información sobre el comportamiento local de la función, como si es invertible o cómo expande o contrae volúmenes. El método de los multiplicadores de Lagrange reduce problemas de optimización con restricciones a problemas sin restricciones adicionales.
La derivada de una función en un punto es la pendiente de la recta tangente a dicha recta en dicho punto. Físicamente, miden la rapidez con la que cambia una variable con respecto a otra. La misma, se aplica en casos donde es necesario medir la rapidez con que se produce el cambio de una situación. Por tanto, la derivada de una función para un valor de la variable es la tasa de variación instantánea de dicha función y para el valor concreto de la variable
El modelo de Ramsey describe un problema de maximización intertemporal sujeto a restricciones dinámicas. El agente elige las trayectorias óptimas de consumo para maximizar su utilidad a lo largo del tiempo. La solución implica condiciones de primer orden que determinan la tasa de crecimiento óptima de consumo en función de la tasa de interés y la tasa de descuento. Existen tres posibles trayectorias de consumo dependiendo de si la tasa de interés es mayor, igual o menor que la tasa de descuento.
Este documento describe el algoritmo de programación dinámica. Explica que la programación dinámica evita calcular dos veces la misma información al almacenar resultados parciales. Luego, detalla que la programación dinámica se aplica a problemas de optimización que tienen subestructura óptima y superposición de subproblemas. Finalmente, provee un ejemplo de cómo usar programación dinámica para encontrar el camino más corto entre dos puntos.
Este documento describe varios métodos para optimización sin restricciones, incluyendo la minimización o maximización de funciones de una o más variables. Explica conceptos como funciones cóncavas, convexas, cuasicóncavas y cuasiconvexas, y presenta métodos de búsqueda lineal como la búsqueda uniforme, dicotómica y de la relación áurea. También cubre búsqueda multidimensional usando derivadas y matrices definidas y semidefinidas.
Metodo lagrange & kuhn tucker - Optimizacion de sistemas y funciones.Daniel Paz
El documento describe el método de multiplicadores de Lagrange y las condiciones de Kuhn-Tucker para la optimización de funciones sujetas a restricciones. Explica que estos métodos permiten encontrar los máximos y mínimos de funciones de múltiples variables sujetas a restricciones reduciendo el problema a uno sin restricciones. Además, se aplican en economía, teoría de control y otros campos.
Este documento resume diferentes métodos de programación no lineal como optimización no restringida, optimización restringida linealmente, programación cuadrática, programación convexa, programación separable, programación no convexa, programación geométrica y programación fraccional. Explica las condiciones necesarias y suficientes para cada método y cómo se pueden transformar algunos problemas en otros de programación lineal o convexa.
La programación no lineal involucra maximizar o minimizar funciones no lineales sujetas a restricciones. Algunos métodos para resolver problemas no lineales incluyen el uso de programación lineal con formulaciones especiales, ramificación y poda, y métodos de optimización convexa cuando la función objetivo es cóncava o convexa y las restricciones son convexas. La localización de instalaciones es un ejemplo común que se puede modelar como un problema de optimización no lineal para minimizar la distancia a varias ubicaciones.
La programación lineal es un método para encontrar la solución óptima cuando se quiere optimizar una función objetivo lineal sujeta a restricciones lineales. Se representan las restricciones como semiplanos y la intersección de éstos da la región de validez. La solución óptima se encuentra en un vértice de dicha región.
Este documento presenta información sobre tres tipos de problemas de red: problemas de transporte, asignación y transbordo. Explica que los problemas de transporte, asignación y transbordo, así como otros problemas de red, pueden formularse como programas lineales. Luego proporciona ejemplos detallados de cómo formular y resolver problemas de transporte específicos como programas lineales.
Uso de CMSA para resolver el problema de selección de requisitosjfrchicanog
El documento describe el uso del algoritmo Construct, Merge, Solve and Adapt (CMSA) para resolver el problema de selección de requisitos (Next Release Problem, NRP). Se proponen dos versiones de CMSA para NRP donde los componentes son los requisitos o los clientes. Se generan instancias aleatorias de NRP y se comparan los resultados de CMSA con un resolutor exacto (CPLEX) en términos de valor objetivo medio obtenido. Los resultados muestran que CMSA es capaz de encontrar soluciones de calidad similar al resolutor exacto pero en menos tiempo.
El documento trata sobre la optimización de funciones. Explica cómo encontrar los valores máximos y mínimos de funciones reales de variable real mediante el uso de derivadas. Proporciona ejemplos resueltos de cómo maximizar ingresos e ingresos totales y minimizar costos promedios. También cubre conceptos como valores críticos, el teorema del valor extremo y el criterio de la segunda derivada.
Este documento describe varios algoritmos voraces y sus aplicaciones. Explica el método general de los algoritmos voraces, incluyendo ejemplos como el problema del cambio de monedas, la mochila y la planificación de tareas. También analiza la complejidad de tiempo de estos algoritmos.
Este documento describe algoritmos voraces y sus características. Los algoritmos voraces construyen soluciones paso a paso eligiendo en cada paso el elemento más "prometedor". Se presentan ejemplos como el problema de la mochila y la planificación de tareas. Finalmente, se analizan aspectos como el tiempo de ejecución de estos algoritmos.
Este documento explica la técnica de programación dinámica. Se define como una técnica que resuelve problemas dividiéndolos en subproblemas solapados, almacenando las soluciones para evitar calcularlas repetidamente. Explica los pasos para aplicarla: caracterizar la estructura óptima, definir recursivamente la solución óptima, y construir la solución global de forma ascendente usando las soluciones parciales. Finalmente, concluye que se aplica a problemas con subproblemas simples y solapados cuya solución
El documento describe el método general de programación dinámica y dos ejemplos de su aplicación: el problema del cambio de monedas y el problema de la mochila 0/1. La programación dinámica resuelve problemas de optimización dividiéndolos en subproblemas más pequeños, almacenando las soluciones en tablas para evitar repeticiones y combinando dichas soluciones de forma ascendente.
Este documento presenta diferentes estructuras de control utilizadas en programación, incluyendo selección simple, selección múltiple, iteración precondicional, iteración postcondicional y repetición. Define cada una de estas estructuras y provee ejemplos de su implementación en el lenguaje Pascal. Además, propone ejercicios prácticos para practicar el uso de estas estructuras de control en la resolución de problemas.
Este documento presenta una introducción a varios problemas de programación matemática, incluidos el problema del transporte, la planificación de producción, la dieta y el flujo en una red. Describe los componentes básicos de estos problemas (datos, variables, restricciones, función objetivo) y provee ejemplos ilustrativos de cómo modelar y resolver cada uno matemáticamente.
Este documento presenta el tema 6 de Programación II sobre algoritmos voraces, heurísticos y aproximados. Se divide en 13 secciones que cubren la introducción a estos tipos de algoritmos, sus características generales, eficiencia, cuándo usarlos, el problema de la mochila y ejemplos como el árbol de recubrimiento mínimo y caminos mínimos.
Este documento presenta los conceptos matemáticos básicos de la optimización, incluida la maximización de funciones de una y múltiples variables, derivadas parciales, condiciones de primer y segundo orden, y el teorema de la envolvente. Proporciona ejemplos para ilustrar cómo se aplican estos conceptos para resolver problemas de maximización en economía.
Calibración del Modelo Heston usando Evolución DiferencialDavid Solis
La valuación de opciones usando un modelo determina el precio de instrumentos derivados dado determinados parámetros, el problema inverso trata de ajustar el modelo a los datos del mercado, siendo un problema más complicado y frecuentemente para modelos sofisticados del tipo mal planteado (ill-posed). Dicho proceso de ajuste, conocido como calibración del modelo, se puede implementar mediante el uso de técnicas de optimización dirigidas a identificar el conjunto de parámetros del modelo para el que sus precios son consistentes con los precios de mercado.
Este trabajo muestra los fundamentos teóricos y la descripción de la implementación de la calibración del modelo Heston de volatilidad estocástica utilizando un método de metaheurísticas conocido como evolución diferencial.
La matriz Jacobiana está formada por las derivadas parciales de primer orden de una función. Representa la derivada de una función multivariable y permite aproximar linealmente la función en un punto. El determinante jacobiano da información sobre el comportamiento local de la función, como si es invertible o cómo expande o contrae volúmenes. El método de los multiplicadores de Lagrange reduce problemas de optimización con restricciones a problemas sin restricciones adicionales.
La derivada de una función en un punto es la pendiente de la recta tangente a dicha recta en dicho punto. Físicamente, miden la rapidez con la que cambia una variable con respecto a otra. La misma, se aplica en casos donde es necesario medir la rapidez con que se produce el cambio de una situación. Por tanto, la derivada de una función para un valor de la variable es la tasa de variación instantánea de dicha función y para el valor concreto de la variable
El modelo de Ramsey describe un problema de maximización intertemporal sujeto a restricciones dinámicas. El agente elige las trayectorias óptimas de consumo para maximizar su utilidad a lo largo del tiempo. La solución implica condiciones de primer orden que determinan la tasa de crecimiento óptima de consumo en función de la tasa de interés y la tasa de descuento. Existen tres posibles trayectorias de consumo dependiendo de si la tasa de interés es mayor, igual o menor que la tasa de descuento.
Este documento describe el algoritmo de programación dinámica. Explica que la programación dinámica evita calcular dos veces la misma información al almacenar resultados parciales. Luego, detalla que la programación dinámica se aplica a problemas de optimización que tienen subestructura óptima y superposición de subproblemas. Finalmente, provee un ejemplo de cómo usar programación dinámica para encontrar el camino más corto entre dos puntos.
Este documento describe varios métodos para optimización sin restricciones, incluyendo la minimización o maximización de funciones de una o más variables. Explica conceptos como funciones cóncavas, convexas, cuasicóncavas y cuasiconvexas, y presenta métodos de búsqueda lineal como la búsqueda uniforme, dicotómica y de la relación áurea. También cubre búsqueda multidimensional usando derivadas y matrices definidas y semidefinidas.
Metodo lagrange & kuhn tucker - Optimizacion de sistemas y funciones.Daniel Paz
El documento describe el método de multiplicadores de Lagrange y las condiciones de Kuhn-Tucker para la optimización de funciones sujetas a restricciones. Explica que estos métodos permiten encontrar los máximos y mínimos de funciones de múltiples variables sujetas a restricciones reduciendo el problema a uno sin restricciones. Además, se aplican en economía, teoría de control y otros campos.
Este documento resume diferentes métodos de programación no lineal como optimización no restringida, optimización restringida linealmente, programación cuadrática, programación convexa, programación separable, programación no convexa, programación geométrica y programación fraccional. Explica las condiciones necesarias y suficientes para cada método y cómo se pueden transformar algunos problemas en otros de programación lineal o convexa.
La programación no lineal involucra maximizar o minimizar funciones no lineales sujetas a restricciones. Algunos métodos para resolver problemas no lineales incluyen el uso de programación lineal con formulaciones especiales, ramificación y poda, y métodos de optimización convexa cuando la función objetivo es cóncava o convexa y las restricciones son convexas. La localización de instalaciones es un ejemplo común que se puede modelar como un problema de optimización no lineal para minimizar la distancia a varias ubicaciones.
La programación lineal es un método para encontrar la solución óptima cuando se quiere optimizar una función objetivo lineal sujeta a restricciones lineales. Se representan las restricciones como semiplanos y la intersección de éstos da la región de validez. La solución óptima se encuentra en un vértice de dicha región.
Este documento presenta información sobre tres tipos de problemas de red: problemas de transporte, asignación y transbordo. Explica que los problemas de transporte, asignación y transbordo, así como otros problemas de red, pueden formularse como programas lineales. Luego proporciona ejemplos detallados de cómo formular y resolver problemas de transporte específicos como programas lineales.
Uso de CMSA para resolver el problema de selección de requisitosjfrchicanog
El documento describe el uso del algoritmo Construct, Merge, Solve and Adapt (CMSA) para resolver el problema de selección de requisitos (Next Release Problem, NRP). Se proponen dos versiones de CMSA para NRP donde los componentes son los requisitos o los clientes. Se generan instancias aleatorias de NRP y se comparan los resultados de CMSA con un resolutor exacto (CPLEX) en términos de valor objetivo medio obtenido. Los resultados muestran que CMSA es capaz de encontrar soluciones de calidad similar al resolutor exacto pero en menos tiempo.
El documento trata sobre la optimización de funciones. Explica cómo encontrar los valores máximos y mínimos de funciones reales de variable real mediante el uso de derivadas. Proporciona ejemplos resueltos de cómo maximizar ingresos e ingresos totales y minimizar costos promedios. También cubre conceptos como valores críticos, el teorema del valor extremo y el criterio de la segunda derivada.
Este documento describe varios algoritmos voraces y sus aplicaciones. Explica el método general de los algoritmos voraces, incluyendo ejemplos como el problema del cambio de monedas, la mochila y la planificación de tareas. También analiza la complejidad de tiempo de estos algoritmos.
Este documento describe algoritmos voraces y sus características. Los algoritmos voraces construyen soluciones paso a paso eligiendo en cada paso el elemento más "prometedor". Se presentan ejemplos como el problema de la mochila y la planificación de tareas. Finalmente, se analizan aspectos como el tiempo de ejecución de estos algoritmos.
Este documento explica la técnica de programación dinámica. Se define como una técnica que resuelve problemas dividiéndolos en subproblemas solapados, almacenando las soluciones para evitar calcularlas repetidamente. Explica los pasos para aplicarla: caracterizar la estructura óptima, definir recursivamente la solución óptima, y construir la solución global de forma ascendente usando las soluciones parciales. Finalmente, concluye que se aplica a problemas con subproblemas simples y solapados cuya solución
Este documento describe la programación dinámica y varios problemas que pueden resolverse usando este método. Brevemente explica que la programación dinámica divide un problema complejo en subproblemas, almacena las soluciones de estos subproblemas y los usa de manera recursiva para resolver el problema original de manera óptima. Luego, detalla algunos problemas como el problema de la diligencia, el árbol binario de búsqueda óptimo y el problema del vendedor viajero, y cómo se pueden resolver usando programación dinámica.
1) Los algoritmos ávidos son un método para resolver problemas de optimización que toma decisiones locales óptimas en cada paso sin considerar las consecuencias futuras con la esperanza de llegar a una solución global óptima.
2) Para la multiplicación óptima de matrices, ninguna estrategia ávida garantiza encontrar la solución óptima debido a que existen ejemplos donde cada estrategia falla.
3) Para el problema del fontanero diligente, el objetivo es minimizar el tiempo medio de espera de los clientes al asignar el orden en que
La programación lineal es una teoría matemática desarrollada en el siglo XX para optimizar funciones sujetas a restricciones lineales. Se define un problema de programación lineal como la maximización o minimización de una función objetivo sujeta a restricciones lineales. Existen métodos analíticos y gráficos para encontrar la solución óptima evaluando la función en los vértices de la región factible. El algoritmo del simplex es un método eficiente para resolver problemas de programación lineal.
La programación dinámica es una estrategia para resolver problemas de optimización dividiéndolos en etapas. Se resuelve cada subproblema de forma independiente para minimizar el número de cálculos, empezando por una pequeña porción del problema original y ampliándolo gradualmente hasta resolverlo completamente. El principio de optimalidad establece que la política óptima para las etapas restantes depende solo del estado actual, independientemente de cómo se llegó a ese estado.
MET. CUANT. 9na. Und. (Modelo de distribucion y red.).pptxfranklinhsanchez125
Se introduce el estudio de problemas de transporte, mencionando a L.V. Kantarovich, quien comenzó a estudiar estos problemas en 1939. Se discute cómo estos problemas son esenciales para optimizar el transporte desde varios puntos de oferta a puntos de demanda, asegurando que la mercadería se transporte al menor costo posible.
El documento describe el modelo de transporte, que busca encontrar la mejor distribución de productos desde puntos de suministro a puntos de demanda minimizando costos. Se requiere la oferta, demanda y costos de transporte entre cada origen y destino. Se explican algoritmos como la regla de la esquina noroeste, el método de Vogel y el método del costo mínimo para encontrar una solución factible inicial, y métodos como el de pasos secuenciales y DIMO para encontrar la solución óptima.
Programación lineal en la investigación de operacionesManuel Bedoya D
La programación lineal es un conjunto de técnicas para resolver problemas con múltiples variables. Se utiliza para maximizar o minimizar una función objetivo sujeto a restricciones. El documento presenta un ejemplo de programación lineal para determinar la cantidad óptima de pantalones y chaquetas que un fabricante debe producir para maximizar las ventas de unos almacenes. El modelo se resuelve gráficamente determinando el vértice óptimo que maximiza la función objetivo de beneficios.
La programación dinámica es un método de optimización que involucra dividir un problema en subproblemas y almacenar soluciones para no recalcularlas. Se utiliza un principio de optimalidad de Bellman para resolver problemas de decisión en múltiples pasos de manera recursiva. El documento explica los conceptos básicos de programación dinámica incluyendo etapas, estados, recursividad y provee un ejemplo de encontrar la ruta más segura para un viaje en diligencia.
Este documento describe los conceptos y métodos de asignación y transporte en la investigación de operaciones. Explica que los problemas de transporte buscan determinar un plan óptimo para distribuir una mercancía desde varias fuentes a varios destinos minimizando los costos de transporte. Luego, describe varios métodos para resolver problemas de transporte como el método de la esquina noroeste, el método de aproximación de Vogel y el método de los multiplicadores. Finalmente, presenta un ejemplo numérico de un problema de transporte.
El método simplex es un método para resolver problemas de programación lineal inventado por George Dantzig en 1947. Consiste en iteraciones que comienzan con una solución factible inicial y mejoran sucesivamente la función objetivo hasta alcanzar la solución óptima. El método simplex se utiliza para encontrar la solución óptima de problemas de maximización o minimización buscando en los vértices del polígono de restricciones de manera iterativa.
Este documento presenta un resumen del problema de la mochila en programación lógica. Explica la historia y definición del problema, diferentes casos en los que se presenta, métodos de resolución como algoritmos voraces y búsqueda con retroceso, aplicaciones a situaciones de la vida real y una conclusión donde se indica que el problema puede resolverse con algoritmos voraces y lógica. Finalmente incluye anexos y bibliografía.
Este documento describe los problemas de transporte como un tipo especial de problemas de programación lineal. Explica que los problemas de transporte involucran la distribución de bienes desde orígenes a destinos para minimizar costos, y tienen una estructura matemática única que permite métodos de solución simplificados. También presenta un ejemplo prototipo de un problema de transporte que involucra la distribución de chícharos enlatados entre plantas y almacenes.
Este documento presenta información sobre programación lineal. Explica que la programación lineal resuelve problemas en los que las relaciones entre variables son lineales. Define los componentes clave de un problema de programación lineal, incluidas las variables de decisión, restricciones, función objetivo y condición de no negatividad. También proporciona ejemplos de cómo formular problemas del mundo real como modelos matemáticos de programación lineal.
El documento presenta dos problemas de programación lineal. El primer problema involucra maximizar las ganancias de un artesano que teje mantas de alpaca y algodón sujeto a restricciones en la producción. Resolviendo el problema gráficamente, la solución óptima es tejer 60 mantas de alpaca y 100 de algodón. El segundo problema busca minimizar los costos de obtener tres elementos químicos a partir de sustancias A y B, sujeto a restricciones en las cantidades obtenidas. El método gráfico también se usa
Este documento describe algoritmos de vuelta atrás y sus aplicaciones a problemas como el coloreado de mapas, el problema de las monedas mínimas, la suma de subconjuntos y el problema de la mochila. Explica conceptos como los árboles de ensayos implícitos y esquemas generales de algoritmos de vuelta atrás, además de proveer ejemplos específicos de pseudocódigo para la resolución de cada problema.
Este documento presenta el problema de la mochila, un problema NP-completo que involucra elegir los elementos a colocar en una mochila para maximizar el beneficio total sin exceder la capacidad. Explica formulaciones matemáticas, heurísticas como ordenar por rendimiento y comparar con el elemento crítico, y analiza cotas superiores. También cubre variantes como acotado y múltiples mochilas, y algoritmos como voraz, genético y dinámico. Finalmente, discute aplicaciones prácticas y conclusiones.
El documento describe el algoritmo simplex, un método para resolver problemas de programación lineal maximizando una función objetivo sujeta a restricciones lineales. Explica que el método se basa en iterar entre soluciones factibles maximizando la función en cada paso, y fue desarrollado por George Dantzig en 1947 para optimizar costos militares. También provee un ejemplo numérico para ilustrar los pasos del algoritmo.
Este documento presenta un resumen de los conceptos básicos de programación en Python. Cubre asignaciones, control de flujo, estructuras de datos, NumPy, Matplotlib y Pandas. Incluye secciones sobre cadenas, números, booleanos, asignación múltiple, condicionales if-then-else, bucles for y while, tuplas, listas, diccionarios, funciones, creación y acceso a arreglos, operaciones aritméticas, gráficos de línea y dispersión, series y DataFrames.
Este documento presenta una introducción al aprendizaje profundo. Explica la evolución histórica del aprendizaje profundo desde las redes neuronales en los años 50 hasta los avances recientes impulsados por la disponibilidad de grandes conjuntos de datos y capacidades de computación. También describe los principales frameworks de aprendizaje profundo como Caffe2, PyTorch y TensorFlow, que permiten aplicar este enfoque sin necesidad de desarrollar todos los componentes desde cero.
El documento explica el algoritmo K-NN (K-vecinos más cercanos) para la clasificación de datos. K-NN asigna nuevos datos a la categoría a la que pertenecen la mayoría de sus K vecinos más cercanos, donde la cercanía se mide mediante la distancia euclidiana. El algoritmo implica elegir K, encontrar los K vecinos más cercanos, contar los vecinos en cada categoría, y asignar el nuevo dato a la categoría con más vecinos.
Este documento presenta una introducción a Python como lenguaje de programación científica. Explica los modos de programación interactiva y por script, los tipos de datos básicos como enteros, flotantes, cadenas y compuestos, y estructuras como listas, tuplas, conjuntos y diccionarios. También cubre temas como funciones lambda, filter y map, copias de objetos, y manejo de archivos e excepciones.
Este documento habla sobre métodos avanzados de programación científica y computación de alto rendimiento (HPC). Explica diferentes clasificaciones de lenguajes de programación como su nivel de abstracción, si son compilados o interpretados, si tienen tipificación estática o dinámica, y diferentes paradigmas como la programación imperativa, declarativa y orientada a objetos. Luego menciona algunos lenguajes científicos populares como R, Scala, MATLAB, Python, C/C++ y Fortran, y técnicas para evaluar el rendimiento
Este documento proporciona una introducción a los conceptos básicos de la regresión lineal, incluyendo tipos de variables, regresiones, regresión lineal simple y múltiple, el método de mínimos cuadrados, R cuadrado y R cuadrado ajustado. Explica cómo la regresión lineal estima la relación entre una variable dependiente y una o más variables independientes utilizando una línea recta de mejor ajuste.
El documento presenta los diferentes métodos para construir modelos de regresión, incluyendo la regresión paso a paso. Explica que existen cinco métodos principales: todo incluido, eliminación hacia atrás, selección hacia adelante, eliminación bidireccional y comparación de scores. Luego, describe con más detalle los pasos involucrados en la eliminación hacia atrás, selección hacia adelante y eliminación bidireccional.
Este documento explica cómo los kernels permiten que los SVM aprendan separaciones no lineales mediante la transformación de los datos a un espacio de dimensión superior implícito. Se introduce el kernel gaussiano RBF, el cual calcula la similitud entre puntos de datos basado en su distancia, permitiendo que los SVM aprendan patrones no lineales de manera eficiente sin necesidad de transformar explícitamente los datos.
Catalogo Refrigeracion Miele Distribuidor Oficial Amado Salvador ValenciaAMADO SALVADOR
Descubre el catálogo general de la gama de productos de refrigeración del fabricante de electrodomésticos Miele, presentado por Amado Salvador distribuidor oficial Miele en Valencia. Como distribuidor oficial de electrodomésticos Miele, Amado Salvador ofrece una amplia selección de refrigeradores, congeladores y soluciones de refrigeración de alta calidad, resistencia y diseño superior de esta marca.
La gama de productos de Miele se caracteriza por su innovación tecnológica y eficiencia energética, garantizando que cada electrodoméstico no solo cumpla con las expectativas, sino que las supere. Los refrigeradores Miele están diseñados para ofrecer un rendimiento óptimo y una conservación perfecta de los alimentos, con características avanzadas como la tecnología de enfriamiento Dynamic Cooling, sistemas de almacenamiento flexible y acabados premium.
En este catálogo, encontrarás detalles sobre los distintos modelos de refrigeradores y congeladores Miele, incluyendo sus especificaciones técnicas, características destacadas y beneficios para el usuario. Amado Salvador, como distribuidor oficial de electrodomésticos Miele, garantiza que todos los productos cumplen con los más altos estándares de calidad y durabilidad.
Explora el catálogo completo y encuentra el refrigerador Miele perfecto para tu hogar con Amado Salvador, el distribuidor oficial de electrodomésticos Miele.
Todo sobre la tarjeta de video (Bienvenidos a mi blog personal)AbrahamCastillo42
Power point, diseñado por estudiantes de ciclo 1 arquitectura de plataformas, esta con la finalidad de dar a conocer el componente hardware llamado tarjeta de video..
Catalogo general tarifas 2024 Vaillant. Amado Salvador Distribuidor Oficial e...AMADO SALVADOR
Descarga el Catálogo General de Tarifas 2024 de Vaillant, líder en tecnología para calefacción, ventilación y energía solar térmica y fotovoltaica. En Amado Salvador, como distribuidor oficial de Vaillant, te ofrecemos una amplia gama de productos de alta calidad y diseño innovador para tus proyectos de climatización y energía.
Descubre nuestra selección de productos Vaillant, incluyendo bombas de calor altamente eficientes, fancoils de última generación, sistemas de ventilación de alto rendimiento y soluciones de energía solar fotovoltaica y térmica para un rendimiento óptimo y sostenible. El catálogo de Vaillant 2024 presenta una variedad de opciones en calderas de condensación que garantizan eficiencia energética y durabilidad.
Con Vaillant, obtienes más que productos de climatización: control avanzado y conectividad para una gestión inteligente del sistema, acumuladores de agua caliente de gran capacidad y sistemas de aire acondicionado para un confort total. Confía en la fiabilidad de Amado Salvador como distribuidor oficial de Vaillant, y en la resistencia de los productos Vaillant, respaldados por años de experiencia e innovación en el sector.
En Amado Salvador, distribuidor oficial de Vaillant en Valencia, no solo proporcionamos productos de calidad, sino también servicios especializados para profesionales, asegurando que tus proyectos cuenten con el mejor soporte técnico y asesoramiento. Descarga nuestro catálogo y descubre por qué Vaillant es la elección preferida para proyectos de climatización y energía en Amado Salvador.
HPE presenta una competició destinada a estudiants, que busca fomentar habilitats tecnològiques i promoure la innovació en un entorn STEAM (Ciència, Tecnologia, Enginyeria, Arts i Matemàtiques). A través de diverses fases, els equips han de resoldre reptes mensuals basats en àrees com algorísmica, desenvolupament de programari, infraestructures tecnològiques, intel·ligència artificial i altres tecnologies. Els millors equips tenen l'oportunitat de desenvolupar un projecte més gran en una fase presencial final, on han de crear una solució concreta per a un conflicte real relacionat amb la sostenibilitat. Aquesta competició promou la inclusió, la sostenibilitat i l'accessibilitat tecnològica, alineant-se amb els Objectius de Desenvolupament Sostenible de l'ONU.
1. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 1
Algoritmos voraces
v Introducción y primer ejemplo 2
v El problema de la mochila 8
v Caminos mínimos en grafos 16
v Árboles de recubrimiento de
coste mínimo 38
v Consideraciones sobre
la corrección del esquema voraz 54
v Códigos de Huffman 57
v El problema de la selección de
actividades 65
v El problema de la minimización
del tiempo de espera 69
v Fundamentos teóricos
del esquema voraz 73
v Un problema de planificación
de tareas a plazo fijo 83
v Heurísticas voraces 89
– Coloreado de grafos 89
– El problema del viajante de comercio 92
2. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 2
El esquema voraz:
Introducción y primer ejemplo
v Es uno de los esquemas más simples y
al mismo tiempo de los más utilizados.
v 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.
v 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,…
3. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 3
El esquema voraz:
Introducción y primer ejemplo
v 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 optimiza-
ció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);
u si el conjunto no es completable, se rechaza
el último candidato elegido y no se vuelve a
considerar en el futuro;
u 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;
4. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 4
v Esquema genérico:
El esquema voraz:
Introducción y primer ejemplo
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}
mq ¬solución(S) ∧ 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
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}
mq ¬solución(S) ∧ 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
5. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 5
v Problema del cambio en monedas.
– Se trata de devolver una
cantidad de pesetas con el
menor número posible
de monedas.
– Se parte de:
u un conjunto de tipos de monedas válidas, de
las que se supone que hay cantidad
suficiente para realizar el desglose, y de
u un importe a devolver.
v 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).
El esquema voraz:
Introducción y primer ejemplo
6. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 6
v Solución:
función cambia(importe:nat;
valor:vector[moneda] de nat)
devuelve vector[moneda] de nat
variable mon:moneda;
cambio:vector[moneda] de nat
principio
para todo mon en moneda hacer
cambio[mon]:=0
fpara;
para mon:=M25 hasta M1 hacer
mq valor[mon]≤importe hacer
cambio[mon]:=cambio[mon]+1;
importe:=importe-valor[mon]
fmq
fpara;
devuelve cambio
fin
función cambia(importe:nat;
valor:vector[moneda] de nat)
devuelve vector[moneda] de nat
variable mon:moneda;
cambio:vector[moneda] de nat
principio
para todo mon en moneda hacer
cambio[mon]:=0
fpara;
para mon:=M25 hasta M1 hacer
mq valor[mon]≤importe hacer
cambio[mon]:=cambio[mon]+1;
importe:=importe-valor[mon]
fmq
fpara;
devuelve cambio
fin
tipo moneda=(M25,M10,M5,M1) {por ejemplo}tipo moneda=(M25,M10,M5,M1) {por ejemplo}
El esquema voraz:
Introducción y primer ejemplo
7. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 7
v Ejercicios sobre el problema del cambio
en monedas:
– Demostrar la corrección del algoritmo.
– Demostrar, buscando contraejemplos, que el
algoritmo no es óptimo si se añade un nuevo tipo
de moneda de 12 pesetas o si se elimina alguno
de los tipos existentes.
Demostrar que, en esas condiciones, el algoritmo
puede incluso no encontrar solución alguna
aunque ésta exista.
– ¿Es el método de ordenación por selección
directa un algoritmo voraz?
Si es así, ¿cuáles son las funciones utilizadas
(“selección”, “completable”, “solución”)?
El esquema voraz:
Introducción y primer ejemplo
8. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 8
El problema de la mochila
v Se tienen n objetos fraccionables y una
mochila.
v El objeto i tiene peso pi, 1≤i ≤ n.
v La mochila tiene capacidad C.
v Si se mete una fracción xi, 0 ≤ xi ≤ 1, del
objeto i en la mochila, entonces se
consigue un beneficio bixi.
v El objetivo es llenar la mochila de
manera que se maximice el beneficio
total.
v Pero como la mochila tiene capacidad
C, el peso total de todos los objetos
metidos en ella no puede superar esa
cantidad.
9. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 9
v Formalmente:
v Una solución factible es cualquier
n-tupla (x1,…,xn) que satisfaga (2) y (3).
v Una solución óptima es cualquier
solución factible para la que (1) sea
máximo.
v Si p1+⋅⋅⋅+pn≤C, entonces obviamente
xi=1, 1≤i≤n, es una solución óptima.
v Por tanto, supongamos que p1+⋅⋅⋅+pn>C.
v Nótese además que todas las soluciones
óptimas llenarán la mochila por
completo (podemos poner ‘=‘ en (2)).
El problema de la mochila
maximizar Σ bixi (1)
sujeto a Σ pixi ≤ C (2)
con 0≤xi≤1, bi>0, pi>0, 1≤i≤n (3)
1≤i≤n
1≤i≤n
10. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 10
v Ejemplo:
n=3 C=17
(b1,b2,b3)=(40,36,22)
(p1,p2,p3)=(15,12,8)
v Tres soluciones factibles:
El problema de la mochila
(x1,x2,x3)
(i) (1,1/6,0) 46
(ii) (0,3/4,1) 49
(iii) (0,1,5/8) 49’75
1≤i≤3
Σ bixi
11. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 11
v Solución voraz:
– El conjunto de candidatos son los objetos,
tomándose de ellos cierta fracción.
– Un conjunto de candidatos es completable si la
suma de sus pesos no supera la capacidad de la
mochila, y es una solución si iguala dicha
capacidad.
– La función objetivo a maximizar es
– La función de selección es la más difícil de
determinar.
u Si procedemos vorazmente, en cada paso
debemos considerar un objeto y tomar cierta
fracción suya.
u La cuestión de qué fracción se toma es más
fácil de resolver: si hemos elegido el mejor
candidato, tomamos todo lo que podamos
de él.
El problema de la mochila
1≤i≤n
Σ bixi.
12. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 12
– ¿Cuál es el mejor candidato (es decir, la mejor
función de selección)?
– Volvamos al ejemplo:
u Primera estrategia: elegir el objeto con
mayor beneficio total (el primero).
Sin embargo, la mochila se llena muy
rápidamente con poco beneficio total.
u Segunda estrategia: elegir el objeto que llene
menos la mochila, para acumular beneficios
de un número mayor de objetos. Sin
embargo, es posible que se elija un objeto
con poco beneficio simplemente porque
pesa poco.
u La tercera estrategia, que es la óptima, es
tomar siempre el objeto que proporcione
mayor beneficio por unidad de peso.
– Los algoritmos resultantes de aplicar cualquiera
de las dos primeras estrategias también son
voraces, pero no calculan la solución óptima.
El problema de la mochila
13. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 13
El problema de la mochila
{Pre: ∀i∈1..n:peso[i]>0 ∧
∀i∈1..n-1:benef[i]/peso[i]≥benef[i+1]/peso[i+1]}
función mochila(benef,peso:vectReal;
cap:real) devuelve vectReal
variables resto:real; i:entero;
sol:vectReal
principio
para todo i en 1..n hacer
sol[i]:=0.0 {inicializar solución}
fpara;
resto:=cap; {capacidad restante}
i:=1;
mq (i≤n) and (peso[i]≤resto) hacer
sol[i]:=1;
resto:=resto-peso[i];
i:=i+1
fmq;
si i≤n entonces sol[i]:=resto/peso[i] fsi;
devuelve sol
fin
{Post: sol es solución óptima del problema de
la mochila}
{Pre: ∀i∈1..n:peso[i]>0 ∧
∀i∈1..n-1:benef[i]/peso[i]≥benef[i+1]/peso[i+1]}
función mochila(benef,peso:vectReal;
cap:real) devuelve vectReal
variables resto:real; i:entero;
sol:vectReal
principio
para todo i en 1..n hacer
sol[i]:=0.0 {inicializar solución}
fpara;
resto:=cap; {capacidad restante}
i:=1;
mq (i≤n) and (peso[i]≤resto) hacer
sol[i]:=1;
resto:=resto-peso[i];
i:=i+1
fmq;
si i≤n entonces sol[i]:=resto/peso[i] fsi;
devuelve sol
fin
{Post: sol es solución óptima del problema de
la mochila}
constante n=... {número de objetos}
tipo vectReal=vector[1..n] de real
constante n=... {número de objetos}
tipo vectReal=vector[1..n] de real
14. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 14
v Coste temporal: Θ(n)
Θ(nlog n) si se tiene en cuenta que hay que
ordenar primero los vectores.
v Demostración de la corrección:
Sea X=(x1,…,xn) la solución generada por el
algoritmo voraz.
Si todos los xi son iguales a 1, la solución es
claramente óptima.
Luego, sea j el menor índice tal que xj≠1. Por
tanto xi=1 para 1≤i<j, xi=0 para j<i≤n, y 0≤xj<1.
Si X no es óptima entonces existe otra solución
factible Y=(y1,…,yn) tal que Σ biyi > Σ bixi.
Sin perdida de generalidad, asumimos que
Σ piyi =C.
Sea k el menor índice tal que yk≠xk (claramente,
existe ese k).
Se verifica: yk<xk . En efecto:
u Si k<j entonces xk=1. Pero yk≠xk luego yk<xk .
u Si k=j entonces, puesto que Σ piyi =C y yi=xi
para 1≤i<j, se sigue que yk<xk ó Σ piyi >C.
u Si k>j entonces Σ piyi >C, y eso no es posible.
El problema de la mochila
15. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 15
Ahora, supongamos que aumentamos yk hasta xk
y disminuímos tantos (yk+1,…,yn) como sea
necesario para que la capacidad utilizada siga
siendo C.
Se obtiene así una nueva solución Z=(z1,…,zn)
con zi=xi, para 1≤i≤k y Σk<i≤n pi(yi -zi)=pk(zk-yk).
Entonces:
Σ1≤i≤n bizi = Σ1≤i≤n biyi + (zk-yk)pkbk/pk -
- Σk<i≤n (yi -zi)pibi/pi
≥ Σ1≤i≤n biyi +
+ [(zk-yk)pk - Σk<i≤n (yi -zi)pi]bk/pk
= Σ1≤i≤n biyi
Si Σ1≤i≤n bizi > Σ1≤i≤n biyi entonces Y no puede ser
óptima.
Si esas sumas son iguales entonces bien Z=X y X
es óptima, o bien Z≠X.
En este último caso, se usa de nuevo el mismo
argumento hasta demostrar que bien Y no es
óptima o bien Y se transforma en X,
demostrando que X también es óptima. n
El problema de la mochila
16. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 16
Caminos mínimos en grafos
v Grafos etiquetados con pesos no
negativos
v Búsqueda de caminos de longitud
mínima
– longitud o coste de un camino: suma de los
pesos de las aristas que lo componen
– cálculo de la longitud mínima de los caminos
existentes entre dos vértices dados
v Características del tipo de dato de las
etiquetas (o pesos):
– dominio ordenado (<, =, ≤)
– operación suma (+):
u conmutativa
u con elemento neutro (0), que es además el
peso más pequeño posible
u con elemento idempotente (∞), que es
además el peso más grande posible
1
3
4
2 5
5
12 3
421
1
3
4
2 5
5
12 3
421
17. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 17
Caminos mínimos en grafos
v Representaciones de grafos:
Matriz de adyacencia
– Grafo dirigido G=(V,A) con V={1,2,…,n}.
– La matriz de adyacencia para G es una matriz A
de dimensiones n × n de elementos booleanos en
la que A[i,j] es verdad si y sólo si existe una
arista en G que va del vértice i al vértice j.
– En el caso de un grafo no dirigido, la matriz de
adyacencia tiene la particularidad de ser
simétrica y los elementos de su diagonal son
todos igual a falso.
A =
falso verdad falso
verdad falso verdad
falso falso falso
Matriz de adyacencia
3
2
1
Grafo
dirigido
constante n = ... {cardinal de V}
tipo grafo =
= vector[1..n,1..n]de booleano
constante n = ... {cardinal de V}
tipo grafo =
= vector[1..n,1..n]de booleano
18. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 18
Caminos mínimos en grafos
– La representación de la matriz de adyacencia es
útil para aquellos algoritmos que precisan saber
si existe o no una arista entre dos vértices dados.
– En el caso de grafos etiquetados con pesos, los
elementos de la matriz pueden ser enteros o
reales (en lugar de booleanos) y representar el
peso de la arista. Si no existe una arista de i a j,
debe emplearse un valor que no pueda ser una
etiqueta válida para almacenarse en A[i,j].
– Un inconveniente de la representación de la
matriz de adyacencia es que requiere un espacio
en Θ(n2) aunque el grafo tenga muy pocas
aristas.
– Dado un grafo G=(V,A) representado mediante
su matriz de adyacencia, la pregunta ¿(u,v)∈A?
se puede contestar en un tiempo en Θ(1).
– Sin embargo, la operación sucesores(g,v)
necesita un tiempo en Θ(n) (pues hay que
recorrer una fila completa de la matriz).
– Más aún, para saber, por ejemplo, si un grafo no
dirigido representado mediante su matriz de
adyacencia es conexo, o simplemente para
conocer el número de aristas, los algoritmos
requieren un tiempo en Θ(n2), lo cual es más de
lo que cabría esperar.
19. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 19
Caminos mínimos en grafos
v Listas de adyacencia
– Esta representación sirve para mejorar la
eficiencia de los algoritmos sobre grafos que
necesitan acceder a los vértices sucesores a uno
dado.
– Consiste en almacenar n listas enlazadas
mediante punteros de forma que la lista i-ésima
contiene los vértices sucesores del vértice i.
nil
2 nil
1 3 nil
1
2
3
Vector de listas de adyacencia
3
2
1
Grafo
dirigido
constante n = ... {cardinal de V}
tipos ptNodo = ↑nodo;
nodo = registro
vértice:1..n;
sig:ptNodo
freg
grafo = vector[1..n] de ptNodo
constante n = ... {cardinal de V}
tipos ptNodo = ↑nodo;
nodo = registro
vértice:1..n;
sig:ptNodo
freg
grafo = vector[1..n] de ptNodo
20. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 20
Caminos mínimos en grafos
– La representación de un grafo con listas de
adyacencia requiere un espacio del orden del
máximo entre n (el número de vértices) y a (el
número de aristas).
– En el caso de un grafo no dirigido, si (u,v)∈A
entonces el vértice v estará en la lista
correspondiente al vértice u, y el vértice u lo
estará a su vez en la lista de adyacencia del
vértice v.
– Para representar un grafo etiquetado con pesos
basta con añadir otro campo al tipo nodo que
almacene el peso correspondiente.
– Acceder a la lista de los vértices sucesores de
uno dado lleva un tiempo constante.
– Sin embargo, consultar si una determinada arista
(u,v) está en el grafo precisa recorrer la lista
asociada al vértice u, lo que en el caso peor se
realiza en Θ(n).
21. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 21
Caminos mínimos en grafos
– En el caso de un grafo dirigido, si se necesita
saber los predecesores de un vértice dado, la
representación con listas de adyacencia no es
adecuada.
Ese problema puede superarse si se almacena
otro vector de n listas de forma que la lista
i-ésima contenga los vértices predecesores del
vértice i.
Estas listas se llaman listas de adyacencia
inversa.
2 nil
1
2
3
1 nil
2 nil
Vector de listas de adyacencia inversa
3
2
1
Grafo
dirigido
22. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 22
Caminos mínimos en grafos
v Listas múltiples de adyacencia
– En el caso de grafos dirigidos, las listas de
adyacencia directa e inversa pueden
representarse de forma más compacta…
– Una lista múltiple es una estructura dinámica de
datos enlazados mediante punteros en la que
cada dato puede pertenecer a dos o más listas.
– Hay un nodo por cada una de las aristas del
grafo.
– Cada nodo guarda la clave de dos vértices
(origen y destino de la arista) y dos punteros: el
primero al nodo que guarda la siguiente arista
que tiene el mismo vértice destino y el segundo
al nodo que guarda la siguiente arista que tiene
el mismo vértice origen.
3
2
1
nil
1
2
3
Listas de adyacencia
Listas de adyacencia inversa
1 2 3
3 nil2 nil
2 nil1 nil
12 nilGrafo dirigido
23. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 23
Caminos mínimos en grafos
Nótese que se emplea la palabra “adyacente” con
el significado de “sucesor”, mientras que
“adyacente inverso” se refiere a “predecesor”.
constante n = ... {cardinal de V}
tipos ptNodo = ↑nodo;
nodo = registro
origen,destino: 1..n;
sigInvAdy,sigAdy:ptNodo
freg
grafoDirigido =
= registro
adyacentes, invAdyacentes:
vector[1..n] de ptNodo
freg
constante n = ... {cardinal de V}
tipos ptNodo = ↑nodo;
nodo = registro
origen,destino: 1..n;
sigInvAdy,sigAdy:ptNodo
freg
grafoDirigido =
= registro
adyacentes, invAdyacentes:
vector[1..n] de ptNodo
freg
24. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 24
Caminos mínimos en grafos
– Las listas múltiples pueden utilizarse también
para representar grafos no dirigidos.
– De esta forma, en lugar de que a cada arista le
correspondan dos nodos en la estructura
dinámica (como ocurre con la representación
basada en listas “ simples” de adyacencia),
puede representarse cada arista con un solo nodo
y hacer que éste pertenezca a dos listas de
adyacencia diferentes.
4
1
2 3
4 nil2 3
1 3 4 nil
1 2 4 nil
1 2 3 nil
1
2
3
4
Grafo no dirigido Listas de adyacencia
Listas múltiples de adyacencia
1
2
3
4
1 2
1 3 2 3
1 4
nil
2 4
nil nil
3 4
nil
25. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 25
Caminos mínimos en grafos
– La definición de la estructura de datos es la
siguiente:
– Una ventaja de esta representación es que es útil
para implementar aquellos algoritmos que
necesitan recorrer un grafo y al mismo tiempo
“marcar” las aristas por las que se pasa (bastaría
con añadir un campo booleano al tipo nodo).
constante n = ... {cardinal de V}
tipos ptNodo = ↑nodo;
nodo = registro
v1,v2:1..n;
sig1,sig2:ptNodo
freg
grafoNoDirigido =
= vector[1..n] de ptNodo
constante n = ... {cardinal de V}
tipos ptNodo = ↑nodo;
nodo = registro
v1,v2:1..n;
sig1,sig2:ptNodo
freg
grafoNoDirigido =
= vector[1..n] de ptNodo
26. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 26
Caminos mínimos en grafos
v Cálculo del coste del camino mínimo
desde un vértice dado al resto, en un
grafo etiquetado con pesos no
negativos
v Utilidad:
el grafo representa una distribución geográfica,
donde las aristas dan el coste (precio, distancia...)
de la conexión entre dos lugares y se desea
averiguar el camino más corto (barato...) para
llegar a un punto partiendo de otro
27. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 27
Caminos mínimos en grafos
v Solución voraz: Algoritmo de Dijkstra
– para grafos dirigidos (la extensión a no dirigidos
es inmediata)
– genera uno a uno los caminos de un nodo v al
resto por orden creciente de longitud
– usa un conjunto de vértices donde, a cada paso,
se guardan los nodos para los que ya se sabe el
camino mínimo
– devuelve un vector indexado por vértices: en
cada posición w se guarda el coste del camino
mínimo que conecta v con w
– cada vez que se incorpora un nodo a la solución
se comprueba si los caminos todavía no
definitivos se pueden acortar pasando por él
– se supone que el camino mínimo de un nodo a sí
mismo tiene coste nulo
– un valor ∞ en la posición w del vector indica que
no hay ningún camino desde v a w
E.W. Dijkstra:
“A note on two problems in connexion with graphs”,
Numerical Mathematica, 1, pp. 269-271, 1959.
28. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 28
Caminos mínimos en grafos
{Pre: g es un grafo dirigido etiquetado no neg.}
función Dijkstra(g:grafo; v:vért)
devuelve vector[vért] de etiq
variables S:cjtVért;
D:vector[vért] de etiq
principio
∀w∈vért:D[w]:=etiqueta(g,v,w);
D[v]:=0; S:={v};
mq S no contenga todos los vértices hacer
{D contiene caminos mínimos formados íntegra-
mente por nodos de S (excepto el último), y
los nodos de S corresponden a los caminos mí-
nimos más cortos calculados hasta el momento}
elegir w∉S t.q. D[w] es mínimo;
S:=S∪{w};
∀u∉S:actualizar dist.mín. comprobando
si por w hay un atajo
fmq;
devuelve D
fin
{Post: D=caminosMínimos(g,v)}
{Pre: g es un grafo dirigido etiquetado no neg.}
función Dijkstra(g:grafo; v:vért)
devuelve vector[vért] de etiq
variables S:cjtVért;
D:vector[vért] de etiq
principio
∀w∈vért:D[w]:=etiqueta(g,v,w);
D[v]:=0; S:={v};
mq S no contenga todos los vértices hacer
{D contiene caminos mínimos formados íntegra-
mente por nodos de S (excepto el último), y
los nodos de S corresponden a los caminos mí-
nimos más cortos calculados hasta el momento}
elegir w∉S t.q. D[w] es mínimo;
S:=S∪{w};
∀u∉S:actualizar dist.mín. comprobando
si por w hay un atajo
fmq;
devuelve D
fin
{Post: D=caminosMínimos(g,v)}
29. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 29
Caminos mínimos en grafos
v Corrección:
Apuntes de la asignatura de Matemática Discreta
o buscar en bibliografía.
v Se presenta a continuación una
implementación más detallada
– Se utiliza en lugar de S su complementario T
– Se supone que n es el número de vértices
30. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 30
Caminos mínimos en grafos
{Pre: g es un grafo dirigido etiquetado no neg.}
función Dijkstra(g:grafo; v:vért)
devuelve vector[vért] de etiq
variables T:cjtVért;
D:vector[vért] de etiq;
u,w:vért; val:etiq
principio
T:=∅;
para todo w en vért hacer
D[w]:=etiqueta(g,v,w); T:=T∪{w}
fpara;
D[v]:=0; T:=T-{v};
repetir n-2 veces {quedan n-1 caminos por
determinar}
{selección del mín.w: w∈T ∧ ∀u∈T:D[w]≤D[u]}
val:=∞;
para todo u en T hacer
si D[u]≤val ent w:=u; val:=D[u] fsi
{siempre hay un nodo que cumple la condic}
fpara;
...
{Pre: g es un grafo dirigido etiquetado no neg.}
función Dijkstra(g:grafo; v:vért)
devuelve vector[vért] de etiq
variables T:cjtVért;
D:vector[vért] de etiq;
u,w:vért; val:etiq
principio
T:=∅;
para todo w en vért hacer
D[w]:=etiqueta(g,v,w); T:=T∪{w}
fpara;
D[v]:=0; T:=T-{v};
repetir n-2 veces {quedan n-1 caminos por
determinar}
{selección del mín.w: w∈T ∧ ∀u∈T:D[w]≤D[u]}
val:=∞;
para todo u en T hacer
si D[u]≤val ent w:=u; val:=D[u] fsi
{siempre hay un nodo que cumple la condic}
fpara;
...
31. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 31
Caminos mínimos en grafos
...
{se marca w como vértice tratado}
T:=T-{w};
{se recalculan las nuevas dist. mínimas}
para todo u en T hacer
si D[w]+etiqueta(g,w,u)<D[u]
ent D[u]:=D[w]+etiqueta(g,w,u)
fsi
fpara
frepetir;
devuelve D
fin
{Post: D=caminosMínimos(g,v)
...
{se marca w como vértice tratado}
T:=T-{w};
{se recalculan las nuevas dist. mínimas}
para todo u en T hacer
si D[w]+etiqueta(g,w,u)<D[u]
ent D[u]:=D[w]+etiqueta(g,w,u)
fsi
fpara
frepetir;
devuelve D
fin
{Post: D=caminosMínimos(g,v)
Nota: el bucle principal se ejecuta n-2 veces porque
el último camino queda calculado después del
último paso (no quedan vértices para hallar atajos)
32. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 32
Caminos mínimos en grafos
v Tiempo de ejecución:
– se supone que las operaciones sobre cjtos. están
implementadas en tiempo constante, excepto la
creación (p.ej., mediante un vector de booleanos)
– fase de inicialización:
u creación del cjto. y ejecución n veces de
diversas operaciones constantes: Θ(n)
– fase de selección:
u las instrucciones del interior del bucle son
Θ(1)
u nº de ejecuciones del bucle:
1ª vuelta: se consultan n-1 vértices,
2ª vuelta: n-2, etc.
(el cardinal de T decrece en 1 en cada paso)
nº de ejecuciones: n(n-1)/2-1 ⇒ Θ(n2)
– fase de “marcaje”:
u n supresiones a lo largo del algoritmo: Θ(n)
– fase de recálculo de las distancias mínimas:
u queda Θ(n2) por igual razón que la selección
Coste total: Θ(n2)
33. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 33
Caminos mínimos en grafos
v Mejoras en el tiempo de ejecución
– Si la representación es por listas de adyacencia,
la fase de recálculo se ejecuta sólo a (a<n2) veces
(sustituyendo el bucle sobre los vért. de T por
otro bucle sobre los vért. sucesores de w).
– Si el conjunto T se sustituye con una cola con pri-
oridades, se rebaja también el coste de la fase de
selección (puesto que se selecciona el mínimo).
Problema: la fase de recálculo puede exigir
cambiar la prioridad de un elemento cualquiera
de la cola.
Solución: nuevo tipo de cola con prioridades que
permita el acceso directo a cualquier elemento.
34. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 34
Caminos mínimos en grafos
– Implementación: montículo junto con un vector
indexado por vértices
género cpa {colaPriAristas}
operaciones
creaVacía: → cpa Θ(1)
inserta: cpa vért etiq → cpa Θ(log n)
primero: cpa → (vért,etiq) Θ(1)
borra: cpa → cpa Θ(log n)
sustit: cpa vért etiq → cpa Θ(log n)
valor: cpa vért → etiq Θ(1)
está?: cpa vért → bool Θ(1)
vacía?: cpa → bool Θ(1)
género cpa {colaPriAristas}
operaciones
creaVacía: → cpa Θ(1)
inserta: cpa vért etiq → cpa Θ(log n)
primero: cpa → (vért,etiq) Θ(1)
borra: cpa → cpa Θ(log n)
sustit: cpa vért etiq → cpa Θ(log n)
valor: cpa vért → etiq Θ(1)
está?: cpa vért → bool Θ(1)
vacía?: cpa → bool Θ(1)
1
2
3
4
5
<4,20>
<3,75>
<2,∞>
<5,60>
el valor ∞ de la etiqueta
significa que el vértice
no está en la cola
35. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 35
Caminos mínimos en grafos
{Pre: g es un grafo dirigido etiquetado no neg.}
función Dijkstra(g:grafo; v:vért)
devuelve vector[vért] de etiq
variables A:cpa; {cola de aristas con prior.}
D:vector[vért] de etiq;
u,w:vért; et,val:etiq
principio
{crear la cola con todas las aristas <v,w>}
creaVacía(A);
para todo w en vért hacer
inserta(A,w,etiqueta(g,v,w))
fpara;
mq not esVacía(A) hacer
<w,val>:=primero(A);{selecc. arista mín.}
D[w]:=val; borra(A);{marca w como tratado}
{se recalculan las nuevas dist. mínimas}
para todo <u,et> en suc(g,w) hacer
si está(A,u) entonces
si val+et<valor(A,u)
ent sustituye(A,u,val+et)
fsi
fsi
fpara
fmq;
D[v]:=0; devuelve D
fin
{Post: D=caminosMínimos(g,v)}
{Pre: g es un grafo dirigido etiquetado no neg.}
función Dijkstra(g:grafo; v:vért)
devuelve vector[vért] de etiq
variables A:cpa; {cola de aristas con prior.}
D:vector[vért] de etiq;
u,w:vért; et,val:etiq
principio
{crear la cola con todas las aristas <v,w>}
creaVacía(A);
para todo w en vért hacer
inserta(A,w,etiqueta(g,v,w))
fpara;
mq not esVacía(A) hacer
<w,val>:=primero(A);{selecc. arista mín.}
D[w]:=val; borra(A);{marca w como tratado}
{se recalculan las nuevas dist. mínimas}
para todo <u,et> en suc(g,w) hacer
si está(A,u) entonces
si val+et<valor(A,u)
ent sustituye(A,u,val+et)
fsi
fsi
fpara
fmq;
D[v]:=0; devuelve D
fin
{Post: D=caminosMínimos(g,v)}
36. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 36
Caminos mínimos en grafos
v Eficiencia temporal:
– inicialización: Θ(nlog n)
– selección y supresión: Θ(nlog n)
– bucle interno: examina todas las aristas del grafo
y en el caso peor efectúa una sustitución por
arista, por tanto: Θ(alog n)
• El coste total es:Θ((a+n)log n), luego es mejor
que la versión anterior si el grafo es disperso.
• Si el grafo es denso, el algoritmo original es
mejor.
• Puede conseguirse un coste en Θ(n2) para grafos
densos y en Θ(alog n) para no densos,
representando el montículo en un árbol k-ario
en lugar de binario [BB90, pp. 93-94].
37. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 37
Caminos mínimos en grafos
v Ejercicio: cálculo de la secuencia de
nodos que componen el camino
mínimo
– si el camino mínimo entre v y w pasa por u, el
camino mínimo entre v y u es un prefijo del
camino mínimo entre v y w
– basta con devolver un vector C tal que C[w]
contenga el nodo anterior en el camino mínimo
de v a w (que será v si está directamente unido al
nodo de partida o si no hay camino entre v y w)
– el vector debe actualizarse al encontrarse un
atajo en el camino
– es necesario también diseñar un nuevo algoritmo
para recuperar el camino a un nodo dado, que
tendría como parámetro C
38. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 38
Árboles de recubrimiento de
coste mínimo
v Objetivo: dado un grafo, obtener un
nuevo grafo que sólo contenga las
aristas imprescindibles para una
optimización global de las conexiones
entre todos los nodos
“optimización global”: algunos pares de nodos
pueden no quedar conectados entre ellos con el
mínimo coste posible en el grafo original
v Aplicación: problemas que tienen que
ver con distribuciones geográficas
conjunto de computadores distribuidos
geográficamente en diversas ciudades de
diferentes países a los que se quiere conectar
para intercambiar datos, compartir recursos, etc.;
se pide a las compañías telefónicas respectivas
los precios de alquiler de líneas entre ciudades
asegurar que todos los computadores pueden
comunicar entre sí, minimizando el precio total
de la red
39. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 39
Árboles de recubrimiento de
coste mínimo
v Terminología:
– árbol libre:
es un grafo no dirigido conexo acíclico
u todo árbol libre con n vértices tiene n-1 aristas
u si se añade una arista se introduce un ciclo
u si se borra una arista quedan vértices no
conectados
u cualquier par de vértices está unido por un único
camino simple
u un árbol libre con un vértice distinguido es un
árbol con raíz
– árbol de recubrimiento de un grafo no dirigido y
etiquetado no negativamente:
es cualquier subgrafo que contenga todos los
vértices y que sea un árbol libre
– árbol de recubrimiento de coste mínimo:
es un árbol de recubrimiento y
no hay ningún otro árbol de recubrimiento cuya
suma de aristas sea menor
– notación: arm(g)={árboles de recubrimiento
de coste mínimo de g}
40. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 40
Árboles de recubrimiento de
coste mínimo
v Propiedad fundamental de los árboles
de recubrimiento de coste mínimo:
“Sea g un grafo no dirigido conexo y etiquetado
no negativamente, g∈{f:V×V→E},
sea U un conjunto de vértices, U⊂V, U≠∅,
si <u,v> es la arista más pequeña de g tal que
u∈U y v∈VU,
entonces existe algún árbol de recubrimiento
de coste mínimo de g que la contiene.”
Dem: Por reducción al absurdo [AHU88, p. 234].
41. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 41
Árboles de recubrimiento de
coste mínimo
v Algoritmo de Prim (debido a Jarník)
– Aplica reiteradamente la propiedad de los
árboles de recubrimiento de coste mínimo
incorporando a cada paso una arista
– Se usa un conjunto U de vértices tratados y se
selecciona en cada paso la arista mínima que une
un vértice de U con otro de su complementario
V. Jarník: “O jistém problému minimálním”,
Práca Moravské Prírodovedecké Spolecnosti, 6,
pp. 57-63, 1930.
R.C. Prim:
“Shortest connection networks and some generalizations”,
Bell System Technical Journal, 36, pp. 1389-1401, 1957.
42. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 42
Árboles de recubrimiento de
coste mínimo
{Pre: g es un grafo no dirigido conexo
etiquetado no negativamente}
función Prim(g:grafo) devuelve grafo
variables U:cjtVért; gsol:grafo;
u,v:vért; x:etiq
principio
creaVacío(gsol); U:={cualquier vértice};
mq U no contenga todos los vért. hacer
seleccionar <u,v,x> mínima t.q. u∈U;v∉U
añade(gsol,u,v,x); U:=U∪{v}
fmq;
devuelve gsol
fin
{Post: gsol∈arm(g)}
{Pre: g es un grafo no dirigido conexo
etiquetado no negativamente}
función Prim(g:grafo) devuelve grafo
variables U:cjtVért; gsol:grafo;
u,v:vért; x:etiq
principio
creaVacío(gsol); U:={cualquier vértice};
mq U no contenga todos los vért. hacer
seleccionar <u,v,x> mínima t.q. u∈U;v∉U
añade(gsol,u,v,x); U:=U∪{v}
fmq;
devuelve gsol
fin
{Post: gsol∈arm(g)}
Coste: Θ(na)
(es decir, Θ(n3) si el grafo es denso)
43. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 43
Árboles de recubrimiento de
coste mínimo
v La versión previa puede refinarse hasta
obtener un algoritmo en Θ(n2), es decir,
mejor que el anterior (a≥n-1).
Se usa un vector arisMín, indexado por vértices,
que contiene:
si v∉U: arisMín[v]=<w,g(v,w)> t.q. <v,w> es la
arista más pequeña que conecta v
con un vértice w∈U
si v∈U: arisMín[v]=<v,∞>
44. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 44
Árboles de recubrimiento de
coste mínimo
{Pre: g es un grafo no dirigido conexo
etiquetado no negativamente}
función Prim(g:grafo) devuelve grafo
variables
arisMín:vector[vért] de <vért,etiq>;
gsol:grafo; prim,mín,v,w:vért; x:etiq
principio
{inicialización del resultado}
prim:=unVérticeCualquiera;
arisMín[prim]:=<prim,∞>;
para todo v en vért hacer
arisMín[v]:=<prim,etiqueta(g,prim,v)>
fpara;
{a continuación se aplica el método}
creaVacío(gsol);
hacer n-1 veces
mín:=prim; {centinela: arisMín[mín].et=∞}
para todo v en vért hacer
<w,x>:=arisMín[v];
si x<arisMín[mín].et
ent mín:=v {como mínimo habrá uno}
fsi;
fpara;
...
{Pre: g es un grafo no dirigido conexo
etiquetado no negativamente}
función Prim(g:grafo) devuelve grafo
variables
arisMín:vector[vért] de <vért,etiq>;
gsol:grafo; prim,mín,v,w:vért; x:etiq
principio
{inicialización del resultado}
prim:=unVérticeCualquiera;
arisMín[prim]:=<prim,∞>;
para todo v en vért hacer
arisMín[v]:=<prim,etiqueta(g,prim,v)>
fpara;
{a continuación se aplica el método}
creaVacío(gsol);
hacer n-1 veces
mín:=prim; {centinela: arisMín[mín].et=∞}
para todo v en vért hacer
<w,x>:=arisMín[v];
si x<arisMín[mín].et
ent mín:=v {como mínimo habrá uno}
fsi;
fpara;
...
45. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 45
Árboles de recubrimiento de
coste mínimo
...
{a continuación se añade a la solución}
añade(gsol,mín,arisMín[mín].v,
arisMín[mín].et);
{se añade mín al conjunto de vértices tratados}
arisMín[mín]:=<mín,∞>;
{se reorganiza el vector comprobando si la
arista mínima de los vértices todavía no
tratados los conecta a mín}
para todo <v,x> en
adyacentes(g,mín) hacer
si (arisMín[v].v≠v)and(x<arisMín[v].et)
entonces arisMín[v]:=<mín,x> fsi
fpara
frepetir;
devuelve gsol
fin
{Post: gsol∈arm(g)}
...
{a continuación se añade a la solución}
añade(gsol,mín,arisMín[mín].v,
arisMín[mín].et);
{se añade mín al conjunto de vértices tratados}
arisMín[mín]:=<mín,∞>;
{se reorganiza el vector comprobando si la
arista mínima de los vértices todavía no
tratados los conecta a mín}
para todo <v,x> en
adyacentes(g,mín) hacer
si (arisMín[v].v≠v)and(x<arisMín[v].et)
entonces arisMín[v]:=<mín,x> fsi
fpara
frepetir;
devuelve gsol
fin
{Post: gsol∈arm(g)}
46. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 46
Árboles de recubrimiento de
coste mínimo
v Eficiencia temporal:
– inicialización: lineal en caso de matriz de
adyacencia y cuadrática en caso de listas
– bucle principal:
u el bucle de selección: Θ(n)
u el añadido de una arista al grafo: constante
usando matriz, lineal usando listas
u el bucle de reorganización:
– con matriz de adyacencia: el cálculo de los
adyacentes es Θ(n) y el coste total queda Θ(n2)
– con listas: el coste total es Θ(a+n)
Coste total: Θ(n2), independientemente
de la representación.
Coste espacial: Θ(n) de espacio adicional.
47. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 47
Árboles de recubrimiento de
coste mínimo
v Algoritmo de Kruskal:
– Se basa también en la propiedad de los árboles
de recubrimiento de coste mínimo:
Partiendo del árbol vacío, se selecciona en cada
paso la arista de menor etiqueta que no
provoque ciclo sin requerir ninguna otra
condición sobre sus extremos.
J.B. Kruskal: “On the shortest spanning subtree of a graph
and the traveling salesman problem”, Proceedings of the
American Mathematical Society, 7, pp. 48-50, 1956.
48. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 48
Árboles de recubrimiento de
coste mínimo
{Pre: g es un grafo no dirigido conexo
etiquetado no negativamente}
función Kruskal(g:grafo) devuelve grafo
variables gsol:grafo;
u,v:vért; x:etiq
principio
creaVacío(gsol);
mq gsol no sea conexo hacer
seleccionar <u,v,x> mínima no examinada;
si no provoca ciclo
entonces añade(gsol,u,v,x)
fsi
fmq;
devuelve gsol
fin
{Post: gsol∈arm(g)}
{Pre: g es un grafo no dirigido conexo
etiquetado no negativamente}
función Kruskal(g:grafo) devuelve grafo
variables gsol:grafo;
u,v:vért; x:etiq
principio
creaVacío(gsol);
mq gsol no sea conexo hacer
seleccionar <u,v,x> mínima no examinada;
si no provoca ciclo
entonces añade(gsol,u,v,x)
fsi
fmq;
devuelve gsol
fin
{Post: gsol∈arm(g)}
Nota: componentes(gsol) devuelve el conjunto de
componentes conexos de gsol.
(∗) Utilizar una cola con prioridades.
(∗)
49. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 49
v Implementación eficiente:
– En cada momento, los vértices que están dentro
de una componente conexa en la solución
forman una clase de equivalencia, y el algoritmo
se puede considerar como la fusión continuada
de clases hasta obtener una única componente
con todos los vértices del grafo.
Árboles de recubrimiento de
coste mínimo
C
E
A B
D
30
50
50
60
40 40
10 20
C
E
A B
D
3
4
1 2
Evolución de las clases de equivalencia:
{[A],[B],[C],[D],[E]} → {[A],[B],[C,D],[E]} →
→ {[A],[B],[C,D,E]} → {[A,B],[C,D,E]} →
→ {[A,B,C,D,E]}
50. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 50
v Se utiliza el TAD “relación de
equivalencia” sobre los vértices
Implementación asintóticamente óptima:
u basada en una representación del tipo rev
usando árboles y una técnica de compresión
de caminos [AHU88, pp. 182-191]
u el coste de creaREV es lineal
u el coste de numClases es constante
u el coste de k ejecuciones combinadas de
fusiona y clase es Θ(kα(k,n)), lo cual es
prácticamente constante, porque
α es una función inversa de la
función de Ackerman que crece MUY
despacio (α(k,n)≤4, para todos los valores de
k y n “imaginables”)
Árboles de recubrimiento de
coste mínimo
género rev {relac. de equiv. sobre vért.}
operaciones
creaREV: → rev {cada vért. una clase}
clase: rev vért → nat
fusiona: rev nat nat → rev
numClases: rev → nat
género rev {relac. de equiv. sobre vért.}
operaciones
creaREV: → rev {cada vért. una clase}
clase: rev vért → nat
fusiona: rev nat nat → rev
numClases: rev → nat
51. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 51
Árboles de recubrimiento de
coste mínimo
{Pre: g es un grafo no dirigido conexo
etiquetado no negativamente}
función Kruskal(g:grafo) devuelve grafo
variables T:cpa; gsol:grafo;
u,v:vért; x:etiq;
C:rev; ucomp,vcomp:nat
principio
creaREV(C); {cada vért. forma una clase}
creaVacío(gsol); creaVacía(T);
{se colocan todas las aristas en la cola}
para todo v en vért hacer
para todo <u,x> en adyacentes(g,v) hacer
inserta(T,v,u,x)
fpara
fpara;
...
{Pre: g es un grafo no dirigido conexo
etiquetado no negativamente}
función Kruskal(g:grafo) devuelve grafo
variables T:cpa; gsol:grafo;
u,v:vért; x:etiq;
C:rev; ucomp,vcomp:nat
principio
creaREV(C); {cada vért. forma una clase}
creaVacío(gsol); creaVacía(T);
{se colocan todas las aristas en la cola}
para todo v en vért hacer
para todo <u,x> en adyacentes(g,v) hacer
inserta(T,v,u,x)
fpara
fpara;
...
52. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 52
...
mq numClases(C)>1 hacer
{obtener y elim. la arista mín.de la cola}
<u,v,x>:=primero(T); borra(T);
{si la arista no provoca ciclo se añade a la
solución y se fusionan las clases corresp.}
ucomp:=clase(C,u); vcomp:=clase(C,v);
si ucomp≠vcomp entonces
fusiona(C,ucomp,vcomp);
añade(gsol,u,v,x)
fsi
fmq;
devuelve gsol
fin
{Post: gsol∈arm(g)}
...
mq numClases(C)>1 hacer
{obtener y elim. la arista mín.de la cola}
<u,v,x>:=primero(T); borra(T);
{si la arista no provoca ciclo se añade a la
solución y se fusionan las clases corresp.}
ucomp:=clase(C,u); vcomp:=clase(C,v);
si ucomp≠vcomp entonces
fusiona(C,ucomp,vcomp);
añade(gsol,u,v,x)
fsi
fmq;
devuelve gsol
fin
{Post: gsol∈arm(g)}
Árboles de recubrimiento de
coste mínimo
53. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 53
v Coste del algoritmo:
– las a inserciones consecutivas de aristas en la cola
con prioridades dan Θ(alog a); como a≤n2:
Θ(alog a)⊆Θ(alog n2)=Θ(2alog n)=Θ(alog n)
– como mucho hay a consultas y supresiones de la
arista mínima, el coste de la consulta es constante
y el de la supresión es Θ(log a); por ello, este
paso queda en Θ(alog n)
– averiguar cuántas clases hay en la relación de
equivalencia es constante
– en el caso peor, la operación de fusión de clases
se ejecuta n-1 veces y la operación de localizar la
clase 2a veces; por tanto, el coste total es en la
práctica Θ(a)
– las n-1 inserciones de aristas quedan en Θ(n) con
matriz de adyacencia y Θ(n2) con listas, aunque
en el caso de las listas puede reducirse también a
Θ(n) si se elimina en la operación de añade la
comprobación de existencia de la arista (el
algoritmo de Kruskal garantiza que no habrán
inserciones repetidas de aristas)
Coste total: Θ(alog n)
(menos que el algoritmo de Prim, aunque con
mayor espacio adicional)
Árboles de recubrimiento de
coste mínimo
54. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 54
v La selección de una candidata óptima
en cada paso es una estrategia
heurística que no siempre conduce a la
solución óptima.
v En ocasiones, se utilizan heurísticas
voraces para obtener soluciones
subóptimas cuando el cálculo de las
óptimas es demasiado costoso.
v ¿Puede saberse si una estrategia voraz
servirá para resolver un problema
concreto de optimización?
La respuesta es: NO siempre.
Sin embargo, existen ciertos indicios…:
la propiedad de la selección voraz y la
existencia de una subestructura
óptima.
Consideraciones sobre la
corrección del esquema voraz
55. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 55
v La propiedad de la selección voraz:
– Se verifica esta propiedad cuando una solución
globalmente óptima puede ser alcanzada
mediante selecciones localmente óptimas que
son tomadas en cada paso sin depender de las
selecciones futuras;
– en otras palabras, una estrategia voraz progresa
de arriba hacia abajo, tomando una decisión
voraz tras otra, reduciendo iterativamente el
problema a otro más pequeño.
Consideraciones sobre la
corrección del esquema voraz
56. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 56
v ¿Cómo se comprueba si se verifica la
propiedad de la selección voraz?
– Normalmente, se examina una solución
globalmente óptima,
– se trata de demostrar que esa solución puede ser
manipulada de forma que se obtiene tras una
primera selección voraz (localmente óptima),
– y esa selección reduce el problema a otro similar
pero más pequeño;
– se aplica inducción para demostrar que se puede
usar una selección voraz en cada paso
v Subestructura óptima:
– Un problema posee una subestructura óptima si
una solución óptima de ese problema incluye
soluciones óptimas de subproblemas.
hay que demostrar que una solución óptima
posee una “subestructura óptima”
Consideraciones sobre la
corrección del esquema voraz
57. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 57
Códigos de Huffman
v Los códigos de Huffman son una técni-
ca muy útil para comprimir ficheros.
v El algoritmo voraz de Huffman utiliza
una tabla de frecuencias de aparición
de cada carácter para construir una
forma óptima de representar los
caracteres con códigos binarios.
v Ejemplo:
– Se tiene un fichero con 100.000 caracteres que se
desea compactar. Las frecuencias de aparición de
caracteres en el fichero son las siguientes:
– Puede usarse un código de longitud fija (de 3
bits). El fichero requeriría 300.000 bits.
D.A. Huffman: “A method for the construction of
minimum-redundancy codes”,
Proceedings of the IRE, 40(9), pp. 1098-1101, 1952.
a b c d e f
frec. en miles 45 13 12 16 9 5
a b c d e f
cód.long.fija 000 001 010 011 100 101
58. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 58
– Puede hacerse mejor con un código de longitud
variable, dando codificaciones cortas a los
caracteres más frecuentes y más largas a los
menos frecuentes.
Este código ahorra algo más del 25% (requiere
224.000 bits en lugar de 300.000).
v Se precisa un código libre de prefijos:
– Ninguna codificación puede ser prefijo de otra.
– De esta forma, la decodificación es inmediata
pues no hay ambigüedades.
– Por ejemplo: ‘001011101’ sólo puede ser ‘aabe’.
v El código se representa mediante un
trie (árbol lexicográfico):
– árbol binario cuyas hojas son los caracteres
codificados;
– el código de cada carácter es el camino desde la
raíz hasta la hoja, donde ir al hijo izquierdo
significa ‘0’ e ir hacia el derecho significa ‘1’.
Códigos de Huffman
a b c d e f
cód.long.var. 0 101 100 111 1101 1100
59. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 59
v Ejemplo: árboles de los dos códigos
anteriores.
– Cada hoja está etiquetada con un carácter y su
frecuencia.
– Cada nodo interno está etiquetado con la suma
de los pesos de las hojas de su subárbol.
– Un código óptimo siempre está representado
por un árbol lleno: cada nodo interno tiene dos
hijos.
u Si el alfabeto que se quiere codificar es C, en-
tonces el árbol del código óptimo tiene |C|
hojas y |C|-1 nodos internos.
Códigos de Huffman
100
14
1458 28
a:45 b:13 c:12 d:16 e:9 f:5
86
0 1
0
0 0
0
0
1
1 1 1
100
0 1
25 30
c:12 b:13 d:16
55
0
0 0
1
1 1
14
f:5 e:9
0 1
a:45
60. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 60
v El algoritmo voraz de Huffman cons-
truye el árbol A de un código óptimo de
abajo hacia arriba.
v Utiliza una cola Q de árboles con
prioridades (las frecuencias hacen de
prioridades).
v Empieza con un conjunto de |C| hojas
en Q y realiza una secuencia de |C|-1
“mezclas” hasta crear el árbol final.
v En cada paso, se “mezclan” los dos
objetos (árboles) de Q que tienen menos
frecuencia y el resultado es un nuevo
objeto (árbol) cuya frecuencia es la
suma de las frecuencias de los dos
objetos mezclados.
Códigos de Huffman
61. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 61
Códigos de Huffman
{Pre: C es un conjunto de caracteres y f es el
vector de frecuencias de esos caracteres}
función Huffman(C:conjunto;f:vectFrec)
devuelve árbol
variables Q:colaPri; i,fx,fy,fz:entero;
z,x,y:árbol
principio
creaVacía(Q);
para todo x en C hacer
inserta(Q,<x,f[x]>)
fpara;
para i:=1 hasta |C|-1 hacer
<x,fx>:=primero(Q); borra(Q);
<y,fy>:=primero(Q); borra(Q);
fz:=fx+fy;
z:=creaÁrbol(raíz=>fz,
hijoIzq=>x;
hijoDer=>y);
inserta(Q,<z,fz>)
fpara;
<z,fz>:=primero(Q); borra(Q)
devuelve z
fin
{Post: z es el árbol de un código libre de
prefijos óptimo para (C,f)}
{Pre: C es un conjunto de caracteres y f es el
vector de frecuencias de esos caracteres}
función Huffman(C:conjunto;f:vectFrec)
devuelve árbol
variables Q:colaPri; i,fx,fy,fz:entero;
z,x,y:árbol
principio
creaVacía(Q);
para todo x en C hacer
inserta(Q,<x,f[x]>)
fpara;
para i:=1 hasta |C|-1 hacer
<x,fx>:=primero(Q); borra(Q);
<y,fy>:=primero(Q); borra(Q);
fz:=fx+fy;
z:=creaÁrbol(raíz=>fz,
hijoIzq=>x;
hijoDer=>y);
inserta(Q,<z,fz>)
fpara;
<z,fz>:=primero(Q); borra(Q)
devuelve z
fin
{Post: z es el árbol de un código libre de
prefijos óptimo para (C,f)}
63. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 63
v Coste temporal:
– inicialización de Q: Θ(|C|) (ejercicio)
– el interior del bucle: Θ(log |C|)
Coste total: Θ(|C|log |C|)
v Corrección: ver que se verifican las
propiedades de la selección voraz y de
la subestructura óptima.
v Propiedad de la selección voraz:
– Sea C un alfabeto en el que cada carácter c tiene
frecuencia f[c]. Sean x e y dos caracteres de C con
frecuencias mínimas. Entonces existe un código
libre de prefijos óptimo para C en el que las
codificaciones de x e y tienen igual longitud y se
diferencian sólo en el último bit.
La idea de la demostración consiste en tomar un
árbol que represente un código libre de prefijos
óptimo arbitrario y modificarlo hasta convertirlo
en otro árbol que represente otro código libre de
prefijos óptimo y tal que los caracteres x e y
aparezcan como hojas hermanas de máxima
profundidad.
Detalles en [CLR90, pp. 342-343].
Códigos de Huffman
64. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 64
– Por tanto, el proceso de construir un árbol
óptimo mediante mezclas puede empezar, sin
pérdida de generalidad, con la elección voraz de
mezclar los dos caracteres de menor frecuencia.
v Propiedad de la subestructura óptima:
– Sea T un árbol binario lleno que representa un
código libre de prefijos óptimo sobre un alfabeto
C, con frecuencia f[c] para cada carácter c∈C.
Sean x e y dos caracteres que aparecen como
hojas hermanas en T, y sea z su padre. Entonces,
considerando z como un carácter con frecuencia
f[z]=f[x]+f[y], el árbol T’=T-{x,y} representa un
código libre de prefijos óptimo para el alfabeto
C’=C-{x,y}∪{z}.
La demostración, en [CLR90, p. 343].
v La corrección del algoritmo se sigue de
los dos resultados anteriores, aplicando
inducción.
Códigos de Huffman
65. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 65
El problema de la selección de
actividades
v Es un problema de planificación de
tareas (en inglés, scheduling).
v Se tiene un conjunto S={1,2,…,n} de
actividades (por ej., clases) que deben
usar un recurso (por ej., un aula) que
sólo puede ser usado por una actividad
en cada instante.
v Cada actividad i tiene asociado un
instante de comienzo ci y un instante de
finalización fi, tales que ci≤fi, de forma
que la actividad i, si se realiza, debe
hacerse durante [ci,fi).
v Dos actividades i, j se dicen compati-
bles si los intervalos [ci,fi) y [cj,fj) no se
superponen (i.e., (ci≥fj)∨(cj≥fi)).
v El problema de selección de actividades
consiste en seleccionar un conjunto de
actividades mutuamente compatibles
que tenga cardinal máximo.
66. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 66
{Pre: ∀i∈1..n:c[i]≤f[i] ∧ ∀i∈1..n-1:f[i]≤f[i+1]}
función selec(c,f:vectReal)devuelve conjunto
variables i,j:entero; A:conjunto
principio
A:={1};
j:=1; {j es la última actividad seleccionada}
para i:=2 hasta n hacer
si c[i]≥f[j]
entonces A:=A∪{i}; j:=i
fsi
fpara;
devuelve A
fin
{Post: A es solución óptima del problema de
la selección de actividades.}
{Pre: ∀i∈1..n:c[i]≤f[i] ∧ ∀i∈1..n-1:f[i]≤f[i+1]}
función selec(c,f:vectReal)devuelve conjunto
variables i,j:entero; A:conjunto
principio
A:={1};
j:=1; {j es la última actividad seleccionada}
para i:=2 hasta n hacer
si c[i]≥f[j]
entonces A:=A∪{i}; j:=i
fsi
fpara;
devuelve A
fin
{Post: A es solución óptima del problema de
la selección de actividades.}
constante n=... {número de actividades}
tipo vectReal=vector[1..n] de real
constante n=... {número de actividades}
tipo vectReal=vector[1..n] de real
El problema de la selección de
actividades
67. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 67
v Coste temporal: Θ(n)
Θ(nlog n) si se tiene en cuenta que hay que
ordenar primero los vectores.
v Demostración de la corrección:
La actividad 1 tiene el primer instante de finali-
zación. Veamos que existe una solución óptima
que comienza con una selección voraz, es decir,
con la actividad 1.
Supongamos que A⊆S es una solución óptima y
que las actividades de A están ordenadas por
tiempos de finalización. Supongamos que la
primera actividad de A es la actividad k.
Si k=1, entonces A empieza con una selección
voraz.
Si k≠1, veamos que existe otra solución óptima B
que comienza con 1.
Sea B=A-{k}∪{1}. Como f1≤fk, las actividades
en B son disjuntas y como tiene el mismo
número de actividades que A entonces B es
también óptima.
El problema de la selección de
actividades
68. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 68
Después de la selección voraz de la actividad 1,
el problema se reduce a encontrar una solución
óptima del problema de selección actividades
sobre las actividades de S que son compatibles
con la actividad 1.
Entonces, si A es una solución óptima para el
problema original S, se tiene que A’=A{1} es
una solución óptima para el problema
S’={i∈S|ci≥f1}.
En efecto, si existiera una solución B’ para S’
con más actividades que A’, añadiendo la
actividad 1 a B’ tendríamos una solución B
para S con más actividades que A, en contra
de la optimalidad de A.
Por tanto, después de cada selección voraz, nos
encontramos con otro problema de optimización
con igual forma que el problema original.
Por inducción sobre el número de selecciones, y
realizando una selección voraz en cada paso, se
obtiene una solución óptima. n
El problema de la selección de
actividades
69. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 69
v Es otro problema de planificación de
tareas.
v Un servidor (por ej., un procesador, un
cajero automático, un surtidor de gaso-
lina, etc.) tiene que atender n clientes
que llegan todos juntos al sistema.
v El tiempo de servicio para cada cliente
es ti, i=1,2,…,n.
v Se quiere minimizar:
T = tiempo total que el cliente i está en el sistemaΣi=1
n
El problema de la minimiza-
ción del tiempo de espera
70. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 70
v Ejemplo:
3 clientes con t1=5, t2=10, t3=3.
El problema de la minimiza-
ción del tiempo de espera
orden T
1 2 3: 5 + (5+10) + (5+10+3) = 38
1 3 2: 5 + (5+3) + (5+3+10) = 31
2 1 3: 10 + (10+5) + (10+5+3) = 43
2 3 1: 10 + (10+3) + (10+3+5) = 41
3 1 2: 3 + (3+5) + (3+5+10) = 29
3 2 1: 3 + (3+10) + (3+10+5) = 34
óptimo
71. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 71
v Estrategia voraz:
Atender en cada paso al cliente no
atendido con menor tiempo de servicio.
v Demostración de la corrección:
Sea I=(i1,i2,…,in) una permutación cualquiera de
los naturales {1,2,…,n}.
Si se atiende a los clientes según la secuencia I, el
tiempo total que los clientes están en el sistema
es:
Supongamos que I es tal que es posible encontrar
dos naturales a y b con a<b y tia>tib, es decir, que
el cliente a-ésimo es atendido antes que el
b-ésimo aunque su tiempo de servicio es mayor.
Si se invierten sus posiciones en I se obtiene una
nueva secuencia I’.
T(I) = ti1 + (ti1+ti2) + ((ti1+ti2)+ti3) + ···
= nti1 + (n-1)ti2 + (n-2)ti3 + ···
= (n-k+1)tikΣk=1
n
El problema de la minimiza-
ción del tiempo de espera
72. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 72
Entonces:
Es decir, se puede mejorar cualquier secuencia en
la que un cliente que necesita más tiempo sea
atendido antes que otro que necesita menos.
Las únicas secuencias que no pueden mejorarse,
y por tanto son óptimas, son aquéllas en las que
los clientes están ordenados por tiempos de
servicio decrecientes (todas ellas dan igual
tiempo total). n
v Puede generalizarse a s procesadores.
– Se numeran los clientes de forma que t1≤t2≤⋅⋅⋅≤tn.
– El procesador i, 1≤i≤s, atenderá a los clientes i,
i+s, i+2s, …
T(I’) = (n-a+1)tib + (n-b+1)tia + (n-k+1)tikΣk=1
k≠a,b
n
T(I) - T(I’) = (n-a+1)(tia-tib) + (n-b+1)(tib-tia)
= (b-a)(tia-tib)
> 0
El problema de la minimiza-
ción del tiempo de espera
73. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 73
v Existe una teoría matemática
que sirve de base a los
algoritmos voraces:
Teoría de matroides
v Un matroide es un par M=(S,I) t.q.:
– S es un conjunto finito no vacío.
– I es una familia no vacía de subconjuntos de S,
llamados subconjuntos independientes, t.q. si
B∈I y A⊆B, entonces A∈I.
Por cumplir esta propiedad, I se dice hereditaria
(nótese que el conjunto vacío es necesariamente
un miembro de I).
– Si A∈I, B∈I y |A|<|B|, entonces existe algún
x∈BA t.q. A∪{x}∈I.
Se dice que M satisface la propiedad de
intercambio.
Fundamentos teóricos del
esquema voraz
74. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 74
v Ejemplos de matroides:
– Dada una matriz de números reales, sea S el
conjunto de sus vectores fila, y considerese que
un subconjunto de S es independiente si los
vectores que lo componen son linealmente inde-
pendientes (en el sentido habitual).
Se llama “matroide matricial” y es el primero
que se estudió (H. Whitney, 1935).
– Sea un grafo no dirigido G=(V,A).
Sea MG=(SG,IG), donde:
u SG=A (el conjunto de aristas).
u Si B⊆A, entonces B∈IG si y sólo si B es
acíclico.
Se llama “matroide gráfico” y está muy
relacionado con el cálculo de árboles de
recubrimiento de coste mínimo.
Fundamentos teóricos del
esquema voraz
75. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 75
v Sea M=(S,I) y B∈I. Un elemento x∉B se
dice extensión de B si B∪{x}∈I.
– Ejemplo: en un matroide gráfico MG, si B es un
conjunto independiente de aristas, entonces la
arista a es una extensión de B si y sólo si a no está
en B y la incorporación de a a B no crea un ciclo.
v Si A es un subconjunto independiente
de un matroide M, se dice que A es
maximal si no tiene extensiones.
v Teorema. Todos los subconjuntos
independientes maximales de un
matroide tienen el mismo cardinal.
(Dem.: muy fácil [CLR90].)
– Ejemplo: Dado un grafo no dirigido y conexo G,
todo subconjunto independiente maximal de MG
es un árbol libre con |V|-1 aristas que conecta
todos los vértices de G.
Ese árbol se llama árbol de recubrimiento de G.
Fundamentos teóricos del
esquema voraz
76. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 76
v Un matroide M=(S,I) al que se le asocia
una función que asigna un “peso”
estrictamente positivo w(x) a cada x∈S
se llama matroide ponderado.
La función de peso w se extiende a los
subconjuntos de S mediante la suma:
– Ejemplo: si w(a) denota la longitud de la arista a
en un matroide gráfico MG, entonces w(B) es la
longitud total de todas las aristas del
subconjunto de aristas B.
x∈A
w(A) = ∑ w(x), para todo A⊆S.
Fundamentos teóricos del
esquema voraz
77. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 77
v Voracidad y matroides.
– Es decir, dado un matroide ponderado M=(S,I),
se quiere encontrar un subconjunto A
independiente (i.e., A∈I) tal que w(A) sea
máximo.
– Un subconjunto independiente y de máximo
peso en un matroide ponderado se llama
subconjunto óptimo del matroide.
– Como la función de peso w es positiva, un
subconjunto óptimo siempre es maximal
(i.e., no tiene extensiones, ya que aumentar un
conjunto siempre incrementa su peso).
Muchos de los problemas para
los que un algoritmo voraz cal-
cula la solución óptima pueden
formularse en términos de
“encontrar un subconjunto
independiente de máximo peso
en un matroide ponderado.”
Fundamentos teóricos del
esquema voraz
78. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 78
v Ejemplo: el problema del árbol de
recubrimiento de coste mínimo.
– Sea un grafo no dirigido y conexo G=(V,A) y una
función de longitud w tal que w(a) es la longitud
positiva de la arista a
(llamamos longitudes a las etiquetas del grafo en
lugar de pesos por reservar esta palabra para la
función definida sobre un matroide).
– El problema consiste en encontrar un subconjun-
to de aristas que conecte todos los vértices del
grafo y tenga longitud mínima.
– Considerar MG y la función de peso w’ definida
como: w’(a) = w0-w(a), donde w0 es un valor
mayor que la longitud de todas las aristas.
– En este matroide ponderado, todos los pesos son
positivos y un subconjunto óptimo es
precisamente un árbol de recubrimiento del
grafo original con longitud total mínima.
– Más específicamente, cada subconjunto indepen-
diente maximal B corresponde a un árbol de
recubrimiento, y puesto que
w’(B) = (|V|-1)w0-w(B)
para todo subconjunto independiente maximal B,
el subconjunto independiente que maximiza
w’(B) debe minimizar w(B).
Fundamentos teóricos del
esquema voraz
79. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 79
v Algoritmo voraz de cálculo de un
subconjunto óptimo en un matroide
arbitrario:
{Pre: S y la función indep definen un matroide;
w es una función de peso positiva sobre S}
función voraz(S:conjunto) devuelve conjunto
variable A:conjunto
principio
A:=Ø;
ordenar S por valores no crecientes de w;
para todo x en S tomado en orden
no creciente de w(x) hacer
si indep(A∪{x}) entonces A:=A∪{x} fsi
fpara;
devuelve A
fin
{Post: A es subconjunto óptimo de (S,indep,w)}
{Pre: S y la función indep definen un matroide;
w es una función de peso positiva sobre S}
función voraz(S:conjunto) devuelve conjunto
variable A:conjunto
principio
A:=Ø;
ordenar S por valores no crecientes de w;
para todo x en S tomado en orden
no creciente de w(x) hacer
si indep(A∪{x}) entonces A:=A∪{x} fsi
fpara;
devuelve A
fin
{Post: A es subconjunto óptimo de (S,indep,w)}
Fundamentos teóricos del
esquema voraz
80. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 80
v Eficiencia temporal:
Denotando |S| como n,
u fase de ordenación: Θ(nlog n)
u bucle: Θ(n f(n)), suponiendo que el coste de
la función indep es Θ(f(n))
Total: Θ(nlog n + n f(n))
v Corrección:
Teorema 17.10 en [CLR90, pp. 348-350]
(un par de páginas; sin gran dificultad).
Fundamentos teóricos del
esquema voraz
81. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 81
v Utilidad fundamental:
Dados un problema y una
solución voraz,
para demostrar la corrección de
esa solución basta con
identificar una estructura
de matroide subyacente al
problema
Fundamentos teóricos del
esquema voraz
82. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 82
v Resumen:
– La teoría de matroides no cubre todos los
problemas en los que el esquema voraz calcula la
solución óptima.
– Sin embargo cubre muchos casos interesantes
(por ej., árboles de recubrimiento de coste
mínimo).
– Más aún, se ha demostrado que una estructura es
un matroide si y sólo si el esquema voraz calcula
para ella una solución óptima sea cual sea la
función de peso escogida (la demostración puede
verse en [Koz92, pp. 13-18]).
– La investigación continúa…
Fundamentos teóricos del
esquema voraz
83. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 83
Un problema de planificación
de tareas a plazo fijo
v Se tiene un conjunto S={1,2,…,n} de
tareas de duración unidad.
v En cada instante, sólo se puede realizar
una tarea.
v La tarea i, 1≤i≤n, debe terminarse antes
del instante (o plazo) di, con 1≤di≤n.
v Hay una penalización wi, 1≤i≤n, si la
tarea i no termina antes de su plazo.
v Se trata de encontrar una secuencia de
realización de las tareas que minimice
la penalización total.
84. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 84
v Una tarea en una secuencia se dice
puntual si termina antes de su plazo, y
tardía si lo hace después de su plazo.
v Una secuencia está en forma “puntua-
les primero” si todas las tareas puntua-
les están antes de las tardías.
v Cualquier secuencia puede transfor-
marse en forma puntuales primero.
En efecto, si una tarea puntual x va detrás de una
tarea tardía y, pueden intercambiarse sus
posiciones de forma que x sigue siendo puntual e
y tardía.
v Una secuencia está en forma canónica
si está en forma puntuales primero y
las tareas puntuales están ordenadas
por valores no decrecientes de sus
plazos.
v Cualquier secuencia puede transfor-
marse en forma canónica.
Argumentación similar a la anterior.
Un problema de planificación
de tareas a plazo fijo
85. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 85
v Encontrar una secuencia óptima es en-
contrar un conjunto A de tareas que
sean puntuales en la secuencia óptima.
v Una vez encontrado A, la secuencia se
crea ordenando los elementos de A por
plazos no decrecientes y a continuación
las tareas tardías (en S-A) en cualquier
orden.
v Decimos que un conjunto A de tareas es
independiente si existe una ordenación
de las mismas en la que ninguna es
tardía.
Por ejemplo, el conjunto de tareas puntuales de
una secuencia es un conjunto independiente.
v Denotamos con I el conjunto de todos
los conjuntos independientes de tareas.
Un problema de planificación
de tareas a plazo fijo
86. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 86
v Sea Nt(A), t=1,…,n, el número de tareas
de A cuyo plazo es menor o igual que t.
v Lema. Sea A un conjunto de tareas. Son
equivalentes:
1. A es independiente.
2. Nt(A)≤t, para t=1,…,n.
3. Si las tareas de A se ordenan por plazos no
decrecientes, entonces ninguna tarea es tardía.
Dem.: (1)⇒(2) Si Nt(A)>t para algún t, entonces no
hay forma de construir una secuencia con las
tareas de A de forma que ninguna sea tardía.
(2)⇒(3) El i-ésimo plazo mayor es como mucho i.
Por tanto, ordenando las tareas por plazos no
decrecientes, no hay forma de que alguna tarea
sea tardía.
(3)⇒(1) Trivial. n
v Corolario. La propiedad (2) del lema
anterior sirve para decidir en tiempo
O(|A|) si un conjunto de tareas es
independiente.
Dem.: Ejercicio.
Un problema de planificación
de tareas a plazo fijo
87. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 87
v El problema de minimizar la suma de
penalizaciones de las tareas tardías de
una secuencia es el mismo que el de
maximizar la suma de penalizaciones
de sus tareas puntuales.
v Teorema. Si S es un conjunto de tareas
de duración unidad con penalizaciones
e I es el conjunto de todos los conjuntos
independientes de tareas, entonces (S,I)
es un matroide.
Dem.: Es claro que todo subconjunto de un
conjunto independiente de tareas es también
independiente.
Para demostrar la propiedad del intercambio,
supongamos que B y A son conjuntos
independientes de tareas con |B|>|A|.
Sea k el mayor t tal que Nt(B)≤Nt(A).
Como Nn(B)=|B| y Nn(A)=|A|, se sigue que k<n
y que Nj(B)>Nj(A) para todo j tal que k+1≤j≤n.
Por tanto, B tiene más tareas con plazo k+1 que
A.
Un problema de planificación
de tareas a plazo fijo
88. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 88
Sea x una tarea de BA con plazo k+1.
Sea A’=A∪{x}.
Demostramos ahora que A’ es independiente
usando la propiedad (2) del Lema anterior.
Como A es independiente, Nt(A’)=Nt(A)≤t, para
1≤t≤k.
Como B es independiente, Nt(A’)≤Nt(B)≤t, para
k<t≤n.
Por tanto, A’ es independiente. n
v Corolario. Se puede utilizar un
algoritmo voraz para encontrar un
conjunto independiente de tareas A con
penalización máxima.
v A continuación, se puede crear una
secuencia óptima que tiene como tareas
puntuales las de A.
v Tiempo de ejecución: O(n2)
¿Por qué?
Un problema de planificación
de tareas a plazo fijo
89. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 89
Heurísticas voraces:
Coloreado de grafos
v A veces se utilizan algoritmos voraces a
pesar de que no calculan soluciones
óptimas:
– bien porque el cálculo de una solución óptima es
demasiado costoso,
– bien porque el algoritmo voraz calcula un
solución “subóptima” que resulta suficiente.
v Problema del coloreado de un grafo.
– Sea G=(V,A) un grafo no dirigido cuyos vértices
se desea colorear.
– Se exige que todo par de vértices unidos por una
arista tengan asignados colores diferentes.
– Se pretende emplear el menor número posible de
colores.
1
3
4
2 5
90. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 90
– Algoritmo voraz de coloreado de un grafo:
u escoger inicialmente un color y un vértice
arbitrario como punto de partida;
u tratar de asignarle ese color al mayor
número posible de vértices, respetando la
restricción impuesta (vértices adyacentes
deben tener distinto color);
u escoger otro vértice aún no coloreado y un
color distinto y repetir el proceso hasta
haber coloreado todos los vértices.
– Aplicado al ejemplo anterior, se obtiene la
solución óptima: dos colores.
Heurísticas voraces:
Coloreado de grafos
1
3
4
2 5
91. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 91
– Sin embargo, tomando el mismo grafo pero
ordenando los vértices de otra forma, 1,5,2,3,4, el
algoritmo voraz colorearía 1 y 5 de un color, 2 en
otro, y necesitaría un tercer color para 3 y 4.
– Por tanto es un algoritmo heurístico que tiene
la posibilidad, pero no la certeza, de encontrar
la solución óptima.
– Todos los algoritmos exactos conocidos para el
problema del coloreado de un grafo emplean un
tiempo exponencial, de ahí la utilidad de la
heurística voraz.
Heurísticas voraces:
Coloreado de grafos
3
51
4
2
92. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 92
Heurísticas voraces: El proble-
ma del viajante de comercio
v El problema del viajante
de comercio consiste en
encontrar un recorrido de
longitud mínima para un
viajante que tiene que
visitar varias ciudades
y volver al punto de
partida, conocida la
distancia existente entre
cada dos ciudades.
v Se lo plantean, por ejemplo, las
compañías de teléfonos para elegir la
ruta que deben seguir los recolectores
de dinero de las cabinas públicas
instaladas en una ciudad.
93. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 93
v Ejemplo:
Cinco cabinas de teléfonos, b, c, d, e, f, para las
que se conocen sus coordenadas relativas a la
central telefónica, a, desde la que parten los
recolectores y a donde deben regresar al
terminar, y se supone que la distancia entre cada
dos viene dada por la línea recta.
Heurísticas voraces: El proble-
ma del viajante de comercio
a
b
c d
e
f
(1,7)
(4,3)
(0,0)
(15,7)
(15,4)
(18,0)
a
b 5
c 7,07 5
d 16,55 11,70 14
e 15,52 11,05 14,32 3
f 18 14,32 18,38 7,6 5
distan. a b c d e f
94. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 94
v El algoritmo de fuerza bruta para
resolver el problema consiste en
intentar todas las posibilidades, es
decir, calcular las longitudes de todos
los recorridos posibles, y seleccionar la
de longitud mínima (veremos una
solución algo mejor mediante
programación dinámica).
v Obviamente, el coste de tal algoritmo
crece exponencialmente con el número
de puntos a visitar.
v En el ejemplo anterior, la solución viene
dada por el siguiente recorrido
(en realidad dos recorridos, pues ambos
sentidos de marcha son posibles)
de longitud 48,39:
Heurísticas voraces: El proble-
ma del viajante de comercio
a
b
c d
e
f
95. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 95
v Heurística voraz:
Ir seleccionando parejas de puntos que serán
visitados de forma consecutiva:
– se seleccionará primero aquella pareja de puntos
entre los que la distancia sea mínima;
– a continuación, se selecciona la siguiente pareja
separada con una distancia mínima siempre que
esta nueva elección no haga que:
u se visite un punto dos veces o más (es decir,
que el punto aparezca tres o más veces en
las parejas de puntos seleccionadas), o
u se cierre un recorrido antes de haber
visitado todos los puntos.
De esta forma, si hay que visitar n puntos
(incluido el origen), se selecciona un conjunto de
n parejas de puntos (que serán visitados de
forma consecutiva) y la solución consiste en
reordenar todas esas parejas de forma que
constituyan un recorrido.
Heurísticas voraces: El proble-
ma del viajante de comercio
96. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 96
v En el ejemplo anterior:
– Las parejas ordenadas por distancia entre sus
puntos son: (d,e), (a,b), (b,c), (e,f), (a,c), (d,f),
(b,e), (b,d), (c,d), (b,f), (c,e), (a,e), (a,d), (a,f) y (c,f).
– Se selecciona primero la pareja (d,e) pues la
distancia entre ambos puntos es mínima
(3 unidades).
(d,e)
– Después se seleccionan las parejas (a,b), (b,c) y
(e,f). La distancia es para todas ellas igual
(5 unidades).
(d,e), (a,b), (b,c), (e,f)
– La siguiente pareja de distancia mínima es (a,c),
con longitud 7,07.
Sin embargo, esta pareja cierra un recorrido junto
con otras dos ya seleccionadas, (b,c) y (a,b), por lo
que se descarta.
– La siguiente pareja es (d,f) y se descarta también
por motivos similares.
Heurísticas voraces: El proble-
ma del viajante de comercio
97. J. Campos - C.P.S. Esquemas algorítmicos - Algoritmos voraces Pág. 97
(d,e), (a,b), (b,c), (e,f)
– La siguiente es la pareja (b,e), pero debe
rechazarse también porque su inclusión haría
visitar más de una vez los puntos b y e.
– La pareja (b,d) se rechaza por motivos similares
(el punto b habría que visitarlo dos veces).
– La siguiente pareja es (c,d), y se selecciona.
(d,e), (a,b), (b,c), (e,f), (c,d)
– Las parejas (b,f), (c,e), (a,e) y (a,d) no son
aceptables.
– Finalmente, la pareja (a,f) cierra el recorrido:
– Este recorrido no es el óptimo pues su longitud
es de 50 unidades.
No obstante, es el cuarto mejor recorrido de entre
los sesenta (esencialmente distintos) posibles y es
más costoso que el óptimo en sólo un 3,3%.
Heurísticas voraces: El proble-
ma del viajante de comercio
a
b
c d
e
f