Algoritmos y Estructuras de Datos II

Documentos relacionados
Ruta más Corta con una sóla Fuente de Inicio (Single-Source Shortest Paths) DR. JESÚS A. GONZÁLEZ BERNAL CIENCIAS COMPUTACIONALES INAOE

Ejemplo: El problema de la mochila. Algoritmos golosos. Algoritmos y Estructuras de Datos III. Segundo cuatrimestre 2013

1. Conceptos básicos sobre el problema en cuestión y cuestiones afines. 2. Formulación de los correspondientes algoritmos y su pseudocódigo.

El TAD Grafo. El TAD Grafo

Algoritmos. Diseño de algoritmos por inducción. Alberto Valderruten. Dept. de Computación, Universidade da Coruña

Materia: Matemáticas de 4to año. Tema: Logaritmos naturales y base 10. Marco Teórico

greedy (adj): avaricioso, voraz, ávido, codicioso, glotón

Métodos para escribir algoritmos: Diagramas de Flujo y pseudocódigo

Algoritmos sobre Grafos

Tema 2 Introducción a la Programación en C.

Planificaciones Algoritmos y Programación II. Docente responsable: CALVO PATRICIA MABEL. 1 de 6

3. Técnicas de diseño de algoritmos

TEMA 1.- POLINOMIOS Y FRACCIONES ALGEBRAICAS

Práctica N o 8 Desigualdades Válidas - Algoritmos de Planos de Corte - Algoritmos Branch & Cut

Apuntes de Grafos. 1. Definiciones

Algebra lineal y conjuntos convexos

Algoritmos y Estructuras de Datos II

Normalmente usamos la palabra "combinación" descuidadamente, sin pensar en si el orden de las cosas es importante. En otras palabras:

Control de Flujo. Estructuras de Control! Experiencia Educativa de Algorítmica CONTROL DE FLUJO

PROGRAMACIÓN DINÁMICA. Idalia Flores

MÉTODO DEL DUAL (TEORIA DE DUALIDAD)

Tema: Los Grafos y su importancia para la optimización de redes.

Estructuras de Datos. Estructuras de Datos para Conjuntos Disjuntos

Bases Matemáticas para la Educación Primaria. Guía de Estudio. Tema 3: Números racionales. Parte I: Fracciones y razones Números racionales

Fundamentos de Programación. Flujo de Control I: Estructuras selectivas

UNIDAD 1: NÚMEROS NATURALES OBJETIVOS

Conjunto de Números Racionales.

Fracciones y fractales

Algoritmos: Diseño de algoritmos por inducción

lasmatemáticas.eu Pedro Castro Ortega materiales de matemáticas

Materia: Matemática de 5to Tema: Método de Cramer. Marco Teórico

Análisis de algoritmos

Fundamentos de Ciencias de la Computación Trabajo Práctico N 2 Lenguajes Libres del Contexto y Sensibles al Contexto Segundo Cuatrimestre de 2002

UNIDAD DE APRENDIZAJE I

Algoritmos y solución de problemas. Fundamentos de Programación Otoño 2008 Mtro. Luis Eduardo Pérez Bernal

Minería de Datos. Árboles de Decisión. Fac. Ciencias Ing. Informática Otoño de Dept. Matesco, Universidad de Cantabria

Algoritmos y Estructuras de Datos II

Unidad II. 2.1 Concepto de variable, función, dominio, condominio y recorrido de una función.

C a l ses P P y y NP C a l se P C a l se N P N P [No N n o -De D te t rmin i i n s i ti t c i Polynomial-tim i e]

Jesús Getán y Eva Boj. Marzo de 2014

Soluciones básicas factibles y vértices Introducción al método símplex. Investigación Operativa, Grado en Estadística y Empresa, 2011/12

Algoritmos y Estructuras de Datos Curso 06/07. Ejercicios

LAS CIENCIAS DE LA PLANIFICACIÓN

Descripción en VHDL de circuitos aritméticos para campos finitos GF(2 m )

