Técnicas Algorítmicas Gonzalo Sainz-Trápaga (GomoX) Charlas PC++ 2008 www.pcmasmas.com 26 de Julio de 2008
Problemas Técnicas exactas Técnicas aproximadas Temas Problemas Técnicas exactas Técnicas aproximadas
Problemas
De decisión ¿183287 es primo? ¿Cuál es el mínimo de la secuencia [7,8,32]?
Elegir o proponer una solución. De optimización Hallar el camino más corto entre Buenos Aires y Beijing Ordenar la secuencia: [1,9,34,-2,6,28] Elegir o proponer una solución.
Técnicas Exactas
Fuerza Bruta Probar todas las opciones.
Fuerza Bruta Se recorre todo el universo de soluciones posibles. for cand in generarCandidatos(): if esSolucion(cand): return cand
Ordenar por fuerza bruta: for p in permutaciones(secuencia): if estaOrdenado(p): return p
Fuerza Bruta Limitaciones Usos reales
Backtracking Probar todas las opciones, de forma más inteligente.
Backtracking Orden!
Ordenar la secuencia [3,1,2]: Backtracking Ordenar la secuencia [3,1,2]:
Backtracking Podas Recursión
Backtracking Limitaciones Usos reales
Divide & Conquer “Vamos por partes” - Jack el destripador
Divide & Conquer “Dividir” “Conquistar” “Combinar”
Divide & Conquer Merge sort: def mergesort(l): m1 = l[0:len(l)/2] m2 = l[len(l)/2:len(l)] return combinar(mergesort(m1), mergesort(m2))
Divide & Conquer Recursión Paralelismo
Divide & Conquer Usos reales Limitaciones
Programación Dinámica “Usar COBOL arruina el cerebro” - Edsger Dijkstra
Programación Dinámica Subestructura Óptima Recursión
Programación Dinámica Fibonacci: def fibo(n): if n == 1 or n == 2: return 1 else: return fibo(n-1) + fibo(n-2)
fibo(n) = fibo(n-1) + fibo(n-2) Programación Dinámica fibo(n) = fibo(n-1) + fibo(n-2) fibo(n-2) + fibo(n-3) fibo(n-3) + fibo(n-4) fibo(n-4) + fibo(n-5)
Programación Dinámica Solapamiento A B
Programación Dinámica “Top-down” “Bottom-up”
Programación Dinámica Fibonacci (top down): tabla = {} def fibo(n): if n == 1 or n == 2: return 1 else: if n in tabla: return tabla[n] res = fibo(n-1) + fibo(n-2) tabla[n] = res return res
Programación Dinámica Fibonacci (bottom up): tabla = {} def fibo(n): if n == 1 or n == 2: return 1 else: tabla[1] = fibo(1) tabla[2] = fibo(2) for i in 3…n-1: tabla[i] = tabla[i-1] + tabla[i-2] return tabla[n-1] + tabla[n-2]
Programación Dinámica Fibonacci (bottom up 2.0): def fibo(n): if n == 1 or n == 2: return 1 else: t1 = fibo(1) t2 = fibo(2) for i in 3…n-1: tmp = t2 t2 = t1 + t2 t1 = tmp return t1 + t2
Programación Dinámica Usos reales Limitaciones
Programación Lineal
Programación Lineal Ecuaciones lineales SIMPLEX Programación entera
Técnicas Aproximadas
"La mayor deficiencia de la raza humana es nuestra incapacidad para comprender la función exponencial." - Albert Bartlett
Heurísticas
Metaheurísticas
Algoritmos Golosos
Algoritmos golosos Usos Limitaciones
Taboo Search
Algoritmos Genéticos - Charles Darwin
Algoritmos Genéticos Algoritmo genético: generacion = 0 poblacion = generarIndividuosAleatorios() while(generacion < 5000): padres = poblacion.tomarAlgunos() poblacion.agregar(padres.procrear()) poblacion.mutarAlgunos() poblacion.matarAlgunos() generacion++ poblacion.sort(aptitud) machoAlfa = poblacion[0] return machoAlfa
Algoritmos Genéticos Usos Parametrización
Otras metaheurísticas GRASP Colonias de hormigas Redes neuronales
Problemas de las Metaheurísticas Confiabilidad Parametrización
Más opciones! Algoritmos aproximados Algoritmos híbridos
Esta charla fue traída a ustedes por cortesía de Lotux Neon.
¿Preguntas?
Fin.