Árboles Filogenéticos. BT7412, CC5702 Bioinformática Diego Arroyuelo. 2 de noviembre de 2010

Ejercicios. Arquitectura de Computadoras. José Garzía

PROGRAMACION CONCURRENTE Y DISTRIBUIDA

INSTITUTO DE FORMACIÓN DOCENTE DE CANELONES DIVISIBILIDAD

Semana03[1/17] Funciones. 16 de marzo de Funciones

PLANIFICACIÓN ANUAL. SUBSECTOR: Matemática HORAS SEMANALES: NIVEL: 2 Medio. Título Subtítulo

UNIDAD DE APRENDIZAJE II

Aritmética entera. AMD Grado en Ingeniería Informática. AMD Grado en Ingeniería Informática (UM) Aritmética entera 1 / 15

En una recta numérica el punto que representa el cero recibe el nombre de origen.

Tema 3: Problemas de Satisfacción de Restricciones

Es un conjunto de objetos llamados vértices o nodos unidos por enlaces llamados aristas o arcos, que permiten representar relaciones binarias entre

Estatutos de Control C# Estatutos de Decisión (Selección)

T7. PROGRAMACIÓN LINEAL

MATEMATICA DISCRETA II-2007 Códigos (matriz de chequeo)

UNIDAD 6: SISTEMAS DE ECUACIONES

EL PROCESO DE DISEÑO DEL SOFTWARE

Sistemas de ecuaciones lineales

Expresiones Regulares y Derivadas Formales

TEMA 1 NÚMEROS NATURALES

FUNDAMENTOS DEL ÁLGEBRA. Folleto De Trabajo Para La Clase ECUACIONES LINEALES EN DOS VARIABLES

Relaciones. Estructuras Discretas. Relaciones. Relaciones en un Conjunto. Propiedades de Relaciones en A Reflexividad

Algoritmos Genéticos. Introducción a la Robótica Inteligente. Álvaro Gutiérrez 20 de abril de

Prof. Pérez Rivas Lisbeth Carolina

Programación. Tema 8: Tablas Hash. Apuntes elaborados por: Eduardo Quevedo, Aaron Asencio y Raquel López Revisado por: Javier Miranda el????

Números reales Conceptos básicos Algunas propiedades

Visión artificial y Robótica Modelos de movimiento y mapas. Depto. de Ciencia de la Computación e Inteligencia Artificial


IN34A - Optimización

Ecuaciones Diofánticas

SECUENCIA DIDÁCTICA GEOMETRÍA RAZONES TRIGONOMÉTRICAS

Introducción a la Teoría de Grafos

El Teorema Fundamental del Álgebra

Programación con Restricciones Constraint Programming

Programación II. Mario Aldea Rivas Programación II 05/04/11 1. Tema 5. Algoritmos voraces, heurísticos y aproximados

Capítulo 2: Inducción y recursión Clase 2: El principio de Inducción Fuerte

Un grafo G es un par (V,E) donde V es un conjunto (llamado conjunto de vértices) y E un subconjunto de VxV (conjunto de aristas).

Aplicación de la inteligencia artificial a la resolución del problema de asignación de estudiantes del departamento de PDI

Matemáticas Universitarias

RADIO =? R AREA = : πr 2 < CIRC = : 2 πr

UNIDAD 10: ECUACIONES DE SEGUNDO GRADO.

Identificación. Propuesta didáctica: unidad Didáctica. Resumen: QUINTO de primaria matemática. Nivel: Primario. Grado: Quinto

<tipo> Tipo de dato de los elementos del vector

Tema 3 Álgebra Matemáticas I 1º Bachillerato. 1

CONTENIDOS Y APRENDIZAJES ESPERADOS DOCENTE DE AULA: SR. BERNARDO ORTEGA

Práctica 2: Análisis de sensibilidad e Interpretación Gráfica

Tema 3: El Método Simplex. Algoritmo de las Dos Fases.

EJERCICIO DE MAXIMIZACION

Complejidad - Problemas NP-Completos. Algoritmos y Estructuras de Datos III

1.1 Las pruebas en el desarrollo de software tradicional

Contenido: Solución algebraica a los problemas de programación lineal con el método simplex.

Matemáticas financieras

Transcripción:

27 de mayo de 2013

Clase de hoy 1 Repaso Divide y vencerás Algoritmos voraces 2 3

Divide y vencerás Algoritmos voraces Repaso cómo vs. qué 3 partes 1 análisis de algoritmos 2 tipos de datos 3 técnicas de resolución de problemas divide y vencerás algoritmos voraces backtracking programación dinámica recorrida de grafos

Divide y vencerás Algoritmos voraces Divide y vencerás Ordenación por intercalación, O(n log n). Ordenación rápida, O(n log n) en la práctica. Búsqueda binaria, O(log n). Exponenciación, O(log n) número de multiplicaciones (n es el exponente). Multiplicación de grandes números, O(n log 2 3 ) donde n es el número de dígitos.

Divide y vencerás Algoritmos voraces Algoritmos voraces O(n) donde n es el número de denominaciones si están ordenadas. no anda para cualquier conjunto de denominaciones O(n) donde n es el número de objetos si están ordenados según sus cocientes v i /w i. sólo anda para objetos fraccionables Problema del árbol generador de costo mínimo Prim es O( V 2 ) donde V es el conjunto de vértices. Se puede mejorar con implementaciones ingeniosas. Kruskal es O( A log V ) donde A es el conjunto de aristas. Boruvka es O( A log V ). Problema del camino de costo mínimo Dijkstra es O( V 2 ).

fun greedy(c) ret S {C: conjunto de candidatos, S: solución a construir} S:= {} do S no es solución c:= seleccionar de C C:= C-{c} if S {c} es factible S:= S {c} fi od end fun Ser solución y ser factible no tienen en cuenta optimalidad. Optimalidad depende totalmente del criterio de selección.

A veces no hay un criterio de selección que garantice optimalidad. Por ejemplo: para conjuntos de denominaciones arbitrarios. para objetos no fraccionables. En este caso, si se elige un fragmento de solución puede ser necesario volver hacia atrás (backtrack) sobre esa elección e intentar otro fragmento. En la práctica, estamos hablando de considerar todas las selecciones posibles e intentar cada una de ellas para saber cuál de ellas conduce a la solución óptima.

Sean d 1, d 2,..., d n las denominaciones de las monedas (todas mayores que 0), no se asume que estén ordenadas, se dispone de una cantidad infinita de monedas de cada denominación, se desea pagar un monto k de manera exacta, utilizando el menor número de monedas posibles. Vimos que el algoritmo voraz puede no funcionar para ciertos conjuntos de denominaciones. Daremos un algoritmo consistente en considerar todas las combinaciones de monedas posibles.

Simplificación y generalización Simplificamos el problema: sólo nos interesa por ahora hallar el menor número de monedas necesario, no nos interesa saber cuáles son esas monedas. Generalizamos el problema: Sean 0 i n y 0 j k, definimos m(i, j) = menor número de monedas necesarias para pagar exactamente el monto j con denominaciones d 1, d 2,..., d i. La solución del problema original se obtiene calculando m(n, k).

Definiendo m(i, j) Caso j = 0 Repaso Recordemos que m(i, j) = menor número de monedas necesarias para pagar exactamente el monto j con denominaciones d 1, d 2,..., d i. m(i, 0) = 0

Definiendo m(i, j) Caso j > 0 y i = 0 Repaso Recordemos que m(i, j) = menor número de monedas necesarias para pagar exactamente el monto j con denominaciones d 1, d 2,..., d i. m(i, 0) = 0, j > 0 m(0, j) =, ya que no hay manera posible de pagar el monto

Definiendo m(i, j) Caso i > 0 y d i > j > 0 Repaso Recordemos que m(i, j) = menor número de monedas necesarias para pagar exactamente el monto j con denominaciones d 1, d 2,..., d i. m(i, 0) = 0, j > 0 m(0, j) =, i > 0 d i > j > 0 m(i, j) = m(i 1, j), ya que no se pueden usar monedas de denominación d i, es como si no estuvieran disponibles

Definiendo m(i, j) Caso i > 0 y j d i Repaso Recordemos que m(i, j) = menor número de monedas necesarias para pagar exactamente el monto j con denominaciones d 1, d 2,..., d i. m(i, 0) = 0, j > 0 m(0, j) =, i > 0 d i > j > 0 m(i, j) = m(i 1, j), si j d i hay dos posibilidades la solución óptima no usa monedas de denominación d i m(i, j) = m(i 1, j) la solución óptima usa una o más monedas de denominación d i m(i, j) = 1 + m(i, j d i )

Definición recursiva de m(i, j) Conclusión de estas últimas filminas: 0 j = 0 j > 0 i = 0 m(i, j) = m(i 1, j) d i > j > 0 i > 0 min(m(i 1, j), 1 + m(i, j d i )) j d i > 0 i > 0

Otras posibles definiciones que usan backtracking Considerando el número exacto de monedas de denominación d i 0 j = 0 m(i, j) = j > 0 i = 0 min q {0,1,...,j di }(q + m(i 1, j q d i )) j > 0 i > 0 Acá estamos considerando la posibilidad de usar 0 monedas (q = 0) de denominación d i, 1 moneda (q = 1) de denominación d i, etc. De todas esas posibilidades se elige la que minimice el número total de monedas.

Otras posibles definiciones que usan backtracking Considerando cuál moneda de las disponibles se usa m(i, j) = { 0 j = 0 1 + min i {1,2,...,i} d i j(m(i, j d i )) j > 0 Acá estamos considerando la posibilidad de usar 1 moneda de denominación d i (i = i), 1 moneda de denominación d i 1 (i = i 1), etc. De todas esas posibilidades se elige la que minimice el número total de monedas. Para evitar cálculos repetidos, se restringe la búsqueda a monedas de índice menor a los ya utilizados.

Primera definición recursiva de m(i, j) 0 j = 0 j > 0 i = 0 m(i, j) = m(i 1, j) d i > j > 0 i > 0 min(m(i 1, j), 1 + m(i, j d i )) j d i > 0 i > 0

Primera solución, ahora en pseudocódigo fun cambio(d:array[1..n] of nat, i,j: nat) ret r: nat if j=0 then r:= 0 else if i = 0 then r:= else if d[i] > j then r:= cambio(d,i-1,j) else r:= min(cambio(d,i-1,j),1+cambio(d,i,j-d[i])) fi fi fi end fun

Segunda definición recursiva de m(i, j) 0 j = 0 m(i, j) = j > 0 i = 0 min q {0,1,...,j di }(q + m(i 1, j q d i )) j > 0 i > 0

Segunda solución, ahora en pseudocódigo fun cambio(d:array[1..n] of nat, i,j: nat) ret r: nat if j=0 then r:= 0 else if i = 0 then r:= else r:= cambio(d,i-1,j) for q:= 1 to j d i do r:= min(r,q+cambio(d,i-1,j-q*d[i])) od fi fi end fun

Tercera definición recursiva de m(i, j) m(i, j) = { 0 j = 0 1 + min i {1,2,...,i} d i j(m(i, j d i )) j > 0

Tercera solución, ahora en pseudocódigo fun cambio(d:array[1..n] of nat, i,j: nat) ret r: nat if j=0 then r:= 0 else r:= for i := 1 to i do if d[i ] j then r:= min(r,cambio(d,i,j-d[i ])) fi od r:= r + 1 fi end fun

Otras posibilidades Repaso No son éstas las únicas formas de resolver el problema usando backtracking. Podríamos definir, por ejemplo, m(i, j) = menor número de monedas necesarias para pagar exactamente el monto j con denominaciones d i+1, d i+2,..., d n. Obtendríamos, entre otras posibles definiciones recursivas, 0 j = 0 j > 0 i = n m(i, j) = m(i + 1, j) d i > j > 0 i < n min(m(i + 1, j), 1 + m(i, j d i )) j d i > 0 i < n Para resolver el problema original se calcula m(0, k).

Primera solución, ahora en pseudocódigo Queremos las monedas! fun cambio(d:array[1..n] of nat, i,j: nat, s: list of nat) ret r: list of nat if j=0 then r:= s else if i = 0 then r:= an list else if d[i] > j then r:= cambio(d,i-1,j,s) else if cambio(d,i-1,j,s) cambio(d,i,j-d[i],s d[i]) then r:= cambio(d,i-1,j,s) else r:= cambio(d,i,j-d[i],s d[i]) fi fi fi fi x es la longitud de x end fun llamada principal: cambio(d,n,k,[])

Tenemos una mochila de capacidad W. Tenemos n objetos no fraccionables de valor v 1, v 2,..., v n y peso w 1, w 2,..., w n. Se quiere encontrar la mejor selección de objetos para llevar en la mochila. Por mejor selección se entiende aquélla que totaliza el mayor valor posible sin que su peso exceda la capacidad W de la mochila.

Simplificación y generalización Simplificamos el problema: sólo nos interesa por ahora hallar el mayor valor posible sin exceder la capacidad de la mochila, no nos interesa saber cuáles son los objetos que alcanzan ese máximo. Generalizamos el problema: Sean 0 i n y 0 j W, definimos m(i, j) = mayor valor alcanzable sin exceder la capacidad j con objetos 1, 2,..., i. La solución del problema original se obtiene calculando m(n, W ).

Definición recursiva de m(i, j) 0 j = 0 0 j > 0 i = 0 m(i, j) = m(i 1, j) w i > j > 0 i > 0 max(m(i 1, j), v i + m(i 1, j w i )) j w i > 0 i > 0

Otras posibilidades Repaso Ofrece las mismas variantes que en el problema de la moneda, el pasaje a pseudocódigo es similar, la incorporación de información con los objetos que van en la mochila es también parecido (un poco más complicado que para el problema de las monedas).

Problema del camino de costo mínimo Entre todo par de vértices Tenemos un grafo dirigido G = (V, A), con costos no negativos en las aristas, se quiere encontrar, para cada par de vértices, el camino de menor costo que los une. Se asume V = {1,..., n}

Simplificación y generalización Simplificamos el problema: sólo nos interesa por ahora hallar el costo de cada uno de los caminos de costo mínimo. no nos interesa saber cuáles son los caminos que alcanzan ese mínimo. Generalizamos el problema: Sean 1 i, j n y 0 k n, definimos m k (i, j) = menor costo posible para caminos de i a j cuyos vértices intermedios se encuentran en el conjunto {1,...,k}. La solución del problema original se obtiene calculando m n (i, j) para el par i (origen) y j (destino) que se desea.

Definición recursiva de m k (i, j) m k (i, j) = { L[i, j] k = 0 min(m k 1 (i, j), m k 1 (i, k) + m k 1 (k, j)) k 1 donde L[i, j] es el costo de la arista que va de i a j, o infinito si no hay tal arista.

Hemos visto soluciones a tres problemas. En general, muy ineficiente. Por ejemplo, si queremos pagar el monto 90 con nuestros billetes con denominaciones 1, 5 y 10, m(3,90) llama a m(2,90) y m(3,80), m(2,90) llama a m(1,90) y m(2,85), m(2,85) llama a m(1,85) y m(2,80), m(3,80) llama a m(2,80) y m(3,70). Se ve que m(2,80) se calcula 2 veces. y muchos otros llamados se repiten, incluso varias veces. Esto vuelve los algoritmos exponenciales.